Atualizações do sistema para muitos servidores

11

Temos muitos servidores e ainda queremos atualizá-los todos. A maneira real é que qualquer um dos administradores de sistema vá de servidor em servidor e faça um aptitude update && aptitude upgrade- ainda não é legal.

Estou procurando agora uma solução que seja ainda melhor e muito inteligente. O fantoche pode fazer este trabalho? Como você faz isso?

Dennis Wisnia
fonte
sim, fantoche pode fazer isso. O cssh também resolveria seu problema no curto prazo.
precisa saber é o seguinte

Respostas:

10

Você pode usar o exectipo como:

exec { "upgrade_packages":
    command => "apt-get upgrade -q=2",
    path    => "/usr/local/bin/:/bin/:/usr/bin/",
    # path  => [ "/usr/local/bin/", "/bin/" ],  # alternative syntax
}

Para ser sincero, eu não tentei, mas acho que você só precisa criar um novo módulo que inclua essa definição de exec.

O apt-get upgradecomando é interativo. Para fazê-lo funcionar silenciosamente, você pode adicionar a opção -q=2como mostrado acima.

Khaled
fonte
Parece muito bom! Eu acho que criei um Puppet Usecase com alguns Testmachines para tentar isso. Muito Obrigado!
Dennis Wisnia
3
+1 por recomendar o Puppet! Muda a sua vida como um sysadmin :)
Antoine Benkemoun
3
Lembre-se de que esse executivo será executado a cada execução do Puppet (a cada 30 minutos), o que poderá prejudicar bastante o seu proxy e / ou o seu espelho se você tiver "muitos servidores". Pessoalmente, eu recomendaria implementar uma programação para o tipo exec acima, certificando-se de que seja executado apenas à noite, por exemplo. Na minha opinião, porém, o Puppet deve reforçar o estado do sistema, e executar um comando do tipo upgrade_packages sem a supervisão humana dele, é um pouco assustador e um pouco de abuso do Puppet. A ferramenta mColective fornecida com o Puppet Enterprise (ou equivalente em código aberto) pode ser uma opção melhor.
wzzrd
7
Nossa instalação fantoche possui um executivo semelhante que verifica o carimbo de data e hora em um arquivo e só executa a atualização se for mais recente que a versão no cliente. Quando queremos atualizar tudo, nós toucharquivamos no mestre de marionetes.
Ladadadada
@ wzzrd: Bom argumento, mas pode ser melhorado verificando alguma condição externa, como disse Ladadadada.
Khaled
7

se todos os seus hosts forem debian, você pode tentar o pacote de atualizações autônomas.

http://packages.debian.org/sid/unattended-upgrades

Aqui estamos usando o puppet para gerenciar nossas máquinas virtuais debian, com o puppet somos capazes de habilitar e gerenciar configurações de atualização sem precedentes em todos os servidores.

Recentemente, nossa equipe está testando a ferramenta mcollective para executar comandos em todos os servidores, mas para usar as habilidades de Ruby do mcollective são necessárias.

[s] Guto

gutocarvalho
fonte
5

Eu recomendaria ir para Puppet, facter e mCollective.

O mCollective é uma estrutura muito boa, na qual você pode executar comandos em uma série de hosts (em paralelos) usando o filtro como filtro.

Acrescente a isso um proxy / cache local e você estará bem definido para o gerenciamento de servidores.

CloudWeavers
fonte
Concordo que o Puppet não é realmente a melhor ferramenta para gerenciar ações administrativas, como atualizações de pacotes em massa / orquestradas.
robbyt
3

Use uma ferramenta feita para executar um único comando em vários servidores. E com isso não quero dizer ter um kazillion de terminais abertos com o Terminator ou o ClusterSSH, mas sim um único terminal para um servidor de gerenciamento executando uma ferramenta adequada para o trabalho.

