Como usar Variáveis ​​e Vaults Ansible

Como o ExpressVPN utiliza o Ansible

Como usamos o Ansible extensivamente na ExpressVPN

Nossas equipes de desenvolvimento trabalham de forma independente, ou seja, uma equipe possui seu produto por todo o seu ciclo de vida. Essa configuração significa que nosso entendimento do Ansible vem de um conjunto de conhecimentos de muitas equipes diferentes da empresa, e não de um grupo centralizado que gerencia o Ansible.

Uma força de trabalho descentralizada oferece às nossas equipes muita flexibilidade e mobilidade, mas também pressiona as pessoas a saberem muito sobre muitas ferramentas.

Para facilitar o compartilhamento de conhecimento e o uso correto das ferramentas, decidimos padronizar como usamos o Ansible para gerenciamento de configurações e operações do servidor.

Este blog aborda as lições que aprendemos operando em nossa escala, reflexões sobre a maneira como trabalhamos e como gerenciamos o Ansible nesse contexto..

Documentação Ansible

Vamos direto ao assunto! A documentação do Ansible deixa algumas coisas a desejar, especialmente quando se trata da documentação de ponta a ponta (como, como você vai do ponto A ao ponto Z?).

Algumas perguntas que encontramos regularmente são: “Como funciona a precedência variável?” E “Como o Ansible Vault se encaixa?”

Ambos os problemas são documentados muito bem de forma independente (aqui e aqui), e a página Variáveis ​​Ansíveis tem uma seção muito boa sobre precedência explicitamente, mas a interseção dos dois recebe apenas uma breve menção. O problema é que não há links entre a documentação sobre Variáveis ​​e cofres, dando a impressão de que o ônus está no usuário para descobrir como os dois se cruzam..

Hoje, tentaremos cobrir a interseção entre Variáveis ​​e Vaults e as melhores práticas.

Para que você pode usar os arquivos do Ansible Vault

Em resumo: a documentação do Vault afirma que você pode essencialmente criptografar qualquer coisa dentro da pasta Ansible em um arquivo do Vault, e o Ansible tentará decifrá-lo “de maneira inteligente” sempre que uma peça incluir esses arquivos. Hã. Legal!

A documentação sobre variáveis ​​não menciona nada sobre os arquivos do Vault, o que é estranho, pois o Vault foi projetado para arquivos variáveis. Então, como eles se encaixam? É importante notar que Os arquivos do Vault em si não têm significado especial para processamento variável ou precedência, então há muita flexibilidade. Mas, potencialmente, isso não deixa você com informações suficientes sobre como usá-lo corretamente..

Como não usar AnsibleVocê está fazendo isso errado.

Veja este exemplo de uma pasta Ansible simples:

.
├── group_vars
All ├── tudo
Production ├── produção
│ └── encenação
├── ansible.cfg
Inventory── inventário
Play── playbook.yml

À primeira vista, essa configuração parece boa; essa seria uma estrutura relativamente comum a ser produzida se você lesse a documentação. Um observador pode assumir que os arquivos de preparo e produção em group_vars são Vaults, mas isso não é necessariamente verdade, o que por si só é um problema.

Agora, o arquivo “all” não pode ser um arquivo do Vault, pois você (esperançosamente) criptografou os arquivos do Vault de preparação e produção com senhas diferentes. Mas também significa que seu arquivo group_vars para ambientes precisa conter uma mistura de segredos e não segredos, pois você está limitado a um arquivo por ambiente.

Por esse motivo – e se você extrapolou um pouco depois de ler a introdução aos Vaults na documentação Ansible – provavelmente criou os cofres de produção / armazenamento temporário copiando o conteúdo de “all” inicialmente e modificando-os.

Isso significa que seu arquivo “all” pode ficar assim:

base de dados:
nome de usuário: default_user
senha: false

super_important_var_that_should_be_one: 1

E o arquivo do Vault de produção pode ficar assim:

base de dados:
nome de usuário: produser
senha: supersecretpasswordnoonecansee

super_important_var_that_should_be_one: 1

(Não se preocupe, essa não é a nossa senha de produção real! Verificamos duas vezes.)

O exposto acima é perigoso por razões que podem não ser óbvias. Por exemplo, você pode perder a alteração de um padrão para produção, e / ou o arquivo “all” pode até ter o nome errado e nem estar incluído! (Essa é a causa raiz da interrupção que tivemos na semana passada.)

Prática recomendada: como usar os arquivos do Ansible Vault com segurança

Conforme declarado na página de práticas recomendadas, transformar um arquivo em um arquivo do Vault obscurece o conteúdo do arquivo, de modo que eles trazem uma grande desvantagem: você não pode procurar quais são as variáveis ​​no arquivo do Vault sem descriptografá-las explicitamente. Esse sistema significa que quem está olhando para a sua configuração do Ansible não tem idéia do que há dentro desses arquivos sem também saber a senha do Vault (péssimo para análises de código!). Portanto, recomendamos colocar o mínimo de variáveis ​​possível humanamente dentro dos arquivos do Vault. (Em outras palavras, apenas coloque segredos nos arquivos do Vault!)

Então, vamos olhar para uma estrutura que tornaria mais fácil não dar um tiro no próprio pé:

.
├── group_vars
All ├── tudo
Ars │ └── vars.yml
Production ├── produção
Ars │ ├── vars.yml
V │ └── vault.yml
│ └── encenação
V └── vault.yml
├── ansible.cfg
Inventory── inventário
Play── playbook.yml

A documentação de práticas recomendadas também recomenda o uso de uma “camada de indireção”, o que significa que você deve fazer o modelo em todas as variáveis ​​no arquivo do Vault para as variáveis ​​referenciadas nos seus playbooks. Também recomenda que você prefixe suas variáveis ​​do vault com “vault_”, o que significa que todos os seus arquivos / vars.yml podem ser parecidos com:

base de dados:
nome de usuário: default_user
senha: “{{vault_database_password}}” ”

super_important_var_that_should_be_one: 1

Sua produção / vars.yml é mais ou menos assim:

base de dados:
nome de usuário: produser

E seu arquivo de produção / vault.yml deve conter apenas isso:

vault_database_password: supersecretpasswordnoonecansee

Essa estrutura revisada tem alguns benefícios. Antes de tudo, se você estiver fazendo análises de código (faça isso!), Isso significa que seus revisores podem ver o que você mudou, além do que você adicionou e removeu (quase todo) na sua configuração. Com essa estrutura, os revisores não verão apenas uma alteração completa do arquivo no Vault que precisa ser descriptografada manualmente, salva no disco e difere da versão anterior.

E, mais importante, o Ansible falhará, mesmo processando os Vars se estiver faltando o vault_database_password Variável no Vault, o que o salvará de pelo menos uma série de problemas que você poderá encontrar se não estiver acompanhando de perto os arquivos do Vault.

Se você seguir esse padrão, não importa se é um grupo de hosts dentro de um ambiente, um ambiente completo para o qual você está configurando Variáveis ​​ou mesmo a pasta “todos”, seus colegas nunca ficarão confusos sobre o que está ou não dentro o cofre.

Por enquanto, esperamos que tenha sido útil para você.!