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/

5voto

nootal Points 41

La vérification de la variable 'tags' ne fonctionne pas dans Ansible 2.1.1.0. Voir ci-dessous pour le test. J'ai une autre idée pour exécuter la tâche seulement quand une étiquette est définie, fonctionnant pour les deux Ansible 1.9.X et 2.X.Y :

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

Avec cela, lorsque vous exécutez le playbook sans aucun tag, la variable 'foo' sera mise à true puis à false, donc rien ne sera exécuté. Si vous ajoutez le tag 'bar', seul le premier paramètre sera appliqué, donc la variable 'foo' sera vraie, et votre tâche sera exécutée. Bonne lecture !


Et voici le test concernant la variable 'tags' dans Ansible 2.1.1.0 :

Voici le mode d'emploi :

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

Et voici le résultat :

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0

0 votes

Il y a la variable ansible_run_tags (à trouver dans docs.ansible.com/ansible/latest/reference_appendices/ ) Cela devrait faire ce que vous avez essayé avec la variable "tags".

5voto

xtoznaxto Points 41

Il y a une étiquette spéciale - "jamais" qui empêchera une tâche de s'exécuter à moins qu'une balise ne soit spécifiquement demandée.

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

0 votes

Déjà mentionné dans la réponse ci-dessus : serverfault.com/a/907329/105928

4voto

pa4k Points 141

Oui. Exécuter ansible-playbook avec l'option --tags foo permettra de s'assurer que seules les tâches étiquetées avec l'option foo sont exécutées. Par exemple, supposons que nous ayons un playbook appelé example.yml :

tasks:

  - yum: name={{ item }} state=installed
    with_items:
       - httpd
       - memcached
    tags:
       - packages

  - name: some other task
    ..
    tags:
      - some other tag

en cours d'exécution :

ansible-playbook example.yml --tags "packages"

S'assurera que seule la tâche yum est exécutée.

Donc, en fait, vous n'avez pas vraiment besoin d'utiliser des balises dans la section when pour exécuter une tâche de manière conditionnelle. Notez que selon la complexité de vos playbooks/rôles, vous devrez peut-être utiliser une combinaison de --tags et --skip-tags pour contrôler les tâches exécutées. Par exemple, si une tâche incluse est étiquetée comme 'foo' et qu'une tâche dans le playbook inclus est étiquetée comme 'bar' et que vous exécutez

ansible-playbook --tags "foo"

La tâche interne (étiquetée seulement comme 'bar') sera exécutée. Pour éviter l'exécution de toutes les tâches internes étiquetées 'bar', vous devrez exécuter la commande suivante

ansible-playbook --tags foo --skip-tags bar

7 votes

Ce n'est pas vrai : "Spécifier une balise sur une tâche signifie que seulement lorsque cette balise est passée explicitement à la commande ansible-playbook, cette tâche sera exécutée."

1 votes

Secondé, l'affirmation n'est pas vraie.

11 votes

Oui, vous pouvez obtenir ce comportement en vous assurant que vous utilisez toujours le bon ansible-playbook mais je pense que le PO demande un moyen d'annoter une tâche de sorte qu'elle ne soit pas exécutée à moins qu'une balise spécifique ne soit explicitement ajoutée dans l'option ansible-playbook commandement.

1voto

Stefan Ahlm Points 61
tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

C'est la bonne réponse, mais ce qui est souvent déroutant pour les gens, c'est de savoir comment faire pour qu'Ansible puisse ajouter cette balise, parce que si vous mettez --tags debug sur la ligne de commande, alors l'option seulement qui s'exécute est la tâche de débogage. La solution est la suivante --tags all,debug par exemple

ansible-playbook play.yaml --tags all,debug

El Documents Ansible sur les balises a cette ligne :

Par défaut, Ansible fonctionne comme si --tags all avait été spécifié.

1voto

jursetto Points 1

El never est la solution correcte en général, mais elle ne fonctionnera pas dans un cas précis : les balises ne sont pas prises en charge sur meta tâches jusqu'à Ansible 2.11 . Dans ce cas, nous devons simuler le support de la balise avec une balise when: conditionnel et la variable magique ansible_run_tags .

Par exemple, voici un extrait qui listera tous les hôtes et terminera la lecture prématurément lorsque vous dites --tags list-hosts . Il fonctionne avec Ansible 2.8 et plus. Ceci est utile si vous avez généré des hôtes ou des groupes au moment de l'exécution avec add_host o group_by puisque cela arrive trop tard pour --list-hosts .

- pre_tasks:
  - name: List hosts
    assert:
      that: true
      quiet: true
    tags:
      - never
      - list-hosts

  - meta: end_play
    when: "'list-hosts' in ansible_run_tags"

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