Puncte:0

Operația ansible AND cu WHEN eșuează când se utilizează ansible_facts

drapel gr

Echipa: Încerc să eșuez o sarcină când nu sunt îndeplinite două condiții pe un nod. ansible_facts['distribution_version'] și ansible_facts['distribuție'].

Trec în două noduri. un nod este 20.x ubuntu și altele este 18.x.

vars/main.yml

os_distribution: „Ubuntu”
os_version: „20.04”

sarcina este mai jos

- nume: „Verificați versiunea de bază a sistemului de operare mapează la versiunea de distribuție așteptată {{ os_version }}”
  eșuează:
    msg: "Sarcina nu a reușit ca versiune neașteptată a sistemului de operare găsită: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} pe {{ inventory_hostname }}"
  când:
    - ansible_facts['distribution_version'] este versiunea(os_version, '<')
    - os_distribution != ansible_facts['distribuție']

rezultat

SARCINA [validarea nodului: Versiunea de bază a sistemului de operare se mapează la versiunea de distribuție așteptată 20.04] ***
Marți, 23 noiembrie 2021 20:11:32 +0000 (0:00:17.570) 0:00:17.690 ****** 
săriți peste: [node1]
omitere: [node2]
    

rezultat așteptat: observați 18.x de mai jos, nu sunt sigur ce îmi lipsește pentru a obține asta.

fatal: [node2]: FAILED! => {"schimbat": false, "msg": "Sarcina a eșuat ca versiune neașteptată a sistemului de operare găsită: Ubuntu 18.04 pe nodul 2"}

Când scot - os_distribution != ansible_facts['distribuție'] atunci obțin rezultatul așteptat ca mai jos, dar vreau să satisfac două condiții, nu doar una.

