У меня есть список пользовательских словарей, каждый из которых содержит имя пользователя, gecos и т. Д., А также список словарей групп, каждый из которых содержит список членов группы. Мне нужна задача Ansible для перебора только тех записей списка пользователей, которые соответствуют списку участников определенной группы из списка групп.
Я подозреваю, что моя проблема связана с правильным использованием цитат и разделителей Jinja, чтобы все оценивалось на должном уровне в иерархии Ansible -> Jinja -> JMESPath, но я не смог точно определить, что я делаю неправильно. Я пробовал десятки вариантов ниже, включая разбиение подзапросов на их собственные переменные, но без значимой обратной связи у меня не так много информации для внесения улучшений.
users.json:
{
"aws_users": [
{
"name": "userA",
"gecos": "User A"
},
{
"name": "userB",
"gecos": "User B"
},
{
"name": "userC",
"gecos": "User C"
}
]
}
groups.json:
{
"aws_groups": [
{
"name": "groupA",
"members": [
"userA",
"userC"
]
}
]
}
ansible.yml:
---
- hosts: 127.0.0.1
become: true
connection: local
gather_facts: no
vars_files:
- ../../config/groups.json
- ../../config/users.json
vars:
groupARoster: "{{ aws_groups | json_query('[?name==`groupA`].members | [0]') }}"
query: "aws_users[?contains(`{{ groupARoster }}`, name)]"
groupAUsers: "{{ aws_users | json_query(query) }}"
tasks:
- debug:
var: groupARoster
- debug:
var: query
- debug:
var: groupAUsers
# - name: Some looping thing
# command: ...
# loop: "{{ groupAusers }}"
Выход:
PLAY [127.0.0.1] ***********************************************************************************************************************************************************************************************
TASK [debug] ***************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"groupARoster": [
"userA",
"userC"
]
}
TASK [debug] ***************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"query": "aws_users[?contains(`[u'userA', u'userC']`, name)]"
}
TASK [debug] ***************************************************************************************************************************************************************************************************
ok: [127.0.0.1] => {
"groupAUsers": ""
}
PLAY RECAP *****************************************************************************************************************************************************************************************************
127.0.0.1 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Желаемый результат (для перехода в параметр цикла Ansible):
"groupAUsers": [
{
"name": "userA",
"gecos": "User A"
},
{
"name": "userC",
"gecos": "User C"
}
]