Les balises Ansible peuvent être utilisées pour exécuter uniquement 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 ne pouvons empêcher que certaines tâches de s'exécuter.
Pouvons-nous limiter l’exécution d’une tâche uniquement lorsque la balise "foo" est spécifiée? Pouvons-nous utiliser les balises actuelles dans la when
section d’une tâche?
Réponses:
Ansible 2.5 est livré avec des étiquettes spéciales
never
etalways
. Tagnever
peut être utilisé exactement à cette fin. Par exemple:Dans cet exemple, la tâche ne sera exécutée que lorsque la balise
debug
(ounever
) est explicitement demandée. [Référence sur ansible docs]la source
Bien que ce soit une solution détournée, cela fonctionne.
Dans la liste des tâches, enregistrez une variable lors de l'exécution normale. Ajoutez ensuite une condition when qui vérifie cette variable dans la tâche balisée.
la source
untagged
pour ce faire:- set_fact: untagged_run=true
tags: untagged
Je n'ai pas assez de réputation pour voter ou commenter la réponse suggérant l'utilisation de variables en ligne de commande (
--extra-vars
), mais je dois ajouter ceci:Vous pouvez empêcher les échecs de lecture en l'absence de
--extra-vars
définition en définissant une valeur par défaut dans le playbook lui-même:La substitution via
--extra-vars
fonctionnera toujours car les variables définies sur la ligne de commande ont priorité sur toutes les autres définitions.Le résultat est que la lecture est exécutée sans erreur si elle
thorough
n'est pas modifiéetrue
sur la ligne de commande.la source
thorough | default('no') | bool
.when: thorough is defined and thorough
si vous préférez cette syntaxeis defined and
syntaxe. plus que les multiples tuyaux que je ne pense pas sont intuitifs.Vous pouvez utiliser les conditions pour vous protéger contre les tâches en cours d'exécution qui seraient autrement exécutées par inadvertance si vous ne spécifiez pas de balise. La mise en garde à cette méthode est que la lecture sera une erreur et é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 conditionnel.
De ansible-playbook --help:
Exemple:
test.yaml:
la source
thorough | default("false") | match("true")
. Par défaut ne doit pas êtrefalse
, juste quelque chose qui ne correspond pastrue
, mais il améliore la lisibilité.Vérifier 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 uniquement quand une balise est définie, travaillant à la fois pour Ansible 1.9.X et 2.XY:
Avec cela, lors de l'exécution du livre de lecture sans balise, la variable 'foo' sera définie sur true, puis sur false, de sorte que rien n'est exécuté. Si vous ajoutez la balise 'bar', seul le premier paramètre sera appliqué. La variable 'foo' sera donc vraie et votre tâche sera exécutée. Prendre plaisir!
Et voici le test sur la variable 'tags' dans Ansible 2.1.1.0:
Voici le playbook:
Et voici la sortie:
la source
Oui. Exécuter ansible-playbook avec le
--tags foo
drapeau garantira que seules les tâches marquéesfoo
sont exécutées. Par exemple, supposons que nous ayons un livre de lecture appelé example.yml:fonctionnement:
S'assurera que seule la tâche yum est exécutée.
Donc, en réalité, vous n'avez pas vraiment besoin d'utiliser des balises dans section 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 de --skip-tags pour contrôler les tâches à exécuter. Par exemple, si une tâche à inclure est étiquetée comme "foo" et qu'une tâche du livre de lecture inclus est étiquetée comme "barre" et que vous exécutez
La tâche interne (étiquetée uniquement en tant que "barre") sera exécutée. Pour éviter l'exécution de toutes les tâches internes marquées 'bar', vous devrez exécuter la commande suivante
la source
ansible-playbook
options, mais je pense que l'OP demande un moyen d'annoter une tâche afin qu'elle ne soit pas exécutée à moins qu'une balise spécifique ne soit explicitement ajoutée à laansible-playbook
commande.Il existe une balise spéciale - "jamais" , qui empêchera une tâche de s'exécuter à moins qu'une balise ne soit spécifiquement demandée.
la source
Quand la clause ne peut pas évaluer la présence de balises. En guise de solution de contournement, 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
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' sur quelque chose pour l'activer. Ainsi, si vous exécutez le livre de lecture 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' sur votre playbook (ou cmdline) et DOIT définir la variable. Si vous ne définissez pas la balise, elle exécutera tout (installation et désinstallation) dans cet ordre, ce qui est utile pour tester l'ensemble du processus.
Comment tout exécuter (il va installer et désinstaller):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Comment exécuter uniquement la balise 'uninstall' sur le groupe dev
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Par conséquent, les variables et les balises peuvent également figurer dans les fichiers site.yml / inventory, ce qui vous permet de valider dans votre SCM et d’enregistrer votre intention.
la source
nootal a raison, mon approche ne fonctionne pas - ignorez-le :( J'utilise maintenant "lorsque: myvar est défini" et le commutateur de ligne de commande "-e" myvar = X "pour exécuter des tâches uniquement lorsque cela est explicitement demandé.
Encore plus facile (au moins avec ansible 2.1.1.0):
-> s'exécutera uniquement lorsque les balises auront été fournies ET que les balises incluent "foo"
la source
Sur
Ansible 2.3.2.0
, voici ma solution au problème:Il commence par la mise
in_tag
àTrue
alors il y a unset_fact
qu'il met de nouveau àFalse
quand vous ne spécifiez pastags
deansible-playbook
.Lorsque vous spécifiez des balises,
in_tag
reste àTrue
et lafail
tâche est exécutée.PS: vous pouvez ajouter la logique à toutes les tâches que vous voulez
PS2: vous pouvez également étendre la logique et coder en dur tous les tags que vous avez et
set_fact: in_tag_blah=True
en combinaison avectags: ["blah"]
bien sûr.la source