[fatal: [node2]: A ESCUT! => {"schimbat": false, "msg": "Sarcina a eșuat ca versiune neașteptată a sistemului de operare găsită: Ubuntu 18.04 pe nodul 2 }}"}

referire la ansible_facts

FACTE pentru 20.x

10:17:59 [0;32m „distribuție”: „Ubuntu”,[0m
10:17:59 [0;32m „distribution_file_parsed”: adevărat,[0m
10:17:59 [0;32m "distribution_file_path": "/etc/os-release",[0m
10:17:59 [0;32m "distribution_file_variety": "Debian",[0m
10:17:59 [0;32m "distribution_major_version": "18",[0m
10:17:59 [0;32m "distribution_release": "bionic",[0m
10:17:59 [0;32m "distribution_version": "18.04",[0m

FACTE pentru 20.x

10:23:43 [0;32m „distribuție”: „Ubuntu”,[0m
10:23:43 [0;32m „distribution_file_parsed”: adevărat,[0m
10:23:43 [0;32m "distribution_file_path": "/etc/os-release",[0m
10:23:43 [0;32m "distribution_file_variety": "Debian",[0m
10:23:43 [0;32m "distribution_major_version": "20",[0m
10:23:43 [0;32m "distribution_release": "focal",[0m
10:23:43 [0;32m "distribution_version": "20.04",[0m
Puncte:0
drapel in

Când furnizați o listă când o listă efectuează o ȘI dintre cele două expresii. Și aici este tabelul standard și de adevăr.

Cond1 Cont2 | Rezultat
Fals Fals | Fals
Fals Adevărat | Fals
Adevărat Fals | Fals
Adevărat Adevărat | Adevărat

Luați în considerare că aveți

os_distribution: „Ubuntu” # variabilă
ansible_facts.distribution: „Ubuntu” # fapt

Expresia „Ubuntu” != „Ubuntu” este Fals, și deoarece conform tabelului de adevăr, dacă oricare dintre condiții este falsă, rezultatul final este fals. Ansible va executa sarcina numai atunci când rezultatul este adevărat.

Oricum, cred că pentru a obține rezultatul pe care îl doriți, ar trebui să vă schimbați când la un SAU în loc să aibă o listă la care se alătură un AND.

când:
  ansible_facts['distribution_version'] este versiunea(os_version, '<') sau
  os_distribution != ansible_facts['distribuție']

Registrul demonstrativ + ieșire

---
- gazde: localhost
  vars:
    os_distribution: „Ubuntu”
    os_version: „20.04”
    fapte_ansible:
      distribuție: „Ubuntu”
      distribution_file_parsed: Adevărat
      distribution_file_path: „/etc/os-release”
      distribution_file_variety: „Debian”
      distribution_major_version: „18”
      distribution_release: „bionic”
      distribution_version: „18.04”

  sarcini:
  - depanare:
      mesaj: >-
        {{ os_distribution }} {{ansible_facts['distribution'] }}
        {{ os_distribution != ansible_facts['distribuție'] }}
  - depanare:
      mesaj: >-
        {{ ansible_facts['distribution_version'] }} {{ os_version }}
        {{ ansible_facts['distribution_version'] este versiunea(os_version, '<') }}

  - nume: „Verificați versiunea de bază a sistemului de operare mapează la versiunea de distribuție așteptată {{ os_version }}”
    depanare:
      msg: "Sarcina nu a reușit ca versiune neașteptată a sistemului de operare găsită: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} pe {{ inventory_hostname }}"
    când:
      ansible_facts['distribution_version'] este versiunea(os_version, '<') sau
      os_distribution != ansible_facts['distribuție']

- gazde: localhost
  vars:
    os_distribution: „Ubuntu”
    os_version: „20.04”
    fapte_ansible:
      distribuție: „Ubuntu”
      distribution_file_parsed: adevărat
      distribution_file_path: „/etc/os-release”
      distribution_file_variety: „Debian”
      distribution_major_version: „20”
      distribution_release: „focal”
      distribution_version: „20.04”

  sarcini:
  - depanare:
      mesaj: >-
        {{ os_distribution }} {{ansible_facts['distribution'] }}
        {{ os_distribution != ansible_facts['distribuție'] }}
  - depanare:
      mesaj: >-
        {{ ansible_facts['distribution_version'] }} {{ os_version }}
        {{ ansible_facts['distribution_version'] este versiunea(os_version, '<') }}

  - nume: „Verificați versiunea de bază a sistemului de operare mapează la versiunea de distribuție așteptată {{ os_version }}”
    depanare:
      msg: "Sarcina nu a reușit ca versiune neașteptată a sistemului de operare găsită: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} pe {{ inventory_hostname }}"
    când:
      ansible_facts['distribution_version'] este versiunea(os_version, '<') sau
      os_distribution != ansible_facts['distribuție']

# Ieșire

# SARCĂ [depanare] ******************************************** **************************************************** ****************************
# ok: [localhost] => {
# "msg": "Ubuntu Ubuntu False"
# }
#
# SARCĂ [depanare] ******************************************** **************************************************** ****************************
# ok: [localhost] => {
# "msg": "18.04 20.04 Adevărat"
# }
#
# SARCĂ [Verificați versiunea de bază a sistemului de operare se mapează la versiunea de distribuție așteptată 20.04] **************************************** ****************************
# ok: [localhost] => {
# "msg": "Sarcina a eșuat deoarece a fost găsită o versiune neașteptată a sistemului de operare: Ubuntu 18.04 pe localhost"
# }
#
# PLAY [localhost] ********************************************* **************************************************** ************************
#
# SARCĂ [depanare] ******************************************** **************************************************** ****************************
# ok: [localhost] => {
# "msg": "Ubuntu Ubuntu False"
# }
#
# SARCĂ [depanare] ******************************************** **************************************************** ****************************
# ok: [localhost] => {
# "msg": "20.04 20.04 False"
# }
#
# SARCĂ [Verificați versiunea de bază a sistemului de operare se mapează la versiunea de distribuție așteptată 20.04] **************************************** ****************************
# sărituri: [localhost]
#

PS, dacă vrei matematica despre motivul pentru care treci de la un AND la un SAU pe negație vezi Legile_De_Morgan

AhmFM avatar
drapel gr
de acord și cred că asta am crezut că fac? Am un nod1 care este TT și celălalt este TF. deci ar fi trebuit să obțin eșec pentru nodul 2 care imprimă mesaj și să omite pe nodul 1 care are TT fără mesaj. dar primesc skip și niciun mesaj în ambele situații
drapel in
Dacă aveți nevoie de mai multe, adăugați un exemplu de manual și o ieșire care vă pot ajuta și puteți utiliza pentru a testa mai multe.

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.