Estamos entrando em uma discussão interessante e estamos caindo em dois campos. Estou interessado em qualquer problema em particular com a idéia ou as dicas que podemos estar perdendo. Realmente, qualquer coisa que possa nos ajudar a tomar uma decisão ou apontar coisas pelas quais não estamos respondendo. Eu sei que isso contorna a regra "sem opinião" um pouco mais de perto, mas espero que ainda seja uma pergunta aceitável. Desculpe pelo tamanho também, há um pouco de nuance.
1) Um lado (o meu - não estou sem viés) considera o modelo de servidor imutável muito interessante para os sistemas em nuvem. Para esse fim, prototipamos a transferência de todos os componentes de nossa infraestrutura para o Docker. Nossos aplicativos personalizados são construídos via Jenkins diretamente nas imagens do Docker que são implantadas em um Registro do Docker local. Em seguida, criamos um grande conjunto de funções Ansible e um manual capaz de acessar um servidor vazio, instalar o Docker e depois solicitar ao Docker que instale todos os contêineres, conforme necessário. Após alguns minutos, todo o aplicativo e toda a infraestrutura de suporte estão conectados e funcionando - registro, monitoramento, criação / população de banco de dados, etc. A máquina finalizada é um ambiente de controle de qualidade ou desenvolvimento independente, com uma cópia exata do inscrição. Nosso plano de dimensionar isso seria criar novos Playbooks para criar novos servidores da AWS a partir de uma AMI confiável (provavelmente uma imagem muito simples), fazer implantações contínuas do aplicativo de produção para lidar com o gerenciamento e as liberações de configuração e, geralmente, nunca editar servidores novamente - apenas faça-os novamente. Não estou preocupado em conseguir o que descrevi funcionando na prática - apenas se for um modelo razoável.
2) O outro campo quer usar o Puppet para lidar com o gerenciamento de configuração, Ansible para implantar nossos aplicativos personalizados que são tarballs gerados em nosso processo de compilação, o Foreman para lidar com o acionamento e o gerenciamento do processo como um todo e o Katello para fazer alguma quantidade de base gerenciamento de imagens. As versões envolveriam a alteração da configuração do Puppet, conforme necessário, e a Ansible implantaria componentes atualizados com alguma coordenação do Foreman. Os servidores seriam construídos razoavelmente rapidamente se precisássemos de novos, mas a intenção não é torná-los descartáveis como parte do processo padrão. Isso está mais próximo do modelo de servidor phoenix, embora com uma vida útil longa.
Então, minha pergunta realmente se resume a isso: o modelo de servidor imutável com as ferramentas como as descrevi acima é realmente tão realista quanto parece? Adoro a idéia de que nosso processo de preparação pode literalmente criar um clone inteiro dos aplicativos ao vivo, deixe o controle de qualidade martelar e depois inverter o armazenamento do banco de dados e algumas configurações de DNS para torná-lo ativo.
Ou o modelo de servidor imutável falha na prática? Temos uma boa experiência com os ambientes da AWS e da nuvem, então essa não é realmente a preocupação - mais uma questão de como obter um aplicativo razoavelmente sofisticado implantado de forma confiável no futuro. Isso é de particular interesse, pois lançamos com bastante frequência.
Temos o Ansible fazendo a maioria das coisas necessárias, exceto a criação de servidores EC2 para nós e isso não é difícil. Estou tendo problemas para entender por que você realmente precisa de Puppet / Foreman / Katello neste modelo. O Docker é muito mais limpo e simples do que os scripts de implantação personalizados em qualquer ferramenta disponível no mercado. O Ansible parece muito mais simples de usar do que o Puppet quando você para de se preocupar em configurá-los no local e simplesmente constrói-os novamente com a nova configuração. Sou fã do diretor do KISS - particularmente em automação, onde a Lei de Murphy é desenfreada. Quanto menos máquinas, melhor a IMO.
Quaisquer pensamentos / comentários ou sugestões sobre a abordagem serão muito apreciados!
Respostas:
Em nossa empresa, implementamos com sucesso o Puppet na infraestrutura herdada do cliente. Também estamos usando contêineres do Docker para executar um serviço dedicado (que é de fato um aplicativo antigo aparado e torcido para caber nos contêineres).
Eu não estava feliz com os contêineres na primeira vez em que comecei a trabalhar com eles (sim ... o aplicativo de 30kb se torna uma imagem pesada de 200MB), mas quando tive que recriar todo o ambiente após um pequeno desastre, mudei de idéia. Acho que o Docker foi inventado exatamente para isso: implantações rápidas e frequentemente sem preocupações com a configuração do servidor. Se você projetar os contêineres corretamente, poderá alternar entre provedores de nuvem, laptops de desenvolvedor e datacenters de colocation com facilidade. Porque tudo o que você precisa é de uma caixa de baunilha do Linux com o daemon do Docker.
Eu também estava usando o Puppet no meu projeto anterior e minha experiência até agora é que o servidor imutável é possível com o Docker do que com o Puppet ou o Chef. Acredito que as ferramentas de gerenciamento de configuração são mais úteis para os provedores de nuvem do que para a equipe de desenvolvimento.
fonte
Aqui estão os meus 2 centavos de euro.
As 2 opções que você propõe são opções válidas para atingir (algum tipo de) imutabilidade.
Eu acho que você deve escolher o que você está mais confortável.
No entanto, pelo que você escreve, parece que ainda não há consenso.
Talvez uma terceira opção seja necessária, então? ;)
No entanto, como essa imutabilidade não é uma meta, é um meio de garantir outras propriedades (sem desvio de configuração, melhor estabilidade, ...).
Eu declararia claramente meus objetivos, colocaria algumas métricas para validá-los e faria alguns testes usando as 2 opções. Você terá alguns números para selecionar o que está mais alinhado com o seu negócio.
Boa sorte!
fonte