Я пытаюсь создать массив / список объектов JSON в Ansible. Моя playbook вызывается указанием --extra-vars "userids=123456,654321"
.
Затем я пытаюсь составить список из следующего. «TBD» - это просто заполнитель. Я заполню эти значения данными, полученными из запросов SQL, позже в playbook.
- name: Initiate User List
set_fact:
all_users: []
- name: Add new JSON Objects to List
set_fact:
all_users: "{{ all_users+ [{ 'UserID': '{{ item }}', 'UserType': 'TBD', 'UserName': 'TBD' }] }}"
loop: "{{ userids.split(',') }}"
- name: Debug
debug:
var: all_users
Сортировка сборок по списку, но пропускается первый элемент в списке. Это результат:
TASK [Initiate User List] *************************************************************************************************************************************************************
ok: [localhost]
TASK [Add new JSON Objects to List] ******************************************************************************************************************************************************
ok: [localhost] => (item=123456)
ok: [localhost] => (item=654321)
TASK [Debug] *****************************************************************************************************************************************************************************
ok: [localhost] => {
"all_users": [
{
"UserID": "654321",
"UserType": "TBD",
"UserName": "TBD"
},
{
"UserID": "{{ item }}",
"UserType": "TBD",
"UserName": "TBD"
}
]
}
Я не уверен, что мне не хватает. Я пробовал выполнить "set_fact" перед задачей цикла, чтобы сначала выполнить split (), но это не помогло. Я также пробовал with_items вместо цикла, не повезло
Не используйте вложенные фигурные скобки "{{ ... {{ item }} ... }}"
. Правильный синтаксис
all_users: "{{ all_users+ [{ 'UserID': item,
'UserType': 'TBD',
'UserName': 'TBD' }] }}"
Далее удобнее отправить список userids
. Тогда split
фильтр не нужен. Например playbook
shell> cat playbook.yml
- hosts: localhost
tasks:
- name: Initiate User List
set_fact:
all_users: []
- name: Add new JSON Objects to List
set_fact:
all_users: "{{ all_users +
[{ 'UserID': item,
'UserType': 'TBD',
'UserName': 'TBD' }] }}"
loop: "{{ userids }}"
- name: Debug
debug:
var: all_users
дает
shell> ansible-playbook -e "userids=['123456','654321']" playbook.yml
...
"all_users": [
{
"UserID": "123456",
"UserName": "TBD",
"UserType": "TBD"
},
{
"UserID": "654321",
"UserName": "TBD",
"UserType": "TBD"
}
]
userids
if the attribute UserID
shall be stored as integer
type instead of string
. For example shell> ansible-playbook -e "userids=[123456,654321]" playbook.yml
дает (нет кавычек вокруг значений UserID
)
"all_users": [
{
"UserID": 123456,
"UserName": "TBD",
"UserType": "TBD"
},
{
"UserID": 654321,
"UserName": "TBD",
"UserType": "TBD"
}
]
Затем используйте словарь, чтобы создать список пользователей. Например,
shell> cat playbook.yml
- hosts: localhost
vars:
my_users:
123456:
name: Alice Admin
type: admin
654321:
name: Bob Business
type: sales
tasks:
- name: Initiate User List
set_fact:
all_users: []
- name: Add new JSON Objects to List
set_fact:
all_users: "{{ all_users +
[{ 'UserID': item,
'UserType': my_users[item].type,
'UserName': my_users[item].name }] }}"
loop: "{{ userids }}"
- name: Debug
debug:
var: all_users
дает
shell> ansible-playbook -e "userids=[123456,654321]" playbook.yml
...
"all_users": [
{
"UserID": 123456,
"UserName": "Alice Admin",
"UserType": "admin"
},
{
"UserID": 654321,
"UserName": "Bob Business",
"UserType": "sales"
}
]