В этом задании ...
- name: Populate dict (test with IP)
set_fact:
vms_infos: "{{ vms_infos | default([]) + [ {'id': item.key, 'ip': item.value.ip} ] }}"
with_items:
- "{{ k8s_vms }}"
... вы пытаетесь получить доступ к item.key
и item.value
, но item
не будет иметь этих атрибутов. Вы перебираете словарь (k8s_vms
), что означает, что вы получите список ключей. Таким образом, item
будет иметь значение 888
в первый раз и 999
во второй раз.
Кроме того, эта задача называется "populate dict", но вы фактически создаете список, который может запутать любого, кто читает вашу пьесу.
Возможно, вы захотите использовать фильтр dict2items
:
- name: populate vm_infos list
set_fact:
vms_infos: "{{ vms_infos + [{'id': item.key, 'ip': item.value.ip}] }}"
loop: "{{ k8s_vms|dict2items }}"
vars:
vms_infos: []
Вот пример книги, в которой это делается:
- hosts: localhost
gather_facts: false
vars:
k8s_vms:
888:
ip: 10.0.30.110
mac: ca:d1:23:45:4e:01
999:
ip: 10.0.30.111
mac: ca:d1:23:45:4e:02
tasks:
- name: populate vm_infos list
set_fact:
vms_infos: "{{ vms_infos + [{'id': item.key, 'ip': item.value.ip}] }}"
loop: "{{ k8s_vms|dict2items }}"
vars:
vms_infos: []
- debug:
var: vms_infos
Запуск, который производит:
PLAY [localhost] ******************************************************************************
TASK [populate vm_infos list] *****************************************************************
ok: [localhost] => (item={'key': 888, 'value': {'ip': '10.0.30.110', 'mac': 'ca:d1:23:45:4e:01'}})
ok: [localhost] => (item={'key': 999, 'value': {'ip': '10.0.30.111', 'mac': 'ca:d1:23:45:4e:02'}})
TASK [debug] **********************************************************************************
ok: [localhost] => {
"vms_infos": [
{
"id": 888,
"ip": "10.0.30.110"
},
{
"id": 999,
"ip": "10.0.30.111"
}
]
}
PLAY RECAP ************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0