Ansible для создания пользователей и назначения их в определенную группу на основе переменных - PullRequest
0 голосов
/ 17 января 2020

Гуру, я изучаю ansible и пытаюсь понять, как можно использовать переменные, я сталкивался с тем, что пишу ниже книгу, но не понимаю, как назначить определенную группу конкретным пользователям на основе переменных, которые я определили в игре и пользователей, и группы в vars

. Ниже приведена игра, в которой я хочу создать пользователей anika и rigved и хочу назначить их группе docker, в то время как * Для 1007 * и eshant должна быть назначена группа test.

У меня пока нет идеи достичь этого. Однако на данный момент во время работы он создает пользователей и назначает обе группы всем пользователям.

$ cat nested_playbook-1.yml
---
- name: testing nested play
  hosts: localhost
  vars:
    users:
      - anika
      - rigved
      - ayush
      - eshant
    grps:
      - docker
      - test
  tasks:
    - name: make users members of groups
      user:
        name: "{{ item[0] }}"
        state: present
        groups: "{{ item[0] }}"
      with_nested:
        - "{{ users }}"
        - "{{ grps }}"

1 Ответ

1 голос
/ 17 января 2020

То, как вы структурировали свои данные, не показывает никакой связи между пользователями и группами. Один из вариантов - структурировать его следующим образом:

grps:
  - name: docker
    users:
      - anika
      - rigved
  - name: test
    users:
      - ayush
      - eshant

С этой структурой вы можете l oop over grps, используя фильтр subelements, например:

---
- name: testing nested play
  gather_facts: false
  hosts: localhost
  vars:
    grps:
      - name: docker
        users:
          - anika
          - rigved
      - name: test
        users:
          - ayush
          - eshant
  tasks:
    - debug:
        msg:
          user:
            name: "{{ item.1 }}"
            state: present
            groups: "{{ item.0.name }}"
      loop: "{{ grps|subelements('users') }}"
      loop_control:
        label: "{{ item.1 }}"

Фильтр subelements - это способ создания «вложенного l oop»: он выполняет итерации по каждому члену ключа 'users' для каждой группы в grps. Во время каждой итерации l oop, item является 2-кортежем, в котором первый элемент является соответствующим элементом из grps, а второй элемент выполняет итерацию по ключу users для этого элемента. Другими словами, вы заканчиваете итерацией по этому списку:

  • [{'name': 'docker', 'users': ['anika', 'rigved']}, anika}
  • [{'name': 'docker', 'users': ['anika', 'rigved']}, rigved}
  • [{'name': 'test', 'users': ['ayush', 'eshant']}, ayush}
  • [{'name': 'test', 'users': ['ayush', 'eshant']}, eshant}

Таким образом, в пределах l oop, item.0 относится к самой записи группы (и, таким образом, item.0.name является именем группы), а item.1 относится к пользователю.

PLAY [testing nested play] *******************************************************************

TASK [debug] *********************************************************************************
ok: [localhost] => (item=anika) => {
    "msg": {
        "user": {
            "groups": "docker",
            "name": "anika",
            "state": "present"
        }
    }
}
ok: [localhost] => (item=rigved) => {
    "msg": {
        "user": {
            "groups": "docker",
            "name": "rigved",
            "state": "present"
        }
    }
}
ok: [localhost] => (item=ayush) => {
    "msg": {
        "user": {
            "groups": "test",
            "name": "ayush",
            "state": "present"
        }
    }
}
ok: [localhost] => (item=eshant) => {
    "msg": {
        "user": {
            "groups": "test",
            "name": "eshant",
            "state": "present"
        }
    }
}

PLAY RECAP ***********************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

В качестве альтернативы вы можете структурировать свои данные следующим образом:

users:
  - name: anika
    group: docker
  - name: rigved
    group: docker
  - name: ayush
    group: docker
  - name: eshant
    group: docker

Вы можете просто использовать l oop для обработки этой структуры:

---
- name: testing nested play
  gather_facts: false
  hosts: localhost
  vars:
    users:
      - name: anika
        group: docker
      - name: rigved
        group: docker
      - name: ayush
        group: docker
      - name: eshant
        group: docker
  tasks:
    - debug:
        msg:
          user:
            name: "{{ item.name }}"
            state: present
            groups: "{{ item.group }}"
      loop: "{{ users }}"
      loop_control:
        label: "{{ item.name }}"


Обратите внимание, что в обоих приведенных выше примерах я использую loop_control в задачах, чтобы установить метку l oop и сделать вывод более приятным. Вы можете удалить loop_control из вышеперечисленных задач без ущерба для их работы.

...