Eu mantenho dois datacenters e, à medida que mais de nossa importante infraestrutura começa a ser controlada via fantoche, é importante que o mestre de fantoches trabalhe no segundo local, caso nosso site principal falhe.
Melhor ainda seria ter um tipo de configuração ativo / ativo para que os servidores no segundo site não pesquisem a WAN.
Existem métodos padrão de alta disponibilidade de bonecos para vários locais?
puppet
high-availability
Kyle Brandt
fonte
fonte
git
ousvn
oursync
ou qualquer versão de controle do sistema que você usa ser o que você precisa de escala para fora em vez do mestre de marionetes.Respostas:
O Puppet realmente se presta muito bem a ambientes com vários mestres, com ressalvas. O principal? Muitas partes do Puppet gostam de ser centralizadas. A autoridade de certificação, os serviços de inventário e painel / relatório, a coleta de arquivos e as configurações armazenadas - todas estão no seu melhor (ou simplesmente exigem) uma configuração em que há apenas um lugar para conversar.
No entanto, é bastante viável fazer com que muitas dessas partes móveis funcionem em um ambiente multimestre, se você concorda com a perda graciosa de algumas das funcionalidades quando perde o site principal.
Vamos começar com a funcionalidade básica para obter um relatório de nó para um mestre:
Módulos e Manifestos
Esta parte é simples. Versão controlá-los. Se for um sistema de controle de versão distribuído, centralize e sincronize, e altere o fluxo push / pull conforme necessário no site de failover. Se for o Subversion, você provavelmente desejará
svnsync
o repo no seu site de failover.Autoridade de Certificação
Uma opção aqui é simplesmente sincronizar os arquivos da autoridade de certificação entre os mestres, para que todos compartilhem o mesmo certificado raiz e sejam capazes de assinar certificados. Isso sempre me pareceu "fazer errado";
Não posso dizer honestamente que fiz testes completos dessa opção, pois parece horrível. No entanto, parece que o Puppet Labs não está buscando incentivar essa opção, conforme a nota aqui .
Então, o que resta é ter um mestre da CA central. Todas as relações de confiança permanecem funcionando quando a CA está inativa, pois todos os clientes e outros mestres armazenam em cache o certificado da CA e a CRL (embora não atualizem a CRL com a frequência que deveriam), mas não será possível assinar novos certificados até você faz o backup do site primário ou restaura o mestre da CA a partir de backups no site de failover.
Você escolherá um mestre para atuar como CA e terá todos os outros mestres desativados:
Então, você deseja que esse sistema central obtenha todo o tráfego relacionado ao certificado. Existem algumas opções para isso;
SRV
suporte de registro no 3.0 para apontar todos os nós do agente para o local certo para a CA -_x-puppet-ca._tcp.example.com
ca_server
opção de configuração empuppet.conf
todos os agentesProxy todo o tráfego de solicitações relacionadas a CA dos agentes para o mestre correto. Por exemplo, se você estiver executando todos os seus mestres no Apache via Passenger, configure isso nas não CAs:
E isso deveria bastar.
Antes de prosseguirmos para os serviços auxiliares, uma nota lateral;
Nomes DNS para certificados principais
Penso que esta é a razão mais convincente para mudar para a 3.0. Digamos que você queira apontar um nó para "qualquer outro mestre de trabalho".
Em 2.7, você precisaria de um nome DNS genérico como
puppet.example.com
, e todos os mestres precisam disso em seus certificados. Isso significa definirdns_alt_names
em sua configuração, reemitir o certificado que eles possuíam antes de serem configurados como mestre, reemitir o certificado novamente quando você precisar adicionar um novo nome DNS à lista (como se você quisesse vários nomes DNS). agentes preferem mestres em seu site) .. feia.Com o 3.0, você pode usar
SRV
registros. Dê a todos os seus clientes isso;Então, não são necessários certificados especiais para os mestres - basta adicionar um novo registro ao seu
SRV
RR em_x-puppet._tcp.example.com
e pronto, é um mestre ao vivo no grupo. Melhor ainda, você pode facilmente tornar a lógica da seleção principal mais sofisticada; "qualquer mestre de trabalho antigo, mas prefira o do seu site", configurando conjuntos deSRV
registros diferentes para sites diferentes; não édns_alt_names
necessário.Relatórios / Painel
Este funciona melhor centralizado, mas se você pode viver sem ele quando o site principal está inativo, então não há problema. Basta configurar todos os seus mestres com o local correto para colocar os relatórios.
..e está tudo pronto. A falha no upload de um relatório não é fatal para a execução da configuração; apenas será perdido se o servidor do painel brindar.
Inventário de fatos
Outra coisa interessante a ser colada no painel é o serviço de inventário. Com o
facts_terminus
conjuntorest
conforme recomendado na documentação, isso realmente interromperá a configuração quando o serviço central de inventário estiver inoperante. O truque aqui é usar oinventory_service
terminal nos mestres não centrais, o que permite falhas graciosas.Configure seu servidor de inventário central para armazenar os dados de inventário por meio do ActiveRecord ou do PuppetDB e mantenha-se atualizado sempre que o serviço estiver disponível.
Portanto, se você estiver de acordo com um ambiente de gerenciamento de configurações bastante barebones, no qual não pode nem usar a CA para assinar um novo certificado de nó até que seja restaurado, isso pode funcionar muito bem - embora seja muito bom se alguns desses componentes fossem um pouco mais amigáveis para serem distribuídos .
fonte
SRV
registro em conformidade -SRV
registros me parece a solução mais elegante aqui, apesar da minha ambivalência geral em direção a eles ...)A abordagem "fantoche sem mestre" que Ladadadada descreve é a que mais me familiariza (é basicamente o que fazemos com o radmind na minha empresa). Eu acho que com mais precisão é "Vários mestres sincronizados por um processo externo", onde qualquer servidor pode (teoricamente) servir todo o nosso universo em uma emergência.
No nosso caso, devido à natureza do radmind, simplesmente
rsync
as transcrições e os arquivos de dados de um mestre aprovado para o servidor de radmind de cada site remoto, e os clientes obtêm suas atualizações do servidor com um nome de host abreviadoradmind
(através da magiaresolv.conf
disso, avaliaradmind.[sitename].mycompany.com
- sempre o local Se o servidor local estiver inativo, é fácil substituir e apontar para o servidor de qualquer outro site).Esse tipo de processo rsync provavelmente também funcionaria na sua situação, mas provavelmente é subótimo comparado a uma solução baseada em controle de versão.
Para fantoches ou chefs, um sistema baseado em controle de versão faz mais sentido do que simples rsync por alguns motivos - o grande problema é que você está controlando scripts fantoches de versão (em vez de imagens inteiras do SO, como faria com radmind).
Como benefícios adicionais do gerenciamento baseado em controle de versão, você pode ter várias pessoas trabalhando no repositório de uma só vez (grande vitória para o paralelismo), obtendo o histórico de revisões essencialmente de graça e, se alguém quebrar o ambiente do Puppet, você terá uma reversão fácil (presumindo que você ' re usando
git
você também tem ogit blame
que faz o que diz na lata).A ramificação e mesclagem de criativos permitem que você lide com uma grande atualização do sistema operacional ou outra transição dentro da estrutura de controle de versão - Depois de acertar, mude para a nova ramificação e (esperamos) que o impulso da produção funcione.
Se eu estivesse implementando isso aqui, provavelmente aproveitaria os ganchos de pré-confirmação e pós-confirmação no git para garantir que as configurações de fantoches que estão sendo confirmadas sejam saudáveis (pré do lado do cliente) e enviá-las para o resto do universo, se are (pós-servidor - possivelmente também acionando uma atualização do ambiente se suas políticas de implantação permitirem esse comportamento).
Em termos de criação de novos servidores puppetmaster em cada site, você pode simplesmente verificar o ambiente puppet para cada puppetmaster remoto e usar o hackery resolv.conf / hostname que descrevi acima ou os IPs de serviços anycast redirecionados para sistemas locais, como Michuelnik sugeriu ( o último é útil se você desejar o failover automático se o puppetmaster de um site explodir) para garantir que cada site veja o puppetmaster "certo" e não obstrua os links da WAN tentando obter atualizações.
Aparentemente, o pessoal da Brain Tree Payments combinou as soluções de controle de versão e rsync com algumas tarefas personalizadas do Capistrano - a solução parece incompleta no sentido de que ainda depende de elementos de fluxo de trabalho manual, mas pode ser adaptada e automatizada sem muito trabalho.
O testador paranóico compulsivo em mim gosta de sua
noop
etapa de verificação de sanidade - os processos odiosos de manuais em mim desejam algum nível de automação em torno dele ...fonte