Dependendo do valor (Verdadeiro / Falso) de uma variável definida no 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 neste arquivo.
Meu manual de teste é exibido abaixo:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
O erro que estou recebendo após executar o playbook é:
{% 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 é suportado? Tentei encontrar outra maneira de definir esses vars (eu tenho muitos), mas não consegui algo funcional aqui. Alguma sugestão?
ansible
automation
jinja
pandoJohn
fonte
fonte
template
chamada de módulo.test
for dependente do grupo, ele deve ser colocado em group_vars.Respostas:
Eu não acho que você possa, normalmente crio arquivos separados para armazenar coleções de variáveis condicionais e uso uma
when
cláusula para incluí-los em uma condição específica:fonte
O Ansible permite que um dos seguintes formulários defina a variável condicionalmente:
Combinando a sintaxe acima com a pesquisa de vars, podemos carregar vars complexos (lista neste caso):
Há outra maneira de fazer o carregamento de árvore condicional com pesquisa de vars. Dessa forma, é útil quando você precisa implementar a lógica de caso (ou seja, a variável de condição possui mais de dois valores possíveis):
fonte
Apesar de ser bom, receio que seu caminho não seja possível (ou não estou ciente do caminho certo).
Eu sugiro que primeiro prepare o arquivo vars do modelo jinja e depois inclua-o no include_vars. Veja o exemplo do manual:
O conteúdo do modelo jinja de exemplo /tmp/vars.yaml.j2 é:
fonte
- debug: var=test
posso ver que existem doistest.var1
etest.var2
com os valores esperados. Portanto, você deve poder usar essas variáveis em outras tarefas do manual.AFAIK, isso {} está tentando nos modelos Jinja2 e não nos arquivos yml. A partir da documentação :
Você pode preparar um arquivo .yml separado com uma reprodução que configure as variáveis necessárias usando as cláusulas when e depois importá-las (ou incluí-las) em seu playbook principal. Dessa forma, você pode ter todos os vars definidos condicionalmente em um único arquivo.
OU: Use funções. Acho que os papéis são a abordagem mais adequada para resolver seu problema.
fonte
O que eu fiz no final foi criar 2 arquivos var separados - vamos chamá-los
type_a.yml
etype_b.yml
- e eu defini uma variável de grupo que indica qual arquivo usar - algo assimtype_of_file: a
. É assim que o meu manual se parece agora:Obrigado por todas as respostas. Eu os acho realmente úteis.
fonte
Espero que o seguinte trecho (retirado da Ansible Documentation ) faça uma adição útil às contribuições úteis de outras pessoas acima.
fonte