Essa é uma pergunta muito ampla sobre métodos e conselhos sobre variáveis / estrutura do ambiente. Mas, em última análise, estou procurando respostas para a pergunta muito específica de 'Como devo armazenar minhas variáveis de ambiente?'
Primeiramente alguns esclarecimentos:
- Um ambiente para mim pode ser de 3 a 10 servidores e é uma maneira de conter a infraestrutura de um cliente específico.
- Dentro de cada ambiente, existem algumas variáveis que são geradas automaticamente a partir de algumas entradas principais (nome, tamanho, etc.).
No momento, estamos armazenando todas as nossas variáveis de ambiente em uma estrutura como esta:
<playbook>.yml # Various playbooks for deployment
roles/windows # Ansible role for Ubuntu
roles/ubuntu # Ansible role for Ubuntu
config/hosts/<name>.yml # Ansible inventory
config/hosts/vars/<name>.json # Environment specific variables
No momento, a configuração é inicializada como um submódulo no repositório git acima. Como o arquivo de variáveis muda com bastante frequência, isso causa problemas na alteração dos dados, uma vez, duas ou até três vezes entre confirmações, tornando as alterações cada vez mais difíceis de rastrear.
Do ponto de vista pessoal daqui para frente, devemos procurar armazenar todas as variáveis de nossos clientes de maneira centralizada / escalável e depois conectá-las a ela com um inventário dinâmico e ansible .
Entendo que existem algumas tecnologias que parecem fazer parte do que poderia ser necessário, como o Consul, mas elas parecem funcionar melhor em um ambiente que atende a um grande aplicativo, em vez de muitas pequenas e ligeiramente diferentes.
Essencialmente, vejo-nos tendo que escrever um script de inventário e, em seguida, apenas empurrar todos os nossos dados para algum banco de dados criado não para fins específicos e continuar como se nada tivesse mudado. Vejo isso concebivelmente como uma maneira de reduzir potencialmente muitos dados que armazenamos atualmente e talvez procurar maneiras diferentes de armazenar os dados, em vez de apenas aumentar o que serve novamente.
Espero que alguém tenha algum tipo de experiência na implementação de infraestrutura como código ao ter que lidar com muitos ambientes menores em oposição a um, dois ou três grandes.
Alguma sugestão?
Se seus ambientes forem por cliente, sugiro que, no seu caso específico, tenha um repositório por cliente . (Em geral, é repositório por ambiente.) Esse repositório teria uma estrutura de diretórios padrão para variáveis de ambiente, variáveis e inventários ansíveis, segredos fortemente criptografados (tokens de acesso à conta, chaves privadas etc.). Você submodularia o código nesses repositórios. Eu provavelmente faria isso em vários repositórios. Um para funções e módulos ansible, um para scripts de manutenção e implantação, um para cada aplicativo principal em execução nos ambientes.
Agora você pode opcionalmente dividir o código ou fixar o submódulo em uma tag específica para liberação , certificando-se de que o código que gerencia o ambiente do cliente não seja alterado, a menos que testado e liberado.
Se você estiver usando um repositório de artefatos , verifique se os artefatos estão com versão correta e se essas versões estão especificadas nas variáveis de ambiente corretamente.
A automação é importante porque as variáveis de ambiente não devem ser atualizadas por humanos sempre que possível, mas geradas por scripts. Verifique se quase não há atualizações manuais no inventário por cliente e os desenvolvedores atualizam apenas os repositórios de código. Se eles desejam fazer alterações na configuração, isso deve ser feito em um dos scripts de geração, que é executado para gerar as variáveis e o diff é confirmado no repositório do cliente. Vale a pena configurar a integração contínua para esse processo. Sem isso, em algum momento, haverá muitos repositórios para manter .
fonte