У меня есть следующий playbook, который по существу работает -
vars:
ansible_network_os: ios
IOSserials: []
tasks:
- name: Get all facts from ios devices
register: all_facts
ios_facts:
gather_subset: hardware
- name: Create list Serials
set_fact:
IOSserials: "{{IOSserials|default([]) + [{ 'name': all_facts.ansible_facts.ansible_net_hostname, 'IOS_serial': all_facts.ansible_facts.ansible_net_serialnum }] }}"
when: hostvars[inventory_hostname].serial != all_facts.ansible_facts.ansible_net_serialnum
- name: Display list
debug:
msg: "These switches have a difference in serial number {{ ansible_play_hosts_all|map('extract', hostvars, 'IOSserials')|list }}"
run_once: true
со следующим результатом (у меня есть один сценарий «не равный» в переключателях):
TASK [Create list Serials] *****************************************************
skipping: [lab3650s1] => {"changed": false, "skip_reason": "Conditional result was False"}
skipping: [lab4500s1] => {"changed": false, "skip_reason": "Conditional result was False"}
ok: [lab3650s2] =>
{"ansible_facts": {"IOSserials": [{"IOS_serial": "FDO201XXXXD", "name": "lab3650s2"}]}, "changed": false}
TASK [Display list] ************************************************************
ok: [lab3650s1] => {
"msg": "These switches have a difference in serial number [Undefined, [{'name': 'lab3650s2', 'IOS_serial': 'FDO201XXXXD'}], Undefined]"
}
PLAY RECAP *********************************************************************
lab3650s1 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
lab3650s2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
lab4500s1 : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
I я не хочу, чтобы в списке вывода были «неопределенные» записи, я также хотел бы понять, почему Ansible вставляет это в список, когда пропускает set_fact для этих записей.