Essa é a parte:
vars_files:
- vars/vars.default.yml
- vars/vars.yml
Se um arquivo vars/vars.yml
não existir - aqui está um erro.
ERROR: file could not read: /.../vars/vars.yml
Como carregar variáveis adicionais desse arquivo somente se ele existir? (sem erros)
De acordo com os desenvolvedores da Ansible , a maneira correta de resolver isso é usar algo como:
Além disso, eles dizem :
fonte
include_vars
na tarefa dará uma alta precedência de variáveis em relação à funçãodefaults
ou #vars
Eu encontrei esse problema em uma instalação na qual eu precisava criar vários ambientes de implantação (ao vivo, demo, sandbox) no mesmo servidor físico (não são permitidas máquinas virtuais aqui) e, em seguida, um script para implantar repositórios svn arbitrários
Isso requeria uma árvore de diretórios de arquivos variable.yml (opcionais), que se fundissem uns sobre os outros e não gerasse uma exceção, se houver alguma, em falta
Comece ativando a mesclagem de variáveis no ansible - observe que isso faz a mesclagem superficial de hash (1 nível de profundidade) e não é a mesclagem profunda totalmente recursiva
ansible.cfg
Layout de diretório responsável
role / deploy / tasks / includes.yml
Essa é a lógica principal de uma árvore de diretórios de arquivos variáveis opcionais.
group_vars / all.yml
Configurar variáveis padrão para o projeto e vários usuários e ambientes
funções / deploy / vars / main.yml
padrões do projeto
funções / deploy / vars / project_1.yml
padrões para project_1
funções / deploy / vars / live / main.yml
padrões para ambiente ativo, substitui os padrões do projeto
funções / deploy / vars / live / project_1.yml
substituições finais para project_1 no ambiente ativo
playbooks / demo.yml
Configurar playbooks separados para cada ambiente
AVISO: Como todos os ambientes vivem em um único host, todos os playbooks devem ser executados individualmente; caso contrário, o Ansible tentará executar todos os scripts como o primeiro usuário de login ssh e usará apenas as variáveis para o primeiro usuário. Se você precisar executar todos os scripts seqüencialmente, use xargs para executá-los como comandos separados.
fonte
Nota: Os testes de caminho (é um arquivo, existe, ...) funcionam apenas com caminhos absolutos ou caminhos relativos ao diretório de trabalho atual ao executar o comando ansible-playbook. Esta é a razão pela qual usamos a pesquisa. a pesquisa aceita caminhos relativos ao diretório do manual e retorna o caminho absoluto quando o arquivo existe.
fonte
Ou de uma maneira mais divertida:
Ou seja, em vez de escrever uma matriz em uma linha com colchetes, como:
Use a maneira yaml de escrever valores de matriz em várias linhas, como:
Conforme mencionado, ele procura um arquivo vars chamado
{{ ansible_hostname }}.yml
, e se ele não existir, usadefault.yml
fonte
{{ ansible_hostname }}.yml
nome do arquivo em vez de../path/to/file1
. Qual é o objetivo? Pode-se adicionar um número ilimitado de nomes de arquivos de entrada.Reunindo várias peças ... include_vars com uma cláusula when que é verdadeira quando o arquivo existe. ie
fonte
Nova resposta com base nas versões mais recentes do Ansible - basicamente, você deve usar
with_first_found
, alémskip: true
de pular a tarefa se nenhum arquivo for encontrado.Isso faz com que você não precise ter um arquivo de fallback vars nessa lista.
Veja relacionados: /programming//a/39544405/100134
fonte