web-dev-qa-db-fra.com

Ansible: interpolation variable dans le nom de la tâche

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é.

13
calvinkrishy

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.

17
udondan

Vous devez entourer la chaîne de guillemets.

tasks:
    - name: "create a virtual Host file for {{ vhost }}"
      debug: msg="{{ vhost }}"

De documentation ansible :

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 .

1
J.A. Simmons V

Explication

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.

  • Si la variable foo ne comporte que des valeurs par hôte, lorsque Ansible exécute la lecture, elle ne peut pas décider quelle valeur utiliser.
  • D'autre part, si elle a global value (globale au sens de l'invariance de l'hôte), il n'y a pas de confusion quant à la valeur à utiliser.

Source: https://github.com/ansible/ansible/issues/3103#issuecomment-18835432

Mains sur playbook

  • ansible_user est une variable d'inventaire
  • greeting 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
0
MrMeszaros