Ansible: Defina as variáveis condicionalmente no arquivo vars se uma determinada condição for atendida

7

Dependendo do valor (True / False) de uma variável definida em group_vars, estou tentando definir algumas variáveis em um arquivo vars. Seu valor depende do valor do grupo var.

Meu arquivo var atual é assim:

{% if my_group_var %}
test:
   var1: value
   var2: value
   ...
   varn: value
{% else %}
test:
   var1: other_value
   var2: other_value
   ...
   varn: other_value
{% endif %}

Para cada uma das minhas funções, estou usando uma variável definida nesse arquivo.

Meu manual de teste é mostrado abaixo:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/test_vars.yml
  roles: blabla 

O erro que recebo depois de executar o manual é:

{% if my_group_var %}
 ^ here

exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
  in "<unicode string>"

Estou fazendo algo estúpido aqui ou isso nem sequer é suportado? Eu tentei encontrar uma outra maneira de definir esses vars (eu tenho muitos deles), mas eu não consegui fazer algo funcional aqui. Alguma sugestão?

    
por pandoJohn 11.04.2018 / 15:43

5 respostas

0

O que eu fiz no final foi criar 2 arquivos var separados - vamos chamá-los de type_a.yml e type_b.yml - e eu defini uma variável de grupo que indica qual arquivo usar - algo como type_of_file: a . É assim que meu livro parece agora:

- name: blabla
  hosts: blabla
  vars_files:
     - <path>/type_{{ type_of_file }}.yml
  roles: blabla

Obrigado por todas as respostas. Eu os acho realmente úteis.

    
por 27.05.2018 / 16:40
5

Eu não acho que você pode, eu costumo criar arquivos separados para manter coleções de variáveis condicionais e usar um when cláusula para incluí-los em uma condição específica:

- include_vars: test_environment_vars.yml
  when: global_platform == "test"

- include_vars: staging_environment_vars.yml
  when: global_platform == "staging"

- include_vars: prod_environment_vars.yml
  when: 
    - global_platform != "test" 
    - global_platform != "staging" 
    
por 11.04.2018 / 16:01
2

Apesar de ser legal, eu tenho medo que o seu jeito não seja possível (ou eu não estou ciente do jeito certo).

Sugiro primeiro preparar o arquivo vars do modelo jinja e incluí-lo com include_vars. Veja o exemplo de manual de jogo:

---
- name: -Test-
  hosts: local
  vars:
    my_group_var: False
#    my_group_var: True

  tasks:

  - name: Prepare vars file from template.
    template: src=/tmp/vars.yaml.j2
              dest=/tmp/vars.yaml

  - name: Include vars
    include_vars: "/tmp/vars.yaml"

O conteúdo do exemplo jinja template /tmp/vars.yaml.j2 é:

{% if my_group_var %}                                                                                                                                                                                             
test:                                                                                                                                                                                                             
   var1: value                                                                                                                                                                                                    
   var2: value                                                                                                                                                                                                    
{% else %}                                                                                                                                                                                                        
test:                                                                                                                                                                                                             
   var1: other_value                                                                                                                                                                                              
   var2: other_value                                                                                                                                                                                              
{% endif %}
    
por 11.04.2018 / 17:11
1

Ansible permite que um dos formulários a seguir defina a variável condicionalmente:

    test:
      var1: "{% if my_group_var %}value{% else %}other_value{% endif %}"
      var2: "{{'value' if (my_group_var) else 'other_value'}}"

Combinando a sintaxe acima com a pesquisa vars, podemos carregar vars complexos (lista, neste caso):

test_value_when_my_group_var_is_true:
   var1: value
   var2: value

test_value_when_my_group_var_is_false:
   var1: other_value
   var2: other_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_true') if (my_group_var) else lookup('vars','test_value_when_my_group_var_is_false')}}"

Existe outra maneira de fazer o carregamento de árvore condicional com pesquisa de vars. Dessa forma, é útil quando você precisa implementar lógica de caso (isto é, a variável de condição tem mais de dois valores possíveis):

test_value_when_my_group_var_is_foo:
   var1: value
   var2: value

test_value_when_my_group_var_is_bar:
   var1: other_value
   var2: other_value

test_value_when_my_group_var_is_baz:
   var1: yet_another_value
   var2: yet_another_value

test: "{{ lookup('vars','test_value_when_my_group_var_is_' + my_group_var) }}"
    
por 26.05.2018 / 21:43
0

AFAIK, {} essa coisa que você está tentando é para modelos Jinja2 e não para arquivos yml. Na documentação :

ansible allows Jinja2 loops and conditionals in templates, but in playbooks, we do not use them.

Você pode preparar um arquivo .yml separado com uma reprodução que configura as variáveis que você precisa usar quando cláusulas e, em seguida, as importa (ou as inclui) no seu manual principal. Dessa forma, você pode ter todas as variáveis definidas condicionalmente em um único arquivo.

OR: use papéis. Eu acho que os papéis são a abordagem mais adequada para resolver o seu problema.

    
por 11.04.2018 / 17:29