Je souhaite inclure des tâches en fonction de la condition définie dans la tâche.

tasks:
- name: SET INIT STATUS
  set_facts:
    passed: true

- name: INCLUDE TASKS WITH LOOP
  include_tasks: update_status.yml
  loop: [1, 2, 3]
  when: passed

Update_status.yml:

- name: OUTPUT THE STATUS
  debug: msg="ITEM: {{item}} has status {{passed}}"
- name: UPDATE the Status
  set_fact:
    passed: false

Ce à quoi je m'attendais, il ne fonctionnera qu'une seule fois pour l'élément 1, car après son exécution, il changera le statut en faux, puis la vérification de l'état échouera. Mais il s'exécute en fait 3 fois, il semble donc qu'il ne vérifie pas à nouveau l'état pendant la boucle.

Voici la sortie

TASK: [SET INIT STATUS]
ok: [localhost]

TASK: [INCLUDE TASKS WITH LOOP]
included: simple.yml for localhost
included: simple.yml for localhost
included: simple.yml for localhost

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 1 has status True
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 2 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 3 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]
1
Wibe Goose 17 mai 2020 à 07:18

3 réponses

Meilleure réponse

Q: "La boucle n'a pas pu vérifier la condition."

R: Il est nécessaire de comprendre 2 points pour expliquer ce qui se passe ici.

1) La condition when: passed, lorsqu'elle est appliquée à include_tasks, sera développée en when: true et sera héritée par toutes les tâches incluses. Cela rendra les tâches dans update_status.yml plus efficaces

- name: OUTPUT THE STATUS
  debug: msg="ITEM: {{item}} has status {{passed}}"
  when: true

- name: UPDATE the Status
  set_fact:
    passed: false
  when: true

2) En même temps, la condition when: passed, appliquée au loop, décide si la boucle va démarrer ou non. Une fois la boucle démarrée, elle ne prendra plus en compte la condition et exécutera toutes les itérations.

Ceci explique les résultats des tâches.

Remarques:

  • ATM (Ansible version 2.9) il n'est pas possible de rompre une boucle dans Ansible.

  • C'est une bonne idée de transtyper explicitement les variables nues booléennes en conditionnelles when: passed|bool. Voir Variables nues dans les conditions .


Il y a 2 erreurs de syntaxe dans le code:

  • "ERREUR! Impossible de résoudre le module / action 'set_facts'". Il n'y a pas de module set_facts.

Syntaxe correcte

- name: SET INIT STATUS
  set_fact:
    passed: true
  • "Erreur de syntaxe lors du chargement de YAML. Les valeurs de mappage ne sont pas autorisées dans ce contexte ... - nom: OUTPUT THE STATUS \ n debug: msg = \" ITEM: {{item}} a le statut {{passé}} \ "

Syntaxe correcte

- name: OUTPUT THE STATUS
  debug:
    msg: "ITEM: {{ item }} has status {{ passed }}"
0
Vladimir Botka 17 mai 2020 à 07:50

Je pense que vous avez un effet secondaire amusant sur Jinja. Essayez ceci pour votre conditionnel.

when: passed|bool

Cela garantira son évaluation en tant qu'expression osseuse.

0
Adam Miller 17 mai 2020 à 04:51

Après avoir essayé une approche différente, j'ai pu réaliser ce que je voulais en plaçant la boucle dans un bloc.

- name: LOOP WITH INCLUDE_TASK INSIDE BLOCK
  block:
    - name: LOOP WITH INCLUDE_TASK
      include_tasks: simple.yml
      loop: [1, 2, 3]
  when: passed

Et voici le résultat

TASK [SET passed] ******************************************************************************************
ok: [localhost]

TASK [LOOP WITH INCLUDE_TASK] ******************************************************************************************
included: /home/richard/samples/simple.yml for localhost
included: /home/richard/samples/simple.yml for localhost
included: /home/richard/samples/simple.yml for localhost

TASK [SHOW THE STATUS] ******************************************************************************************
ok: [localhost] => {
    "msg": "Item 1 has status True"
}

TASK [CHANGE THE STATUS] ******************************************************************************************
ok: [localhost]

TASK [SHOW THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [CHANGE THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [SHOW THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [CHANGE THE STATUS] ******************************************************************************************
skipping: [localhost]
0
Wibe Goose 18 mai 2020 à 16:12