Comprendre la condition Ansible basée sur un booléen avec la syntaxe "is"

J'essaie de comprendre la logique de la syntaxe de la condition basée sur le booléen dans les tâches ansibles.

playbook.yml

- hosts: localhost
gather_facts: no
tasks:
- name: stat module
stat:
path: playbook.yml
register: output_stat
#DEBUG
- debug:
var: output_stat.changed
- debug:
var: output_stat.stat.exists
#CONDITION
- name: debug condition on output_stat is changed
debug:
msg: "output_stat is changed"
when: output_stat is changed
- name: debug condition on output_stat.stat is exists
debug:
msg: "file exists"
when: output_stat.stat is exists

Exécuter le playbook avec ansible-playbook playbook.ymlla sortie de console suivante :

PLAY [localhost] *********************************************************************************************************************************************
TASK [stat module] *******************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.022) 0:00:00.022 ********
ok: [localhost]
TASK [debug] *************************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.385) 0:00:00.408 ********
ok: [localhost] => {
"output_stat.changed": false
}
TASK [debug] *************************************************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.037) 0:00:00.445 ********
ok: [localhost] => {
"output_stat.stat.exists": true
}
TASK [debug condition on output_stat is changed] *************************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.036) 0:00:00.482 ********
skipping: [localhost]
TASK [debug condition on output_stat.stat is exists] *********************************************************************************************************
Thursday 14 April 2022 11:48:10 +0200 (0:00:00.037) 0:00:00.520 ********
fatal: [localhost]: FAILED! => {"msg": "The conditional check 'output_stat.stat is exists' failed. The error was: Unexpected templating type error occurred on ({% if output_stat.stat is exists %} True {% else %} False {% endif %}): coercing to Unicode: need string or buffer, dict found\n\nThe error appears to be in '/tmp/test/playbook.yml': line 23, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: debug condition on output_stat.stat is exists\n ^ here\n"}
PLAY RECAP ***************************************************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=1 skipped=1 rescued=0 ignored=0

Pourquoi la première condition "output_stat est modifié" fonctionne-t-elle, mais pas la seconde "output_stat.stat existe". Je ne comprends pas car ils font tous deux référence à des valeurs booléennes.

Je comprends que je pourrais utiliser

 - name: debug condition on output_stat is changed
debug:
msg: "output_stat is changed"
when: output_stat.changed
- name: debug condition on output_stat.stat is exists
debug:
msg: "file exists"
when: output_stat.stat.exists

au lieu de le faire fonctionner, donc je ne cherche pas de solution. Je me demande vraiment comment le "est échoué" ne donne aucune erreur et le "existe" le fait... Est-ce lié à un comportement ansible très spécifique?


Solution du problème

is changedest un test Jinja2 fourni par Ansible: https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html#testing-task-results

Son implémentation est un peu plus avancée que le simple test de la valeur booléenne du champ changedprésent sur chaque résultat.

Ce test est un moyen plus pratique de vérifier si une tâche est dans l'état modifié.

D'autre part, existsn'est qu'un simple champ du champ statdans le résultat d'une tâche stat. Ce champ est un booléen comme documenté dans la doc du module.

Ce champ ne peut être testé directement qu'en tant que booléen.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"