То, как вы структурировали свои данные, не показывает никакой связи между пользователями и группами. Один из вариантов - структурировать его следующим образом:
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
из вышеперечисленных задач без ущерба для их работы.