Ansible: как определить выражение «когда» для случая, когда какая-либо переменная не определена ни на одном из хостов ansible_play_hosts_all? - PullRequest
2 голосов
/ 10 февраля 2020

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

    - name: look-up if there are no junos changes in such deploy
      set_fact:
        no_junos_changes: >-
          {%- set ns = namespace(junos_changes_counter=0) -%}
          {%- for router in ansible_play_hosts_all -%}
          {%- if hostvars[router]['correct_sections'] is defined -%}
          {%- set ns.junos_changes_counter = ns.junos_changes_counter + 1 -%}
          {%- endif -%}
          {%- endfor -%}
          {{ ns.junos_changes_counter }}
      delegate_to: localhost
      run_once: true

    - name: sent final summary to ms teams in case when junos commit skipped
      import_tasks: ./tasks/post_commit_summary.yml
      when: no_junos_changes|int == 0
      delegate_to: localhost
      run_once: true

Итак, первая задача предоставит мне число, сколько хостов в списке ansible_play_hosts_all имеют переменную hostvars[router]correct_sections. Затем, во втором задании, я просто сравниваю это число с 0.

Оно работает, как и ожидалось, но я не уверен, является ли это наиболее простым и элегантным способом для этой цели. Я имею в виду, в идеале я хотел бы избавиться от первой задачи и использовать одну строчку в выражении «когда» для второй задачи, я просто не уверен, возможно ли это ...

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Q: "Сколько хостов в списке ansible_play_hosts_all определено в переменной hostvars [router] correct_sections?"

A: Попробуйте это

- set_fact:
    no_junos_changes: "{{ ansible_play_hosts_all|
                          map('extract', hostvars)|
                          selectattr('correct_sections', 'defined')|
                          list|length }}"
0 голосов
/ 12 февраля 2020
- name: sent final summary to ms teams in case when junos commit skipped
  import_tasks: ./tasks/post_commit_summary.yml
  when: ansible_play_hosts_all
    |map('extract', hostvars)
    |selectattr('correct_sections', 'defined')
    |list|length|int == 0
  delegate_to: localhost
  run_once: true

На всякий случай, если кто-то интересуется решением одной задачи с условием одной строки

...