Declaração condicional com base em outras funções?

5

Eu tenho o seguinte cenário com uma implantação do Ansible:

  • o hostX tem a função common-mta e algumas outras funções
  • hostY tem a função 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.

    
por Joshua Boniface 21.08.2015 / 17:54

2 respostas

8

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"
    
por 22.08.2015 / 08:15
1

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.

    
por 21.08.2015 / 18:11