Execute a tarefa apenas se o host não pertencer a um grupo

106

Gostaria de poder executar uma tarefa ansible somente se o host do manual atual não pertencer a um determinado grupo. Em semi pseudo código:

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

Como devo fazer isso?

Rgrinberg
fonte

Respostas:

198

Esta é outra maneira de fazer isso:

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

group_namesé uma variável mágica, conforme documentado aqui: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#accessing-information-about-other-hosts-with-magic-variables :

group_names é uma lista (array) de todos os grupos em que o host atual está.

Iskandar Najmuddin
fonte
3
+1 e se você não incluir a citação ao redor, receberá o erro: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
Acho essa abordagem mais legível e conveniente de escrever, mas ambas funcionam igualmente bem. when: inventory_hostname not in groups.certain_groups
Liam
4
Dessa forma é mais robusta do que inventory_hostname in groups['groupname']porque nos casos em que a argamassa em si não existe, o Ansible lançará um erro como "Certifique-se de que o nome da sua variável não contenha caracteres inválidos como '-': o argumento do tipo 'StrictUndefined' não é iterável"
hamx0r
19

Você pode definir uma variável de controle em arquivos vars localizados em group_vars/ou diretamente no arquivo hosts como este:

[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

E execute tarefas como esta:

- name: "test"
  command: "echo {{test_var}}"
  when: test_var is defined and test_var
nvartolomei
fonte
2
resposta aceita é mais precisa para a pergunta, mas isso o leva a um caminho melhor
nik.shornikov