fundo
- Usamos o Ansible para provisionar e gerenciar a infraestrutura do Azure. No momento, executamos o Ansible "manualmente", ou seja, executamos playbooks manualmente para várias tarefas automatizadas. Nenhuma infraestrutura de IC.
- Provavelmente não é relevante, mas gerenciamos nosso inventário usando script dinâmico
azure_rm.py
. - Somos encorajados a ser o mais seguro possível, ou seja,
- Não armazene senhas do Vault em
~/.vault_pass
ou em nenhum arquivo local - Não armazene segredos do Azure em
~/.azure/credentials
- Não guarde nada seguro
.bashrc
.
- Não armazene senhas do Vault em
Nesse cenário, estou tendo problemas para apresentar uma estratégia coerente para garantir que meus playbooks possam acessar os segredos do Azure, seguindo as diretrizes acima.
Questão
Como evitar o armazenamento de credenciais do Ansible Vault e do Azure em arquivos, garantindo ainda que meus playbooks possam acessá-los?
O que eu tentei
Até agora, criei um script de wrapper que
- pede ao usuário a senha do Vault
- Usa isso para descriptografar um script do Vaulted Shell
- Avalia o script, que carrega variáveis de ambiente do Azure no ambiente;
- Executa o manual sobre o ambiente que foi definido.
Alguma solução melhor (mais elegante, menos complicada, mais "Ansible") por aí?
ansible
ansible-vault
Vish
fonte
fonte
Respostas:
Senha do Vault
Primeiro de tudo, você deve se familiarizar com o fato de que o arquivo de senha do cofre pode ser um script executável. Nesse caso, o Ansible o executa e espera receber a senha como saída.
Por exemplo, você pode usar
gpg-agent
oukeychain
armazenar sua senha real e desbloqueá-la quando necessário. Leia mais nesta postagem do blog: https://benincosa.com/?p=3235Se você é um pouco paranóico, pode adicionar uma notificação quando seu script de senha é chamado, assim:
Esse script de senha do cofre usa
key.gpg
como chave de cofre real e também mostra a notificação pop-up (para MacOS) com o nome do processo pai quando o script é usado. Os caches do agente Gpg desbloqueiam a senha por algum tempo, portanto não há necessidade de digitar a senha sempre que você iniciar o playbook.Basta definir
vault_password_file = ./vault_pass.sh
no seuansible.cfg
.Meio Ambiente
Você disse que usa
azure_rm.py
como script de inventário dinâmico. Isso significa que você precisa definir credenciais em suas variáveis de ambiente antes de iniciar o ansible-playbook para que ele possa usá-las.Você pode criar dois arquivos:
secure_env
(criptografado com cofre):set_env
(texto simples):Quando você abre um novo terminal para executar suas tarefas de automação, é necessário executar:
Neste momento, o bash avalia
set_env
esecure_env
(descriptografado via ansible-vault). Após esse comando, você tem credenciais do Azure definidas para o shell atual, para executar playbooks como de costume:Portanto, usando essas duas abordagens, você pode armazenar
key.gpg
esecure_env
em seu repositório; depois, na nova chamada do terminalsource set_env
uma vez, digite a senha gpg uma vez (para desbloquear o uso futuro de key.gpg); em seguida, ligueansible-playbook
quantas vezes quiser sem nenhuma senha.fonte
source
abordagem, você define o ambiente uma vez por sessão do terminal e pode usar toda a gama de ferramentas separadamente: manuais de instruções, scripts de inventário, cli do azure, sem nenhum wrapper.Leia https://docs.ansible.com/ansible/2.4/vault.html Desde o Ansible 2.4, pode-se usar
--vault-id @prompt
.Criptografe um arquivo usando o ansible-vault:
Execute o manual e ele resultará em:
Existem várias opções para descriptografar arquivos, incluindo
@prompt
:solicitará:
Depois que a senha do cofre for inserida, o manual deverá ser bem-sucedido.
fonte
--ask-vault-pass
opção mais antiga . E não entendo como substituí-lo--vault-id
responderia à questão maior de um melhor fluxo de trabalho.ansible-playbook --vault-id my-vault-password.py
. Eu pensei que talvez você tivesse uma solução usando um script python :) Eu também estou pensando um pouco sobre esse.