102 votes

Ansible : Exécuter la tâche uniquement lorsqu'une balise est spécifiée

Balises Ansible peut être utilisé pour exécuter seulement un sous-ensemble de tâches/rôles. Cela signifie que par défaut, toutes les tâches sont exécutées et que nous pouvons seulement empêcher l'exécution de certaines tâches.

Peut-on limiter une tâche à exectuer ? uniquement lorsque la balise "foo" est spécifiée ? Peut-on utiliser les balises actuelles dans when section d'une tâche ?

2 votes

Il semble que ce dont vous avez besoin soit un paramètre de tâche tel que limit_to_tags : foo qui n'existe pas et je ne pense pas que cela soit possible pour le moment. Une implémentation future doit également prévoir de déterminer s'il faut AND ou OR ces balises ensemble.

0 votes

Jetez un coup d'œil à ma réponse dans "Ansible - Default/Explicit Tags". stackoverflow.com/questions/28789912/

85voto

Fixx Points 31

Ansible 2.5 est livré avec des étiquettes spéciales never y always . Étiquette never peut être utilisé exactement dans ce but. Par exemple

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

Dans cet exemple, la tâche ne s'exécutera que lorsque l'indicateur debug (ou never ) est explicitement demandé. [Référence sur les documents ansible]

3 votes

Cela ne fonctionnera pas avec les rôles qui ont des balises dans la définition de la pièce. En appelant un rôle par balise (par exemple "role_xy"), cette balise fera automatiquement partie de la tâche et ith sera donc exécuté même si "debug" n'a pas été défini. serverfault.com/a/1003479/256436 apporte une solution à ce problème.

24voto

jakev Points 2068

Une manière peut-être plus idiomatique et élégante est d'ajouter un fichier when condition à la tâche, comme tel :

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'debug' ]
    when: "'debug' in ansible_run_tags"

Cela utilise le variable magique ansible_run_tags qui contient la liste des balises fournies par l'argument CLI --tags (ou par synonymie -t ) et a pour effet d'exécuter la tâche ci-dessus si et seulement si l'étiquette debug est donné.

Il semble que cette variable magique ait été introduite dans ansible 2.5.

1 votes

Meilleure réponse si vous utilisez des rôles balisés.

19voto

Alex Peters Points 281

Je n'ai pas assez de réputation pour voter en faveur ou commenter la réponse suggérant l'utilisation de variables de ligne de commande ( --extra-vars ), mais j'ai ceci à ajouter :

L'inconvénient de cette méthode est que le jeu échouera si vous ne définissez pas cette variable supplémentaire.

Vous pouvez empêcher l'échec de la lecture en l'absence d'une --extra-vars en définissant une valeur par défaut dans le playbook lui-même :

---
- hosts: ...
# 
  vars:
    thorough: false
# 
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

Remplacement par --extra-vars fonctionnera toujours car les variables définies sur la ligne de commande ont la priorité sur toutes les autres définitions.

Le résultat est que la pièce se déroule sans erreur lorsque thorough n'est pas changé en true sur la ligne de commande.

8 votes

La même chose peut être réalisée en utilisant thorough | default('no') | bool .

2 votes

Ou when: thorough is defined and thorough si vous préférez cette syntaxe

0 votes

Merci, j'adore le is defined and syntaxe plus. plus que les tuyaux multiples qui ne me semblent pas intuitifs.

19voto

user2707671 Points 111

Bien que ce soit une solution détournée, elle fonctionne.

À l'intérieur de la liste des tâches, enregistrez une variable lors de l'exécution normale. Ensuite, ajoutez une condition when qui vérifie cette variable à la tâche étiquetée.

- shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified

1 votes

Vous pouvez également utiliser untagged pour y parvenir : - set_fact: untagged_run=true tags: untagged

2 votes

Pouvez-vous nous en dire un peu plus à ce sujet ? Un exemple concret ?

11voto

Ava Points 101

Vous pouvez utiliser Conditionnels pour se protéger contre l'exécution accidentelle de tâches qui seraient autrement exécutées si vous ne spécifiez pas de balise. L'inconvénient de cette méthode est que la lecture échouera si vous ne définissez pas cette variable supplémentaire.

En utilisant l'argument extra-vars, vous pouvez déclencher l'exécution de votre conditionnelle.

Depuis ansible-playbook --help :

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

Ejemplo:

ansible-playbook test.yaml -e "thorough=true"

test.yaml :

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | default(False)
...

2 votes

Pour éviter une erreur si vous ne définissez pas "thorough", utilisez simplement thorough | default("false") | match("true") . Le défaut ne doit pas être false tout ce qui ne correspond pas true mais cela améliore la lisibilité.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X