Рейтинг:0

Ansible глобальное сообщение о сбое, когда задача не удалась на всех хостах

флаг cn
raw

Мне нужно сообщение об ошибке, когда задача не удалась на всех хостах. Например:

- ios_facts:
    collect_subset: мин.
  failed_when: "{{ ansible_net_hostname }} содержит 123"

где все имена хостов содержат 123, поэтому это запускает задачу с ошибкой

- потерпеть поражение:
    msg: все имена хостов содержат 123
  когда: ххххх
Рейтинг:2
флаг br

For example, given the inventory for testing

shell> cat hosts
host1 ansible_net_hostname=host_123_A
host2 ansible_net_hostname=host_123_B
host3 ansible_net_hostname=host_123_C

The play below shows how to find the lists

- hosts: all
  gather_facts: false
  tasks:
    - debug:
        var: ansible_net_hostname
    - debug:
        msg: |
          All names: {{ _names }}
          Search names: {{ _search }}
      vars:
        _names: "{{ hostvars|json_query('*.ansible_net_hostname') }}"
        _search: "{{ _names|select('search', '123')|list }}"
      run_once: true

gives

TASK [debug] ***********************************************************
ok: [host1] => 
  ansible_net_hostname: host_123_A
ok: [host2] => 
  ansible_net_hostname: host_123_B
ok: [host3] => 
  ansible_net_hostname: host_123_C

TASK [debug] ***********************************************************
ok: [host1] => 
  msg: |-
    All names: ['host_123_A', 'host_123_B', 'host_123_C']
    Search names: ['host_123_A', 'host_123_B', 'host_123_C']

Compare the length of the lists

    - debug:
        msg: all of the hostnames contains 123
      vars:
        _names: "{{ hostvars|json_query('*.ansible_net_hostname') }}"
        _search: "{{ _names|select('search', '123')|list }}"
      when: _names|length == _search|length
      run_once: true

(Credit @Zeitounator for pointing to this option.)

The query above works if you target all hosts in the inventory. If you'd like to target a group of hosts use the special variable ansible_play_hosts_all and extract the variables from the hostvars. For example, given the inventory

shell> cat hosts
[test_123]
host[0001:1024]

[test_123:vars]
ansible_net_hostname=host_123_A

The play

- hosts: test_123
  gather_facts: false
  tasks:
    - debug:
        msg: |
          All names: {{ _names|length }}
          Search names: {{ _search|length }}
      vars:
        _names: "{{ ansible_play_hosts_all|
                    map('extract', hostvars, 'ansible_net_hostname')|
                    list }}"
        _search: "{{ _names|select('search', '123')|list }}"
      run_once: true

gives

TASK [debug] *****************************************************
ok: [host0001] => 
  msg: |-
    All names: 1024
    Search names: 1024

To evaluate the condition compare the length of the lists as before.

флаг cn
raw
Спасибо ! У меня есть еще один случай, когда мне нужно выбрать пустые факты, как я могу заставить это работать? `_search: "{{ _names|выбрать('поиск', '')|список }}"`
Zeitounator avatar
флаг fr
Я думаю, что OP хочет знать, все ли имена хостов ** в цикле воспроизведения хоста ** проходят тест или нет. Ваш ответ заключается в просмотре всего инвентаря независимо от текущих целей в игре.
Zeitounator avatar
флаг fr
@raw другие вопросы помещаются в новый пост или, по крайней мере, в редактирование вашего текущего вопроса, а не в комментарий. Спасибо.
флаг br
@Zeitounator: в *hostvars* нет других хостов, кроме всех хостов в игре.
Zeitounator avatar
флаг fr
@VladimirBotka Я должен не согласиться с этим последним: https://gist.github.com/zeitounator/3a3ac34b96ccd49998523adf7da3e1cd, как вы увидите, я создал игру, нацеленную на определенную группу и hostvars, но содержит все записи для всех целей во всем инвентаре. Между тем, я, по-видимому, неправильно истолковал вопрос, поскольку это, похоже, все равно делает работу;)
флаг br
@Zeitounator. Я понимаю. Я обновил ответ. Спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.