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/

0voto

quand La clause ne peut pas évaluer la présence de balises. Comme solution de rechange, j'utilise des variables et des balises ensemble pour exécuter des tâches spécifiques à cette balise/variable.

Ex : Imaginez un livre de jeu et un inventaire

\# inventory
\[dev\]
192.168.1.1

# site.yml
- hosts: dev
  roles:
    - { role: common }

and in common/tasks/main.yml

# roles/common/tasks/main.yaml
- name: Install links
  apt: name=links state=present

- include: uninstall.yml
  when: uninstall\_links is defined
  tags:
    - uninstall

# roles/common/tasks/uninstall.yml
- name: Uninstall links
  apt: name=links state=absent

Avec cette approche, vous utilisez la balise pour sélectionner uniquement les tâches dans uninstall.yml, mais vous devez également définir la variable 'uninstall_links' pour l'activer. Ainsi, si vous exécutez le playbook sans aucun paramètre, il exécutera, par défaut, la tâche d'installation. Pour désinstaller, vous pouvez définir la balise 'uninstall' dans votre playbook (ou ligne de commande) et MUST définir la variable. Si vous ne définissez pas la variable, il exécutera tout (installation et désinstallation) dans cet ordre, ce qui est bon pour tester l'ensemble du processus.

Comment faire fonctionner le tout (il s'installera et se désinstallera) :

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"

Comment exécuter uniquement le tag 'uninstall' sur le groupe de développement ?

$ ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall

Par conséquent, les variables et les balises pourraient également se trouver dans les fichiers site.yml/inventory, vous permettant de commit dans votre SCM et d'enregistrer votre intention.

0voto

DrPsychick Points 111

Nootal a raison, mon approche ne fonctionne pas - ignorez-la :( J'utilise maintenant "when : myvar is defined" et le commutateur de ligne de commande "-e "myvar=X" pour exécuter les tâches uniquement lorsque cela est explicitement demandé.

Encore plus facile (au moins avec ansible 2.1.1.0) :

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

-> ne sera exécuté que si les balises ont été fournies ET que les balises incluent "foo".

0voto

tehmoon Points 101

Sur Ansible 2.3.2.0 voici ma solution au problème :

---
- hosts: localhost
  gather_facts: no
  vars:
    in_tag: yes
  tasks:
    - set_fact: in_tag=no
    - fail:
        msg: "recently_added is set and you're using blah tag"
      when: ( in_tag | bool )
      tags:
        - blah
    - debug:
        msg: "always remember"

Il commence par définir in_tag a True alors il y a un set_fact qui le remet à False lorsque vous ne spécifiez pas de tags de ansible-playbook .

Lorsque vous spécifiez des balises, in_tag reste à True et le fail La tâche s'exécute.

PS : vous pouvez ajouter la logique à toutes les tâches que vous voulez.

PS2 : vous pouvez également étendre la logique et coder en dur toutes les balises que vous avez, et set_fact: in_tag_blah=True en combinaison avec tags: ["blah"] bien sûr.

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