Je ne parviens pas à obtenir cet exemple apparemment simple dans Ansible 1.8.3. L'interpolation variable n'entre pas dans le nom de la tâche. Tous exemples j'ai vu semblent suggérer que cela devrait fonctionner. Étant donné que la variable est définie dans la section vars, je m'attendais à ce que le nom de la tâche imprime la valeur de la variable. Pourquoi ça ne marche pas?
Même l'exemple de Ansible documentation ne semble pas afficher la valeur de la variable.
---
- hosts: 127.0.0.1
gather_facts: no
vars:
vhost: "foo"
tasks:
- name: create a virtual Host file for {{ vhost }}
debug: msg="{{ vhost }}"
Cela se traduit par la sortie suivante:
PLAY [127.0.0.1]
**************************************************************
TASK: [create a virtual Host file for {{ vhost }}]
****************************
ok: [127.0.0.1] => {
"msg": "foo"
}
PLAY RECAP
********************************************************************
127.0.0.1 : ok=1 changed=0 unreachable=0 failed=0
Update Ceci fonctionne avec 1.7.2 mais ne fonctionne pas avec 1.8.3. Donc, il s’agit d’un bogue ou d’une fonctionnalité.
Les variables ne sont pas résolues dans name
. Ce n'est que dans les tâches/conditions réelles, etc. que les espaces réservés seront résolus. Je suppose que c'est par conception. Imaginez que vous avez une boucle with_items
et utilisez le {{ item }}
dans la name
. Les tâches name
ne seront imprimées qu'une seule fois, mais le {{ item }}
changera à chaque itération.
Je vois que les exemples, même celui de la documentation à laquelle vous êtes lié, utilisent des variables dans la variable name
. Mais cela ne signifie pas que le résultat serait comme vous l'espériez. Les documents sont gérés par la communauté. C’est peut-être quelqu'un qui a juste mis cette ligne là sans le tester - ou peut-être que ça fonctionnait comme ça dans une version précédente d’Ansible et que la documentation n’a pas été mise à jour à ce moment-là. (Je n'utilise Ansible que depuis environ un an). Mais même si cela ne fonctionne pas comme nous le souhaiterions, j'utilise toujours des variables dans ma name
, simplement pour indiquer que la tâche est basée sur des paramètres dynamiques. Peut-être que les exemples ont été écrits avec la même intention.
Une observation intéressante que j'ai récemment faite (Ansible 1.9.4) est que les valeurs par défaut sont écrites dans le nom de la tâche.
- name: create a virtual Host file for {{ vhost | default("foo") }}
Lors de l'exécution, Ansible afficherait le titre de la tâche comme suit:
TÂCHE: [créer un fichier hôte virtuel pour foo]
De cette façon, vous pouvez éviter les noms de tâches laids dans la sortie.
Vous devez entourer la chaîne de guillemets.
tasks:
- name: "create a virtual Host file for {{ vhost }}"
debug: msg="{{ vhost }}"
La syntaxe YAML requiert que, si vous démarrez une valeur avec {{foo}}, vous citez toute la ligne, car vous voulez être sûr de ne pas essayer de démarrer un dictionnaire YAML. Ceci est couvert sur la page Syntaxe YAML .
Que la variable soit interpolée dépend de l'endroit où elle a été déclarée.
Imaginez que vous avez deux hôtes: A
et B
.
foo
ne comporte que des valeurs par hôte, lorsque Ansible exécute la lecture, elle ne peut pas décider quelle valeur utiliser.Source: https://github.com/ansible/ansible/issues/3103#issuecomment-18835432
ansible_user
est une variable d'inventairegreeting
est une variable invariante- name: Test variable substitution in names
hosts: localhost
connection: local
vars:
greeting: Hello
tasks:
- name: Sorry {{ ansible_user }}
debug:
msg: this won't work
- name: You say '{{ greeting }}'
debug:
var: ansible_user