Na verdade, temos a variável role_names
em Ansible desde o final de 2013 . Confirmado com Ansible 1.9.2. Então você pode simplesmente escrever uma condicional assim:
when: "'package-postfix' not in role_names"
Eu tenho o seguinte cenário com uma implantação do Ansible:
common-mta
e algumas outras funções common-mta
, bem como a função package-postfix
A função common-mta
copia um arquivo (se você poderia ter adivinhado, é /etc/postfix/main.cf
), mas eu quero restringir isso com base em se um host tem a função de package-postfix
, ao invés de apenas restringir pelo hostname como eu tenho agora, por exemplo:
when: not group_names == "mail"
O que eu gostaria é algo como:
when: not role_names == "package-postfix"
Acho que isso seria muito mais limpo e permite adicionar arbitrariamente a função package-postfix
a outros hosts sem ter que modificar a função common-mta
.
Isso é possível?
Editar: a sugestão do Navern não funciona para este caso de uso específico; a lista de papéis é independente da lista de grupos e, embora eu possa fazer isso por meio de um grupo, é mais sujo. Considere isso, que é minha linha de tarefa real:
- name: install postfix generic config if we aren't an mx, mail, or luna host
template: src=main.cf.j2 dest=/etc/postfix/main.cf
when: "'luna' not in group_names and 'mx' not in group_names and 'mail' not in group_names"
Eu gostaria de substituir isso por:
- name: install postfix generic config if we don't have the postfix role
template: src=main.cf.j2 dest=/etc/postfix/main.cf
when: "'package-postfix' not in role_names"
No entanto, role_names
não é uma variável válida, e até agora na documentação não consigo encontrar uma variável que contenha a lista de papéis em que o host está, e não seus grupos. Isso pode parecer a mesma coisa, mas no meu caso eles não são, já que os três grupos que menciono compartilham o papel package-postfix
. Espero que isso faça sentido e eu esteja usando Ansible corretamente.
Na verdade, temos a variável role_names
em Ansible desde o final de 2013 . Confirmado com Ansible 1.9.2. Então você pode simplesmente escrever uma condicional assim:
when: "'package-postfix' not in role_names"
Isso pode ser feito com o seguinte (citação da documentação em ansible.com):
Additionally, group_names is a list (array) of all the groups the current host is in. This can be used in templates using Jinja2 syntax to make template source files that vary based on the group membership (or role) of the host:
{% if 'package-postfix' not in group_names %}
# some part of a configuration file that only applies to not package-postfix
{% endif %}
Ok, com base em sua atualização: Eu converteria isso para definição de grupo, porque o papel está relacionado ao grupo e é mais lógico. Você deve criar um grupo que consista do grupo mx, mail e host luna, depois use a coisa sugerida. Ou você pode definir host_vars / group_vars específicos que diriam verdadeiro ou falso.
Por exemplo: use group_vars: mx conterá: use_postfix: "Falso"
group_vars para email conterá use_postfix: "False"
e host_var para o luna conterão host_vars use_postfix: "False"
então você acabou de fazer
when use_postifx != "False"
Desculpe pelo inglês, espero ter me esclarecido.
Tags linux ansible conditional