Estou tentando escolher um sistema de gerenciamento de configuração para 500-2.000 hosts muito distribuídos geograficamente. Devido à variação da confiabilidade da rede, é possível que vários hosts estejam temporariamente indisponíveis em um determinado momento. Por esse motivo, minha escolha inicial foi o Chef, pois ele usa um modelo "pull" e, quando os hosts ficam online e fazem o check-in, eles obtêm imediatamente a configuração atual.
No entanto, se meus hosts pesquisarem apenas o servidor Chef para novas configurações a cada 30 minutos, implantações rápidas serão impossíveis. Além disso, não sou rubista. Prefiro usar um modelo baseado em push, onde posso enviar a configuração aos hosts o mais rápido possível. Portanto, as escolhas naturais parecem ser Ansible ou SaltStack (provavelmente SaltStack). Mas minha pergunta é: como o Ansible e o SaltStack lidam com hosts com falha ou inativos? Existe alguma maneira de continuar tentando um push indefinidamente até que um host volte a ficar online? Existem padrões existentes para lidar adequadamente com a consistência eventual de hosts inativos com qualquer uma dessas ferramentas? Obrigado!
Só posso responder isso pelo Ansible.
O próprio Ansible não lida com hosts que não são acessíveis. Ele tentará se conectar uma vez e, se isso não for possível, o host será expulso do jogo atual. Mas o Ansible oferece algumas ferramentas para você lidar com isso sozinho.
Primeiro, há o módulo wait_for . Com isso, você pode esperar com um tempo limite muito alto até que os hosts estejam disponíveis.
Isso por si só seria um problema quando você executa o jogo, porque o Ansible, por padrão, não processaria nenhuma outra tarefa até que todos os hosts passassem por essa tarefa. O que é contraproducente neste caso. De acordo com sua descrição, os primeiros hosts podem ficar novamente indisponíveis quando o último host finalmente estiver acessível.
Para isso resolver você precisa usar o Ansible 2, que possui um novo recurso chamado strategy .
strategy: free
permite que você execute todas as tarefas o mais rápido possível, o que significa que executa todas as tarefas assim que o host estiver disponível.Ainda assim, uma conexão pode cair e, nesse caso, não há uma maneira integrada de tentar novamente automaticamente. Se a conexão ssh não puder ser estabelecida, um erro fatal será lançado para este host e desde o Ansible ~1.9. não há como detectar esse tipo de erro de conexão. Isso não afeta outros anfitriões, porém, todos eles jogarão bem.
Você pode tentar novamente. Hosts com falha serão armazenados em um arquivo
<playbook-name>.retry
próximo ao próprio playbook. Para repetir apenas hosts com falha, você pode executar:Salt é executado em um modelo pull dos nós para o mestre. Você pode emitir comandos globais do mestre como
Isso executará um estado alto em todos os hosts que possuem um id (hostname) de api*.domain.com. Um estado elevado é como uma corrida completa de chef.
Normalmente, por padrão, as pessoas terão a programação principal de estado alto executada nos lacaios ou executarão a programação nos próprios lacaios para executar um estado alto a cada 10 minutos.
Portanto, se um nó estiver inativo e você executar um comando no mestre para executar um estado, o salt informará que o nó está inativo em sua saída de execução, que pode ser formatada de várias maneiras diferentes para você ingerir. Pode até ser registrado no mysql, por exemplo.
Por exemplo, se você executou o comando acima no servidor mestre para executar um estado alto em todos os
api*.domain.com
nós. Se 2 dos 5000 estivessem reiniciando no momento, umasalt-minion
vez que voltassem online, eles receberiam o mesmo do mestre por meio do barramento de mensagens e executariam o estado alto.Salt também tem uma coisa chamada nós de proxy para ajudar no carregamento de um mestre. Você pode ter um único mestre em algum lugar e um nó proxy em cada datacenter e todos os comandos enviados do mestre passam pelos nós proxy e os lacaios nesses datacenters atingem seu nó proxy e nunca o mestre
Para estender a resposta de Mike, você pode empurrar e puxar simultaneamente com Salt. Empurrar é tão fácil quanto
Ao mesmo tempo, seus lacaios podem fazer pull programado a cada X minutos ou horas por meio do agendador integrado . Meu método preferido é configurá-lo via pilar, mas adicioná-lo à configuração do minion também funciona. Algo como: