Puncte:1

Blocuri cu when și include_tasks

drapel ru

Am întâlnit un comportament puțin ciudat pe care nu îl înțeleg pe deplin și până acum nu am reușit să găsesc ceva util în documentație.

Când aveți un „bloc:” cu o condiție „când”, această condiție de pe blocul în sine pare să-și facă loc în sarcinile incluse, de ce?

Exemplu:

#playbook.yml
- gazde: localhost
  sarcini:
    - bloc:
      - nume: Includeți lucruri
        include_tasks: „set-x.yml”
      când: x nu este definit
#set-x.yml
- nume: Setați un fapt
  set_fact:
    x: foo

- nume: test
  depanare:
    var: x

Dacă rulați exemplul de mai sus, instrucțiunea de depanare nu va rula deloc și nu este ceea ce mă așteptam. Am înțeles că condiția când de pe bloc s-ar aplica numai dacă blocul în sine ar trebui executat sau nu. În mod clar, condiția este transferată în fișierul include_tasks și, după înțelegerea mea, nu așa ar trebui să funcționeze include.

Ce îmi lipsește?

Puncte:3
drapel br

Citând din Condiționale cu include:

Când utilizați o condiție pentru o instrucțiune include_*, condiția se aplică numai sarcinii include în sine și nu altor sarcini din fișierul (fișierele) inclus(e).

Acest lucru funcționează conform așteptărilor

    - include_tasks: set-x.yml
      când: x nu este definit

Nicio sarcină din fișierul inclus nu va fi utilizată

SARCINA [include_tasks] ************************************************ **
inclus: /export/scratch/tmp8/set-x.yml pentru localhost

Situația este diferită cu blocuri. Citând din Gruparea sarcinilor cu blocuri:

Toate sarcinile dintr-un bloc moștenesc directive aplicate la nivel de bloc. ... Directiva nu afectează blocul în sine, ea este moștenită doar de sarcinile incluse într-un bloc. De exemplu, o instrucțiune when este aplicată sarcinilor dintr-un bloc, nu blocului în sine.

Daca pui include_sarcini într-un bloc

    - bloc:
        - include_tasks: set-x.yml
      când: x nu este definit

condiția se aplică tuturor sarcinilor. De asemenea, sarcinilor incluse, depășind astfel regula anterioară conform căreia o condiție se aplică numai sarcinii de includere în sine.

SARCINA [include_tasks] ************************************************ ***
inclus: /export/scratch/tmp8/set-x.yml pentru localhost

SARCINA [set_fact] ************************************************ ********
ok: [localhost]

SARCINA [depanare] ************************************************ **********
săriți peste: [localhost]

Deschide o problema dacă crezi că acesta este un bug.

user3973227 avatar
drapel ru
Ei bine... acesta este un comportament puțin ciudat și devine mai ciudat pentru că nu numai la condiția when: din bloc ajunge la instrucțiunea include_tasks, de asemenea, apare și în fiecare instrucțiune din fișierul inclus și mai departe. și fișierele. Am aflat asta doar pentru că aveam un meta: reset_connection care declanșează un avertisment la două niveluri mai jos de la bloc despre faptul că nu acceptă o condiție când pe meta:
drapel br
Exact, acesta este ideea!

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.