Exécuter la tâche uniquement si l'hôte n'appartient à aucun groupe

106

Je voudrais pouvoir exécuter une tâche ansible uniquement si l'hôte du playbook actuel n'appartient pas à un certain groupe. En semi pseudo code:

- name: my command
  command: echo stuff
  when: "if {{ ansible_hostname }} not in {{ ansible_current_groups }}"

Comment dois-je faire cela?

rgrinberg
la source

Réponses:

198

Voici une autre façon de procéder:

- name: my command
  command: echo stuff
  when: "'groupname' not in group_names"

group_namesest une variable magique comme documenté ici: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables :

group_names est une liste (tableau) de tous les groupes dans lesquels se trouve l'hôte actuel.

Iskandar Najmuddin
la source
3
+1 et si vous n'incluez pas le devis environnant, vous obtenez l'erreur:This one looks easy to fix. It seems that there is a value started with a quote, and the YAML parser is expecting to see the line ended with the same kind of quote.
Peter Ajtai
3
Je trouve cette approche plus lisible et plus pratique à écrire, mais les deux fonctionnent également bien. when: inventory_hostname not in groups.certain_groups
Liam
4
Cette méthode est plus robuste que inventory_hostname in groups['groupname']parce que dans les cas où le coulis lui-même n'existe pas, Ansible lancera une erreur du type "Assurez-vous que le nom de votre variable ne contient pas de caractères invalides comme '-': l'argument de type 'StrictUndefined' n'est pas itérable"
hamx0r
20

Vous pouvez définir une variable de contrôle dans les fichiers vars situés dans group_vars/ou directement dans le fichier hosts comme ceci:

[vagrant:vars]
test_var=true

[location-1]
192.168.33.10 hostname=apollo

[location-2]
192.168.33.20 hostname=zeus

[vagrant:children]
location-1
location-2

Et exécutez des tâches comme celle-ci:

- name: "test"
  command: "echo {{test_var}}"
  when: test_var is defined and test_var
nvartolomei
la source
2
La réponse acceptée est plus précise pour la question, mais cela vous mène sur une meilleure voie
nik.shornikov