Ansible playbook l oop with_items - PullRequest
       33

Ansible playbook l oop with_items

1 голос
/ 13 апреля 2020

Мне нужно обновить sudoers.d несколько пользовательских файлов с несколькими строками / командами, используя ansible playbook

users.yml

user1:
   - Line1111
   - Line2222
   - Line3333

user2:
   - Line4444
   - Line5555
   - Line6666

main.yml

- hosts: "{{ host_group }}"
  vars_files:
    - ../users.yml

  tasks:

       - name: Add user "user1" to sudoers.d
      lineinfile:
        path: /etc/sudoers.d/user1
        line: '{{ item }}'
        state: present
        mode: 0440
        create: yes
        validate: 'visudo -cf %s'
      with_items:
          - "{{ user1 }}"

Вышеупомянутый работает только для user1 ..

Если я хочу также включить user2 -> Как изменить имя файла: путь: /etc/sudoers.d/user1

Я попробовал ниже и он не работает :

Передача под пользователями в качестве переменной в main.yml во время работы

users:
   - "user1"
   - "user2"



- name: Add user "{{users}}" to sudoers.d
  lineinfile:
    path: /etc/sudoers.d/{{users}}
    line: '{{ item }}'
    state: present
    mode: 0440
    create: yes
    validate: 'visudo -cf %s'
  with_items:
      - "{{ users }}"

Итак, в основном я хочу передать пользователям переменную {{users}} как user1 и user2 и хотел использовать строки для каждого пользователя из users.yml и добавить его в соответствующие пользовательские файлы (/etc/sudoers.d/user1 и /etc/sudoers.d/user2).

Так что /etc/sudoers.d/user1 должно выглядеть как

Line1111
Line2222
Line3333

, а /etc/sudoers.d/user2 должно выглядеть как

Line4444
Line5555
Line6666

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020
cat users.yml
---
users:
  - user1:
    filename: user1sudoers
    args:
      - Line1111
      - Line2222
      - Line3333
  - user2:
    filename: user2sudoers
    args:
      - Line4444
      - Line5555
      - Line6666

Я использую шаблон здесь вместо lineinfile

---
cat sudoers.j2
{% if item.args is defined and item.args %}
{%     for arg in item.args %}
{{ arg }}
{%     endfor %}
{% endif %}

содержимое задачи

---
- hosts: localhost
  vars_files: ./users.yml
  tasks:
    - name: sync sudoers.j2 to localhost
      template:
        src: sudoers.j2
        dest: "/tmp/{{ item.filename }}"
      loop: "{{ users_list }}"
      when: "users_list is defined and users_list"

после запуска task.yml, создайте два файла в каталоге / tmp.

cat /tmp/user1sudoers
Line1111
Line2222
Line3333

cat /tmp/user2sudoers
Line4444
Line5555
Line6666
0 голосов
/ 14 апреля 2020

Я попробовал следующее для users.yml

users: 
    - user1: 
          - "Line1111" 
          - "Line2222" 
          - "Line3333" 
    - user2: 
          - "Line4444" 
          - "Line5555"

, а также main.yml

- name: Add user "wasadmin" to sudo avsrelmgmt 
      lineinfile:  ```
        path: /etc/sudoers.d/"{{ users }}"  
        line: '{{ item}}'  
        state: present  
        mode: 0440  
        create: yes  
        validate: 'visudo -cf %s'  
      with_items:  
        - "{{ users }}"

Вышеприведенная строка path: /etc/sudoers.d/ " {{users}} " указано создание папок с именем (" - user1: - "Line1111")

0 голосов
/ 14 апреля 2020

Попробуйте добавить кавычки:

users:
   - "user1"
   - "user2"

- name: "Add user {{users}} to sudoers.d"
  lineinfile:
    path: "/etc/sudoers.d/{{users}}"
    line: "{{ item }}"
    state: present
    mode: 0440
    create: yes
    validate: 'visudo -cf %s'
  with_items:
      - "{{ users }}"

Согласно Ansible Документация об использовании переменных:

Синтаксис YAML требует, чтобы при запуске значение {{ foo }} вы заключаете в кавычки всю строку, так как он хочет быть уверен, что вы не пытаетесь запустить словарь YAML. Это описано в документации Синтаксис YAML .

Это не сработает:

- hosts: app_servers
  vars:
      app_path: {{ base_path }}/22

Сделайте так, и все будет в порядке:

- hosts: app_servers
  vars:
       app_path: "{{ base_path }}/22"
...