As ferramentas de gerenciamento de configuração (Puppet, Chef) são capazes de manter os pacotes instalados atualizados?

28

Provavelmente, essa é uma pergunta simples para aqueles que já executam ferramentas de gerenciamento de configuração. As ferramentas de gerenciamento de configuração, como Puppet ou Chef, são a abordagem correta para manter os pacotes instalados atualizados?

Suponha que eu execute vários servidores, principalmente baseados no Debian e Ubuntu. As ferramentas de gerenciamento de configuração facilitam a atualização dos pacotes instalados nos repositórios quando ocorrem atualizações de segurança ou correções de bugs?

Atualmente, eu executo "atualizações autônomas" para permitir que os sistemas instalem automaticamente as atualizações de segurança, mas ainda preciso conectar-me aos servidores e executar de aptitude update && aptitude safe-upgradevez em quando. Naturalmente, isso fica entediante, tedioso e propenso a erros, quanto mais servidores houver.

Ferramentas como Puppet ou Chef são a abordagem correta para manter os pacotes instalados atualizados? Algum de vocês usa essas ferramentas para evitar a execução manual aptitudeou equivalente em 15 servidores? Tenho certeza de que a resposta para essas perguntas é "Sim, é claro!"

Mas onde posso encontrar mais informações sobre esse caso de uso específico? Ainda não tive tempo de estudar o Puppet ou o Chef em profundidade, e os exemplos de livros de receitas ou aulas mostram apenas exemplos mais ou menos triviais de instalação de um pacote específico, como o ssh. Você tem outros recursos para recomendar, além da documentação oficial (é claro, vou estudar os documentos depois que souber quais ferramentas, se houver alguma, são adequadas para mim).

daff
fonte
boa pergunta, eu li um tutorial [que não consigo encontrar] mencionando manter o debian atualizado com o fantoche, mas nunca tentei isso sozinho. isso vai ser interessante ver as respostas de quem o utiliza na produção
PQD

Respostas:

9

O Puppet (eu tenho certeza que o chef também o faz) se vincula aos seus repositórios de software apt-get / yum . Como eles fazem o trabalho pesado de descobrir quais pacotes estão disponíveis, isso significa que ensure => latestapenas funciona para o Ubuntu / CentOS / Debian. Contanto que você configure os arquivos apropriados corretamente ( /etc/apt/sources.list, etc).

Perlchild
fonte
1
As respostas que envolvem o Puppet ou o gerenciamento similar de cada pacote significam que você deve rastrear todos os pacotes no Puppet, mesmo os que fazem parte da instalação básica da distribuição Linux. Usar ferramentas como unattended-upgradesou yum-cronpara automatizar as atualizações é muito menos trabalhoso - basta usar o Puppet / Chef / Ansible para configurar essas ferramentas.
RichVel
22

Você pode fazer isso com fantoches, ou:

ensure => latest,

ou

ensure=> "1.0.2",

para especificar a versão mais recente / necessária. ie

package { apache2: ensure => "2.0.12-2" }
package { apache2: ensure => latest }

Isso significa pelo menos que você pode especificar a mesma versão em todos os sistemas, além de impedir que os servidores se atualizem (potencialmente perigosamente) automaticamente. Eu usei esse método na produção em vários sites e funciona muito bem.

A execução de atualizações autônomas me assusta um pouco, especialmente se eles estão atualizando pacotes de missão crítica, kernels, bibliotecas mysql, apache, etc. Especialmente se o script de instalação desejar reiniciar o serviço!

Tom O'Connor
fonte
Obrigado pela resposta! Portanto, parece que manter os pacotes que foram instalados via Puppet atualizados é pelo menos possível. Bom saber. Mas e os servidores executando versões diferentes de pacotes? Como no Debian Lenny vs Ubuntu 8.04 e 9.10? Preciso cuidar das versões manualmente? Parece que tenho mais pesquisas a fazer. Não tenho certeza do que estava esperando, talvez algo como o Canonical's Landscape, que oferece uma interface da web e outras coisas mais ou menos sofisticadas para atualizar pacotes em vários servidores.
Daff
Para servidores executando versões diferentes, é aqui que fica complicado. Você precisa ter blocos diferentes dentro do seu manifesto de marionetes, onde ele usa o Facter para recuperar as palavras-chave lsb_release ou debian_version do / etc e depois toma decisões baseadas naquilo sobre o pacote a ser instalado. Eu não vi o Landscape usado com raiva nos servidores de produção, acho que é muito caro.
Tom O'Connor
2
ensure => latestsempre garantirá que tudo esteja atualizado com o que o seu conjunto de repositórios fornecer.
womble
18

Eu acho que essa é provavelmente a pergunta errada. Certamente, usar ferramentas de gerenciamento de configuração como Puppet e Chef para manter sua infraestrutura é um grande passo à frente ao tentar fazer tudo manualmente. A questão de manter as versões do seu pacote atualizadas e sincronizadas não é uma solução que nenhuma dessas ferramentas resolva diretamente. Para automatizar isso corretamente, você precisa colocar os repositórios de pacotes sob seu controle.

A maneira como faço isso é manter um repositório Yum dedicado (para Redhat / Fedora / CentOS; um repositório APT para Debian / Ubuntu) que contém os pacotes de que me preocupo em um site específico. Geralmente, são as dependências do próprio aplicativo (Ruby, PHP, Apache, Nginx, bibliotecas e assim por diante) e pacotes críticos de segurança.

