Ansible: comprendre une instruction conditionnelle composite quand
Considérer cette triviale ansible playbook et de sortie associés ci-dessous. Pourquoi
ne tâche 5 exécuté? Ces tâches ont été exécutées à l'encontre de debian. Tâche 1
ne parvient pas comme prévu. Alors, pourquoi ne et communique avec
'ansible_lsb.major_release|int < 14' font-il vrai? Est-ce que avez
quelque chose à voir avec la priorité de l'opérateur?
-jk
---
- name: These tests run against debian
hosts: frontend001
vars:
- bcbio_dir: /mnt/bcbio
- is_ubuntu: "'{{ansible_distribution}}' == 'Ubuntu'"
- is_debian: "'{{ansible_distribution}}' == 'Debian'"
tasks:
- name: 1. Expect skip because test is_ubuntu
debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
when: is_ubuntu
- name: 2. Expect to print msg because test is_debian
debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
when: is_debian
- name: 3. Expect to print msg because release 7 of wheezy
debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
when: ansible_lsb.major_release|int < 14
- name: 4. Expect to print msg because true and true is true
debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
when: is_debian and ansible_lsb.major_release|int < 14
- name: 5. Expect to skip because false and true is false
debug: msg="ansible distribution - {{ansible_distribution}}, release - {{ansible_distribution_release}}, {{ ansible_lsb.major_release }}"
when: is_ubuntu and ansible_lsb.major_release|int < 14
$ ansible-playbook -i ~/.elasticluster/storage/ansible-inventory.jkcluster zbcbio.yml
PLAY [These tests run against debian] *****************************************
GATHERING FACTS ***************************************************************
ok: [frontend001]
TASK: [1. Expect skip because test is_ubuntu] *********************************
skipping: [frontend001]
TASK: [2. Expect to print msg because test is_debian] *************************
ok: [frontend001] => {
"msg": "ansible distribution - Debian, release - wheezy, 7"
}
TASK: [3. Expect to print msg because release 7 of wheezy] ********************
ok: [frontend001] => {
"msg": "ansible distribution - Debian, release - wheezy, 7"
}
TASK: [4. Expect to print msg because true and true is true] ******************
ok: [frontend001] => {
"msg": "ansible distribution - Debian, release - wheezy, 7"
}
TASK: [5. Expect to skip because false and true is false] *********************
ok: [frontend001] => {
"msg": "ansible distribution - Debian, release - wheezy, 7"
}
PLAY RECAP ********************************************************************
frontend001 : ok=5 changed=0 unreachable=0 failed=0
Édité:
Liste des modifications basées sur tedder42 la réponse ci-dessous au cas où quelqu'un est en train de suivre à la maison.
1) Modifié
- is_ubuntu: "'{{ansible_distribution}}' == 'Ubuntu'"
à
- is_ubuntu: "{{ansible_distribution == 'Ubuntu'}}"
2) changement
when: is_ubuntu and ansible_lsb.major_release|int < 14
à
when: is_ubuntu|bool and ansible_lsb.major_release|int < 14
Qui l'ont fait!
-jk
source d'informationauteur John
Vous devez vous connecter pour publier un commentaire.
TLDR: votre variable est sortie comme une chaîne de caractères, pas d'évaluation. Correction de l'évaluation à l'aide de jinja2 puis filtrer le var comme
|bool
.De débogage
Vous êtes seulement il manque une chose pour déboguer ce problème. Voici ce que j'ai couru sur mon local OSX boîte:
Et la sortie:
L'évaluation
Autant que je sache, on ne peut pas vraiment évaluer jusqu'à une valeur de type boolean. Typiquement, cela se fait en déroulant la variable (en le plaçant dans chaque "quand"). Cependant, il peut être accompli que vous pouvez obtenir un booléen comme une chaîne de caractères, puis la convertir en une valeur bool comme évoqué sur les Variables ansible page (de la recherche pour "valeur booléenne").
Et voici la sortie.
Version filtre de comparaison
Remarque vous pouvez prendre avantage de Ansible est version_compare filtre. L'utilisation est laissée en exercice au lecteur.