Opções para alta disponibilidade multissite com Puppet

14

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?

Kyle Brandt
fonte
1
Eu entendi sua pergunta, certo? Você está procurando uma maneira de ter um mestre de bonecos redundante, caso o mestre de bonecos não esteja disponível?
Hrvoje Špoljar 01/10/12
Depende de como você está usando o boneco. Há muita flexibilidade. Por exemplo, você está usando configurações armazenadas?
Zoredache
3
Você já olhou para "fantoche sem mestre"? A essência disso é que cada agente faz uma verificação geral dos manifestos e os aplica localmente. Você acaba com gitou svnou rsyncou 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.
Ladadadada 1/10/12
3
Apenas uma dica para resolver a pergunta ativo-ativo: Você pode usar o anycast para anunciar o mesmo IP ( "virtual" / "Serviço-" ) dos dois datacenters. Fazemos isso para nossos servidores DNS de resolução. Em cada data center, nossos balanceadores de carga anunciam o mesmo IP anycast. Nosso roteamento prefere o balanceador de carga local, mas retorna aos outros controladores de domínio em caso de falha (~ "não está mais anunciando o IP anycast").
Michuelnik 1/10/12
1
Vejo que um dos novos recursos do fantoche 3.0 é o suporte a registros SRV , algo com o qual as pessoas do Windows estão bem familiarizadas e podem ajudar com as coisas do Site.
sysadmin1138

Respostas:

13

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á svnsynco 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";

  • Um mestre deve realmente ver seu próprio certificado apresentado na autenticação do cliente para uma conexão de entrada de outro mestre como válida?
  • Isso funcionará de forma confiável para o serviço de inventário, painel, etc?
  • Como você adiciona nomes alternativos de DNS válidos adicionais no caminho?

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:

[main]
    ca_server = puppet-ca.example.com
[master]
    ca = false

Então, você deseja que esse sistema central obtenha todo o tráfego relacionado ao certificado. Existem algumas opções para isso;

  1. Use o novo SRVsuporte 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
  2. Configure a ca_serveropção de configuração em puppet.conftodos os agentes
  3. Proxy 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:

    SSLProxyEngine On
    # Proxy on to the CA.
    ProxyPassMatch ^/([^/]+/certificate.*)$ https://puppet-ca.example.com:8140/$1
    # Caveat: /certificate_revocation_list requires authentication by default,
    # which will be lost when proxying. You'll want to alter your CA's auth.conf
    # to allow those requests from any device; the CRL isn't sensitive.
    

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 definir dns_alt_namesem 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 SRVregistros. Dê a todos os seus clientes isso;

[main]
    use_srv_records = true
    srv_domain = example.com

Então, não são necessários certificados especiais para os mestres - basta adicionar um novo registro ao seu SRVRR em _x-puppet._tcp.example.come 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 de SRVregistros diferentes para sites diferentes; não é dns_alt_namesnecessá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.

[master]
    reports = http
    reporturl = https://puppetdash.example.com/reports/upload

..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_terminusconjunto restconforme recomendado na documentação, isso realmente interromperá a configuração quando o serviço central de inventário estiver inoperante. O truque aqui é usar o inventory_serviceterminal nos mestres não centrais, o que permite falhas graciosas.

facts_terminus = inventory_service
inventory_server = puppet-ca.example.com
inventory_port = 8140

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 .

Shane Madden
fonte
1
+1 para o material da CA. Observe que você pode sincronizar / controlar a versão de todos os itens da CA e simplesmente não ativar nenhum deles nos puppetmasters "em espera" até que ocorra uma situação de failover (nesse momento, você ativa os bits da CA no seu novo "mestre" e atualiza o SRVregistro em conformidade - SRVregistros me parece a solução mais elegante aqui, apesar da minha ambivalência geral em direção a eles ...)
voretaq7
1
@ voretaq7 Esse é um bom ponto - uma configuração puramente de failover seria muito menos trabalhosa que esse tipo de implantação ativa / ativa.
Shane Madden
2
Como adendo, também contribuí com uma atualização do guia de dimensionamento multimestre nos documentos fantoches, que também contém boas informações: docs.puppetlabs.com/guides/scaling_multiple_masters.html
Shane Madden
8

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 rsyncas 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 abreviado radmind(através da magia resolv.confdisso, avalia radmind.[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 gitvocê também tem o git blameque 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 noopetapa de verificação de sanidade - os processos odiosos de manuais em mim desejam algum nível de automação em torno dele ...

voretaq7
fonte