Ao criar uma nova função Ansible, o modelo cria a vars
e um defaults
diretório com um main.yml
arquivo vazio . Ao definir minha função, posso colocar definições de variáveis em qualquer uma delas e elas estarão disponíveis em minhas tarefas.
Qual é a diferença entre colocar as definições em defaults
e vars
? O que deve entrar defaults
e o que deve entrar vars
? Faz sentido usar os dois para os mesmos dados?
Sei que há uma diferença de precedência / prioridade entre os dois, mas gostaria de entender o que deve ir aonde.
Digamos que minha função criaria uma lista de diretórios no sistema de destino. Gostaria de fornecer uma lista de diretórios padrão a serem criados, mas gostaria de permitir que o usuário os substitua ao usar a função.
Aqui está como isso seria:
---
- directories:
- foo
- bar
- baz
Eu poderia colocar isso no defaults/main.yml
ou no vars/main.yml
, de uma perspectiva de execução, não faria diferença - mas para onde deveria ir?
defaults
e o quevars
mais adiante.As variáveis de função definidas em
var
têm uma precedência muito alta - elas só podem ser substituídas passando-as na linha de comando, na tarefa específica ou em um bloco. Portanto, quase todas as suas variáveis devem ser definidas emdefaults
.No artigo " Precedência variável - onde colocar suas funções ", o autor fornece um exemplo do que colocar
vars
: constantes constantes do sistema que não mudam muito. Portanto, você pode tervars/debian.yml
evars/centos.yml
com os mesmos nomes de variáveis, mas com valores diferentes e incluí-los condicionalmente.fonte
IMHO é impraticável e não sensato que lugares ansible como alta prioridade à configuração no vars de papéis . A configuração
vars/main.yml
edefaults/main.yml
deve ser baixa e provavelmente a mesma prioridade.Existem exemplos reais de casos em que queremos esse tipo de comportamento?
Existem exemplos de que não queremos isso.
O ponto a ser destacado aqui é que a configuração
defaults/main.yml
não pode ser dinâmica. Configuração novars/main.yml
can. Portanto, por exemplo, você pode incluir a configuração para SO e versão específicos dinamicamente, conforme mostrado em geerlingguy.postgresqlMas como a precedência é tão estranha e impraticável no Ansible, o geerlingguy precisa introduzir pseudo variáveis, como pode ser visto nas variáveis.yml
Este é um exemplo concreto da vida real que demonstra que a precedência é impraticável.
Outro ponto a ser destacado aqui é que queremos que as funções sejam configuráveis. As funções podem ser externas, gerenciadas por outra pessoa. Como regra geral, você não deseja que a configuração em funções tenha alta prioridade.
fonte
Basicamente, tudo o que entra em "padrões da função" (a pasta de padrões dentro da função) é o mais maleável e facilmente substituído. Qualquer coisa no diretório vars da função substitui as versões anteriores dessa variável no espaço para nome. A idéia a seguir é que, quanto mais explícito você entrar no escopo, maior será a precedência da linha de comando - e vars extras sempre ganhando. Variáveis de host e / ou inventário podem conquistar padrões de função, mas não inclusões explícitas, como o diretório vars ou uma tarefa include_vars. doc
fonte
Variáveis e padrões andam de mãos dadas. aqui está um exemplo
no seu arquivo de padrões, você teria algo como:
O que o ansible fará é, ele pegará o valor
package_version
e o colocará ao lado do nome do pacote para que ele seja lido em algum lugar como:Dessa forma, ele será instalado
xyz123
e nãoxyz123.4
ou o que estiver no grande repositório do xyz's.No final, ele fará
yum install -y xyz123
Então, basicamente, os padrões são os valores presentes; se você não definir um valor específico para as variáveis, esse espaço não poderá ficar vazio.
fonte
defaults
são usados quando não hávars
definições, mas a resposta não explica por que você definiria um valor como um ou outro, que é o que o OP pediu. Compare com a explicação abaixo.