Puncte:0

Mesaj de eșec global Ansible atunci când o sarcină a eșuat pe toate gazdele

drapel cn
raw

Am nevoie de un mesaj de eșec atunci când o sarcină a eșuat pe toate gazdele. De exemplu:

- ios_facts:
    gather_subset: min
  failed_when: „{{ ansible_net_hostname }} conține 123”

unde toate numele de gazdă conțin 123, așa că declanșează o sarcină eșuată

- eșec:
    msg: toate numele de gazdă conțin 123
  când: xxxxx
Puncte:2
drapel 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.

drapel cn
raw
Mulțumesc ! Am un alt caz în care trebuie să selectez faptele care sunt goale, cum aș putea face ca acest lucru să funcționeze? `_search: "{{ _names|select('search', '')|list }}"`
Zeitounator avatar
drapel fr
Cred că OP vrea să știe dacă toate numele de gazdă **din bucla de redare a gazdei** trec sau nu testul. Răspunsul tău este să te uiți la întregul inventar, indiferent de țintele curente în joc.
Zeitounator avatar
drapel fr
@raw alte întrebări apar într-o postare nouă, sau cel puțin într-o modificare a întrebării dvs. curente, nu într-un comentariu. Mulțumiri.
drapel br
@Zeitounator: Nu există alte gazde în *hostvars* cu excepția tuturor gazdelor din joc.
Zeitounator avatar
drapel fr
@VladimirBotka Trebuie să nu fiu de acord cu acest ultim: https://gist.github.com/zeitounator/3a3ac34b96ccd49998523adf7da3e1cd, după cum veți vedea, am creat o piesă care vizează un anumit grup și hostvars, care conține totuși toate intrările pentru toate țintele din întregul inventar. Între timp, se pare că am interpretat greșit din întrebare, deoarece asta par să facă treaba oricum ;)
drapel br
@Zeitounator. Văd. Am actualizat raspunsul. Mulțumesc.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.