Eu recomendaria func, Salt ou mCollective neste contexto. Se você já possui o Puppet, escolha o mCollective (ele se integra perfeitamente ao Puppet). Se não, e você tem um Python antigo em suas máquinas, pode desfrutar de func. Se você usa Python de novo, tente o Salt. Todas essas ferramentas executam o comando especificado na linha de comando de forma assíncrona, o que é muito mais divertido do que um loop ssh seqüencial ou mesmo executando os mesmos comandos de aptidão em várias janelas do Terminator em vários servidores.

Você definitivamente vai adorar Salt .

wzzrd
fonte
2

Então, acho que há muitas coisas que contribuem para uma boa solução:

  • Largura de banda
  • Facilidade de administração
  • Registro detalhado no caso de algo estragar.

Largura de banda : Basicamente, duas alternativas para economizar largura de banda vêm à minha mente:

  • Configurando um espelho Debian e configurando todos os seus clientes para usar esse espelho, consulte http://www.debian.org/mirror/ para mais detalhes. (Eu recomendaria isso)
  • Configurando um proxy (apt-cacher, apt-proxy ou Squid) e aumente o cache para que todos os seus clientes possam lucrar com esse cache

Administração : eu configuraria um shell paralelo como PDSH , PSSH , GNU Parallel e emitiria o comando em todos os clientes, se eu testasse o comando anteriormente em uma máquina de exemplo. Então não é muito provável que possa falhar em todos os outros. Como alternativa, você pode considerar um trabalho cron em todos os clientes, mas ele pode falhar automaticamente, então eu preferiria a primeira solução.

Se você se preocupa com a simultaneidade de atualizações, pode agendar seus comandos com at

Log : Como com shells paralelos, você tem a possibilidade de redirecionar a saída, eu combinaria stderr e stdout e gravaria em um arquivo de log.

matemática
fonte
Largura de banda: existem proxies de cache específicos para repositórios deb, procure apt-cacher ou apt-proxy.
S19N
Ótimo, vou integrar isso na resposta.
math
e software como o mCollective permite a execução de comandos paralelos E relata a saída / resultado.
CloudWeavers
1

Meu próprio wrapper ssh paralelo: classh é uma alternativa para as várias ferramentas ssh Parallel e cluster por aí.

Você pode gostar mais ou odiar. Existem apenas três razões pelas quais estou mencionando aqui:

  • É extremamente simples de instalar e usar: um único arquivo .py sem dependências externas além das bibliotecas padrão do Python 2.5.
  • É extremamente confiável dentro de seus limites. Eu o uso todos os dias úteis, geralmente quase 100 vezes por dia e geralmente em coleções de centenas a alguns milhares de alvos por comando. (Eu testei em listas de mais de 25 mil servidores por vez). Nunca falhou em executar, falhou em concluir ou me deu um comportamento indeterminado. (As únicas limitações relacionadas às do subprocess.communicate()método Python --- para que você possa obter apenas 64K de stdout e, separadamente, até 64K de stderr, por exemplo; também qualquer processo remoto que tente ler a partir de seu stdin simplesmente travará até que o sub-acesso local do ssh seja eliminado, automaticamente pelo tratamento de tempo limite do classh )
  • É extremamente simples escrever um script personalizado, em Python, para usar o classh.py como módulo. Portanto, é muito fácil escrever algo como:

    
        !#/bin/env python
        import classh
        job = classh.SSHJobMan(cmd, targets)
        job.start()
        while not job.done():
            completed = job.poll()
            for i in completed:
                # do something with the classh.JobRecord object referenced by i
        # done

    # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre>

É tudo o que há para isso. Por exemplo, no loop concluído aninhado, você pode reunir uma lista de todos aqueles que retornaram algum status de saída específico ou verificar mensagens de erro específicas e configurar tarefas de acompanhamento para lidar com elas. (Os trabalhos serão executados simultaneamente, o padrão é de 100 trabalhos a qualquer momento, até que cada um seja concluído; portanto, um comando simples em algumas centenas de hosts geralmente é concluído em alguns segundos e um script de shell muito complexo em uma única cadeia de comandos longa. digamos cinquenta linhas ou mais ... podem concluir mais de alguns milhares de hosts em cerca de 10 minutos ... cerca de 10 mil hosts por hora no meu ambiente, com muitos deles localizados intercontinentalmente).

