Ansible: переменная установленного факта перезаписывается при повторении цикла

Я пытаюсь создать список из словаря по условию. Но когда я прохожу его через цикл, последнее значение цикла перезаписывает факт вместо создания списка

input.yml

execution:
 pre-deploy:
   
 post-deploy:
   shell-files:
      name: abc, def, gef
      type: deploy
      target_host:  server1
      check:  enabled
   xml-files:
      name: xyz, uvw
      type: deploy
      target_host:  server2
      check:  enabled
  shell-files:
      name: pqr
      type: migrate
      target_host:  server1
      check:  enabled

Мой код:

  Hosts: local
  vars_file:
     - input.yml
  vars:
    post_list:"{{ lookup( 'dict', operations.post-deploy, wantList=Ture ) }}"
  tasks:
  - set_fact:
       get_deploy_list: "{{ item.key }}: {{ item.value.name.split(',') | list }}"
       get_host_list: "{{ item.value.target_host }}"
    when: ( item.value.type == "deploy" and item.value.check == "enabled")
    loop:"{{ post_list | items2dict }}"
  
  - debug: msg="{{ get_deploy_list }}"

Ожидаемый результат:

  debug:
    [ {
      shell-files: abc,
      shell-files: def,
      shell-files: ghi
       }
     {
      xml-files: xyz,
      xml-files: uvw
     }  ]

Фактический выход:

    [{
      xml-files: xyz,
      xml-files: uvw
     }  ]

Последнее значение списка перезаписывает факт.


person UBops    schedule 21.02.2021    source источник
comment
Если бы вы могли найти время, чтобы правильно отформатировать образцы кода в вашем вопросе, было бы легче читать.   -  person larsks    schedule 21.02.2021
comment
Несвязанный: разве Ansible не жалуется на wantList=Ture?   -  person β.εηοιτ.βε    schedule 21.02.2021


Ответы (1)


Ситуация такая же, как и в любом языке программирования с циклами: если вы не ссылаетесь на существующий список, тогда он просто повторно переназначает переменную, и вы получите последнее состояние мира при выходе из цикла.

Я видел, что традиционным способом решения этой проблемы являются | default и | combine.

- set_fact:
    get_deploy_list: >-
      {{ (get_deploy_list|default([]))
      | combine({item.key: item.value.name.split(',') | list})
      }}
  loop: "{{ post_list | items2dict }}"

хотя в своих плейбуках я считаю этот шаблон ошибкой, поскольку jinja отлично может создавать словари, используя свой синтаксис цикла, без повторного вызова set_fact (который, по определению, будет открывать соединения с каждым хостом в инвентаре несколько раз)

имейте в виду, что я не получил точного формата вывода с помощью этого фрагмента кода, потому что в вашей книге уже было много неправильного; этот ответ заключался в том, почему задание все время перезаписывало факт

person mdaniel    schedule 21.02.2021