Создание списка с добавлением неопределенных записей при значении false в Ansible - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующий 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 для этих записей.

1 Ответ

1 голос
/ 02 апреля 2020

В конвейере map отсутствует select, который отфильтровывает те, в которых extract не дает значимого значения; Вы можете видеть это тривиально воспроизводимым:

- set_fact:
    thingy:
      one:
        apple: is red
      two:
        banana: is yellow
      three:
        apple: is green
- debug:
    msg: >
     {{ ["one", "two", "three"] | map("extract", thingy, "banana") | list }}
- debug:
    msg: >
     {{ ["one", "two", "three"]
     | map("extract", thingy, "banana")
     | select
     | list }}
...