Portanto, isso pode ser algo que você pode usar como uma medida ad hoc até que sua configuração de marionetes seja implementada e teste bem ... e também é útil para realizar pequenas pesquisas ad hoc de seus hosts para ver quais estão se desviando de seus padrões. várias pequenas maneiras.

Jim Dennis
fonte
Aliás, nas páginas da web classh, em bitbucket.org há também uma lista dos vários outros invólucros ssh que eu pesquisei antes de decidir escrever meus próprios. Qualquer um deles pode funcionar para você. Além disso, você pode procurar o Python Fabric, que é um projeto mais novo com recursos semelhantes, embora um pouco mais extensos e um pouco mais complexos.
perfil completo de Jim Dennis
1

A resposta usando exec é bastante útil.

No entanto, de acordo com o manual do apt-get, não é uma boa ideia usar -q = 2 dessa maneira (embora eu o tenha usado há anos sem problemas)

-q, --quiet
       Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the
       quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or
       -s as APT may decided to do something you did not expect. Configuration Item: quiet.

Eu mesmo tenho usado um script há anos, executando o apt-get da seguinte maneira:

ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean"

Coisas como fantoches e outras ferramentas que as pessoas mencionaram com certeza podem funcionar, mas parece que é um exagero pelo que basicamente está apenas imitando alguns comandos digitados por um humano. Acredito em usar a ferramenta mais simples para um trabalho específico; nesse caso, um script bash é o mais simples possível sem perder a funcionalidade.

aseq
fonte
Sim, acho que é um bom caminho para alguns servidores. Mas se eu tiver mais algumas opções (implantar algumas configurações em cada servidor, etc.), então o fantoche é a melhor maneira. Eu trabalho no momento em fantoche e sua bela ..
Dennis Wisnia
Eu não discordo. Mas com o objetivo do que o pôster estava perguntando sobre isso, pode ser um exagero.
aseq
1

Por anos, eu estou felizmente atualizando e instalando pacotes usando o apt-dater . É uma ferramenta leve e eficaz para gerenciamento remoto de pacotes. Ele usa screen, sudoe ssh.
Para gerenciamento de pacotes, o apt-dater pode ser uma solução mais fácil do que as ferramentas de gerenciamento de configuração.
O apt-dater é útil para o gerenciamento centralizado de pacotes em diferentes tipos de GNU / Linux, como Debian e CentOS.

Onlyjob
fonte
1

você pode usar o Fabric . O Fabric é uma biblioteca e ferramenta de linha de comando Python (2.5-2.7) para otimizar o uso do SSH para tarefas de implantação de aplicativos ou administração de sistemas.

homem livre
fonte
0

use webmin ,,, e use seu recurso de cluster webmin, no qual você pode adicionar todos os sistemas a um console do webmin e emitir-lhes qualquer comando ou controle de todos eles em um único local.

Ou

Usar Cluster ssh

Ou

PSSH

Farhan
fonte
Sim, eu realmente posso abrir muitas janelas e trabalhar paralelamente. O cluster SSH é bem legal, mas acho que não é inteligente o suficiente.
Dennis Wisnia
0

Outra solução se todos os seus hosts estiverem executando o Debian (ou derivativos) é usar o pacote cron-apt . Mas, conforme sugerido pela documentação, um pouco de cuidado deve ser tomado.

Atualmente, estou usando o cron-apt em uma dúzia de servidores para executar todas as atualizações de segurança automaticamente e sem supervisão. Para evitar atualizações indesejadas, eu só uso o cron-apt em servidores que executam a distribuição estável Debian e certifico-me de configurar minhas fontes apt para usar o nome da distribuição, wheezy , e não seu apelido (stable).

A configuração específica do cron-apt que eu uso é resumida em um arquivo de ação: /etc/cron-apt/action.d/5-install

dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null"

Qualquer outra atualização é feita manualmente, usando a tela ou o que for mais apropriado, pois pode exigir intervenção manual durante a atualização.

Tonin
fonte