Puppet: Executando o comando shell quando o arquivo (ou pacote) é atualizado

8

Eu quero correr mysql_tzinfo_to_sql sempre que o pacote tzinfo (no Ubuntu Server) mudar. Eu percebi que Puppet pode cuidar disso.

Eu achei que o Puppet reagiria a uma alteração na versão do pacote ou, se não, a uma alteração no registro de data e hora de um arquivo contido no pacote.

A única maneira que posso ver para fazer isso é ter um recurso sem ação direta e ter um exec dependendo dele.

As perguntas que tenho são:

  1. É possível definir um arquivo que é usado apenas para Notificar outro recurso (como exec )?
  2. É possível definir um recurso de pacote para que outro recurso (como exec ) seja ativado quando o pacote é alterado ou atualizado?
  3. É possível definir um recurso exec que executa um linha de comando do shell (com pipes e redirecionamento, por exemplo) em vez de comando do sistema de arquivos?

Tomadas todas juntas, parece esmagadora.

FOLLOWUP : Respostas fantásticas! No interesse da integralidade (e para o registro), devo observar o seguinte:

  1. O comando shell completo de interesse é %código% (carrega o tzinfo em um banco de dados MySQL para uso do MySQL).
  2. A auditoria de mysql_tzinfo_to_sql | mysql -u root -p password seria inútil, pois é apenas o configuração do fuso horário local; o objetivo é observar mudanças nos dados tzinfo em si (assim, a observação de /etc/tzinfo ).
  3. Da mesma forma, o conteúdo seria errado, pois é provável que não mudar; o melhor seria assistir ao mtime ou todos desde que o filetimes deve mudar após cada atualização do tzinfo.

Além disso, James Turnbull escreveu tudo sobre auditoria quando foi apresentado. A Referência de Metaparameter contém uma breve descrição do funcionamento do parâmetro /usr/share/zoneinfo .

    
por Mei 04.04.2011 / 19:54

4 respostas

7

Use o atributo audit para rastrear o conteúdo do arquivo ou o número da versão do pacote e acionar a alteração assinando o recurso do pacote. Alguns problemas com isso, isso não funciona com --noop porque o arquivo state.yaml atualizará o arquivo md5 checksum / versão do pacote no modo --noop. Não tenho certeza se isso é um bug pendente, pois não posso rastreá-lo no momento.

file { '/etc/tzinfo':
  audit => content,
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}

Um método mais confiável é apenas duplicar o arquivo em outro lugar e usá-lo para acionar atualizações (o local não é importante, estamos apenas acompanhando o tzinfo original como fonte).

file { '/etc/puppet/stage/tzinfo':
  source => '/etc/tzinfo',
}

exec { '/usr/bin/mysql_tzinfo_to_sql':
  subscribe => File['/etc/tzinfo'],
}

O segundo método, claro, não funciona com pacotes, mas você evitaria os problemas --noop e state.yaml.

Em relação à terceira questão, sim, você pode usar pipe e redirecionamentos (use um título e coloque o comando no atributo de comando):

exec { 
  '/bin/echo foo | grep foo > /tmp/foo':
}
    
por 05.04.2011 / 03:45
5

Sim, você deve conseguir fazer isso.

* exemplo de código teórico

package{'tzinfo':
  audit  => all,
  notify => Exec['mysql_tzinfo_to_sql'],
}

exec{'mysql_tzinfo_to_sql':
  refreshonly  => true,
  command      => "bash -c '/usr/local/bin/mysql_tzinfo_to_sql >> /var/log/stuff.log'",
}
  1. Sim, através do meta-parâmetro de notificação. No entanto, não tenho 100% de certeza de que o novo recurso de auditoria no fantoche 2.6 irá desencadear uma notificação se a versão do pacote for alterada fora do controle do fantoche.

  2. Sim, com refreshonly = > true

  3. Sim, veja meu exemplo. O Puppet executa comandos exec fora de um shell interativo para simplicidade e segurança. Você pode usar o fantoche no modo subshell com a opção -c, mas lembre-se das citações.

por 05.04.2011 / 15:02
2

Eu acredito que consegui fazer isso funcionar. aqui estão os trechos relevantes do meu manifesto de marionetes:

file { '/usr/share/zoneinfo':
  audit => mtime,
  recurse => true,
  notify => Exec['mysql_tzinfo']
}

exec { 'mysql_tzinfo':
  refreshonly => true,
  command => 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql',
}

após o primeiro backup, o exec mysql_tzinfo é ignorado. testado pelo touch'ing / usr / share / zoneinfo / Etc / UTC, que prometeu mysql_tzinfo exec para executar o próximo.

    
por 03.01.2013 / 05:59
2

Essa pergunta é antiga, mas eu passei por ela procurando outra coisa e queria adicionar uma resposta alternativa para consideração.

Ele não usa fantoches: como estamos querendo acionar uma instalação / atualização de RPM, por que não usar um gatilho de RPM? Ele aproveita o próprio sistema usado para fazer a instalação, estendendo-o adequadamente de uma maneira para a qual foi projetado.

Construir o gatilho O RPM é simples, e embora não seja divertido aprender, assim que o primeiro é feito, ele pode ser repetido para outros aplicativos e condições muito facilmente - assim, os custos são diferentes de zero, mas se beneficiam rapidamente superam amplamente esses custos.

Enquanto estamos aqui para o Puppet, e o problema é solucionável com o fantoche, me preocupo com o fato de estar aproveitando uma parte fraca de uma ferramenta para responder mal a uma condição muito mais fácil de ser acionada com uma ferramenta que já está no host e uma ferramenta na qual a maioria dos administradores da caixa deveria ter mergulhado o dedo do pé. Desculpe sugerir uma solução fora das linhas, mas se você estiver passando por essa mensagem no futuro como eu fiz, e o gatilho RPM é uma opção para você, por favor, considere isso.

    
por 12.01.2015 / 19:17

Tags