existe uma maneira de executar um comando antes que o fantoche implemente uma mudança?

2

Eu quero que o fantoche execute um comando específico antes de realizar qualquer tipo de alteração. Estou ciente da opção prerun_command no principal puppet.conf, mas não é isso que estou procurando. Eu quero que o comando seja executado somente se algo estiver prestes a mudar, não em todas as execuções de fantoches.

Aqui está o cenário. Digamos que eu tenha um monte de servidores da web por trás de um balanceador de carga. Então eu quero fantoche para atualizar os arquivos do site. Mas, para evitar problemas nos quais alguns arquivos foram atualizados, mas outros não, e as versões mistas causando problemas, quero tirar o servidor do pool do balanceador de carga. Eu poderia escrever um script que, quando executado, diria ao balanceador de carga para remover a caixa do pool. Em seguida, o fantoche pode fazer a alteração e usar postrun_command para colocar a caixa novamente na piscina depois de concluída. Mas preciso de uma maneira de executar esse script para remover o servidor do pool.


A única solução que posso pensar é manter 2 cópias dos arquivos na caixa. Uma é uma cópia de teste e, quando ela é atualizada, usa uma ação de notificação para acionar o script de remoção e, em seguida, copiar da preparação para o local ativo. Mas eu estava esperando algo um pouco mais genérico que funcionasse em qualquer alteração sendo executada (atualizando um pacote, reiniciando um serviço, criando um usuário, qualquer coisa).

    
por Patrick 31.08.2012 / 05:10

3 respostas

2

Depois de jogar com vários métodos diferentes de fazer isso, um script wrapper foi minha solução final.

O script é chamado em vez de puppet agent sempre que ocorre uma execução.

  1. Define uma variável FACTER_ env que init.pp procura. Se init.pp não encontrar a variável, fail() s com uma mensagem de erro.
  2. O script primeiro executa puppet agent --noop --onetime --no-daemonize --verbose --color=false | grep -q ' (noop)$' (é um pouco mais inteligente do que isso, pois também verifica a puppet agent run para códigos de erro. Também não é possível usar --detailed-exitcodes devido a bug 6322 .
  3. Se o acima corresponder ao (noop)$ , ele remove o servidor do balanceador de carga e executa o fantoche novamente sem o --noop e com --detailed-exitcodes .
  4. Se a execução sair com 0 ou 2 , o script executará algumas verificações adicionais para garantir que todos os serviços estejam sendo executados corretamente e, em seguida, retornará a caixa ao balanceador de carga.
por 02.12.2012 / 01:13
5

O objetivo principal do Puppet é o gerenciamento de configuração . Isso quer dizer que ele reforçará a (s) configuração (ões) declarada (s). O que você precisa (com base no cenário que você descreveu em sua pergunta) é comando e controle . Como aponta o @Mike, o tecido é uma opção. Eu pessoalmente gosto do Marionette Collective, como é um produto do Puppet Labs e joga bem com os internos do Puppet (fatos, etc).

    
por 13.09.2012 / 20:48
4

Aqui estão meus 2 centavos nele. Você pode fazer isso no fantoche, mas eu sempre achei que a implantação de aplicativos Web é muito confusa com fantoches. Claro que vai funcionar, mas o que acontece quando você precisa de uma rápida reversão. não vai acontecer com o fantoche.

Eu examinaria uma ferramenta de implantação como tecido

link

Ele permitirá que você execute comandos em todos os webnodes para lidar com implantações. Portanto, antes de implantar, você pode parar o servidor da Web, por exemplo, e reiniciá-lo quando a implantação terminar.

EDITAR

Aqui está um exemplo despojado do que você pode fazer no fantoche

Então você tem um arquivo, mas precisa executar um comando antes que o arquivo seja alterado?

file { "/path/to/file":
  ensure  => file,
  require  => Exec['command to run'],
}

Então, isso executará um comando antes que um arquivo precise ser alterado devido ao require.

    
por 31.08.2012 / 05:14

Tags