Depois de configurá-lo (geralmente você pode espelhar os pacotes necessários do repositório upstream para começar), você pode usar a sintaxe "garantir => mais recente" do Puppet para garantir que todas as suas máquinas estejam atualizadas com o repositório.

Seria bom usar um repositório de 'teste' para permitir que você testasse versões atualizadas dos pacotes antes de lançá-los alegremente para a produção. Isso é feito facilmente com o Puppet sem nenhuma duplicação de código usando modelos de repositório.

A automação da versão do pacote incentiva você a sincronizar todos os seus sistemas de produção, pois a manutenção de vários repositórios e pacotes para diferentes distribuições de SO, versões e arquiteturas de máquinas consome muito tempo e pode levar a todos os tipos de problemas e incompatibilidades obscuros.

Todo esse conselho se aplica igualmente a gemas Ruby, ovos Python e outros sistemas de pacotes que você pode usar.

Eu escrevi um pequeno tutorial do Puppet, que deve ajudá-lo a começar a usar o Puppet rapidamente. Você pode implantar uma definição de repo personalizada em suas máquinas usando o Puppet como a primeira etapa para controlar as versões dos pacotes.

John Arundel
fonte
5

Enquanto Puppet / Chef são possíveis candidatos para essa funcionalidade, para fazê-los manter tudo no sistema up-to-date requer ou tipos personalizados ou lista de cada pacote (incluindo bibliotecas de sistema subjacentes como libc6) como recursos com ensure => latest. Para o caso específico de atualizações automáticas de pacotes, você pode procurar no cron-aptpacote, que faz o que você deseja também.

mulher
fonte
ou simplesmente execute um trabalho executivo de "atualização yum" com um tempo de exibição alto. Funciona para mim de qualquer maneira.
Sirex
5

Esta pergunta é antiga, mas pensei em responder de maneira atualizada, pois uma resposta existente no momento não estava disponível na época.

Se você estiver usando fantoches ou chef, consulte o mcollective. É uma ferramenta muito bacana do pessoal do puppetlabs que permite enviar comandos para grupos de servidores.http://docs.puppetlabs.com/mcollective/

Ele também possui um plugin apt, que pode ser usado para fazer uma atualização do apt em qualquer número de servidores: http://projects.puppetlabs.com/projects/mcollective-plugins/wiki/AgentApt

Walter Heck
fonte
4

Sei que isso é um pouco tarde para sua pergunta original, mas aqui está no espírito de "antes tarde do que nunca".

Eu uso o Cfengine 3 para fazer isso em vários servidores. Eu especifico uma lista explícita de pacotes para atualização automática, evitando a atualização de todos os pacotes sem ter um pouco de cuidado com isso. Funciona muito bem e o cfengine 3 é muito leve.

Aqui está um trecho de promessa da minha configuração cfengine:

    packages:
            "apache2"
                    package_method => "apt",
                    package_policy => "update";

Espero que isto ajude.

Jonathan Clarke
fonte
2

Eu concordo com o Jonathan. A abordagem do Cfengine 3 é boa porque você pode controlar todos os aspectos do gerenciamento de pacotes sem precisar recodificar em um nível baixo.

SAnnukka
fonte
2

Usamos fantoche + apt-datador.

ptman
fonte
1

Você também pode usar ferramentas de gerenciamento de pacotes, como o Canonicals Landscape, projetado para gerenciar e monitorar sistemas Ubuntu / Debian. Ele gerencia vários sistemas, permite que você os atualize simultaneamente e fornece alguns recursos básicos de monitoramento.


fonte
0

Atualizações de segurança

Geralmente acho que é mais simples usar o Ansible ou semelhante para configurar o pacote robusto de atualizações autônomas para Ubuntu / Debian (ou yum-cronpara RHEL / CentOS). Você pode usar o Puppet, Chef ou outras ferramentas, mas discutirei o Ansible aqui.

  • unattended-upgrades pode ser usado para fazer atualizações que não são de segurança ao mesmo tempo, se você preferir, o que é muito mais fácil do que executar um comando via Ansible todos os dias.

  • unattended-upgradescuida das atualizações automáticas todos os dias e normalmente é restrito apenas às atualizações de segurança (para aumentar a estabilidade). Se o servidor precisar de uma reinicialização após a atualização, essa ferramenta poderá ser reinicializada automaticamente em um determinado momento.

Se suas reinicializações forem mais complexas, unattended upgradesvocê poderá enviar um e-mail para você, além de criar/var/run/reboot-required criado, para que o Ansible (ou similar) possa gerenciar as reinicializações em um momento adequado (por exemplo, a reinicialização contínua de um cluster de servidores da Web ou de banco de dados para evitar tempo de inatividade, aguardando cada servidor para ficar disponível em uma determinada porta TCP antes de continuar).

Você pode usar funções Ansible, como jnv.unattended-upgrades para sistemas Ubuntu / Debian, ou o simples mas eficaz geerlingguy.security , que também abrange RHEL / CentOS (e reforça a configuração SSH).

Se as atualizações rápidas de segurança forem menos importantes, você poderá submetê-las a um processo de teste em servidores menos importantes primeiro e executar o unattended-upgradecomando assim que os testes mostrarem que não há problemas - no entanto, é muito raro que as correções de segurança orientadas ao servidor causem problemas. experiência.

Atualizações gerais

Atualizações diferentes da segurança devem passar por um processo contínuo normal de integração e teste, para garantir que as coisas não quebrem.

Eu já vi aptitude safe-upgradeproblemas sérios nos servidores, então é melhor não executá-lo automaticamente, enquanto as atualizações de segurança geralmente são bastante seguras.

RichVel
fonte