Como eu avalio uma aula não em todas as marionetes?

3

Eu gostaria de ter um método que avalia apenas uma classe específica uma vez por dia em um horário específico. No momento, estou executando meu agente de marionetes do cron, mas gostaria de alterá-lo para ser executado como um daemon ou ser executado com mais frequência. A barreira com o aumento da frequência é que há uma classe que leva cerca de 4 minutos para ser processada e não precisa acontecer com muita frequência. Eu estou tentando encontrar algum método para avaliar apenas essa classe particular, uma vez por dia do cron.

Existe um método simples para eu definir uma variável de ambiente ( FOO=bar;puppet agent .. ), ou adicionar uma opção de linha de comando ( puppet agent .. --foo bar ) ao crontab que se tornará um fato que eu posso usar em meus manifestos para incluir ou não incluir a classe?

class foobar {
  if 'bar' == $::foo {
    # do the slow stuff
  }
}
    
por Zoredache 17.12.2011 / 01:23

2 respostas

7

Um cronograma parece fornecer o que você está procurando. Primeiro, você cria um recurso de programação que especifica quando as coisas podem ser executadas e quantas vezes em um determinado período.

schedule { "slow":
  range  => "1 - 5",
  period => daily,
  repeat => 1,
}

O exemplo acima só será avaliado ou executado durante as horas de 1h e 5h e no máximo uma vez. Você pode remover o parâmetro range e ele será executado a qualquer hora do dia, mas novamente, apenas uma vez.

Em recursos, você especifica o meta-parâmetro schedule para vinculá-los a o cronograma acima:

exec { "example":
  command  => "/usr/bin/foo",
  unless   => "/usr/bin/bar",
  schedule => "slow",
}

Quando você executar o Puppet com --debug , você verá o seguinte se já tiver sido avaliado o número de vezes especificado ou o intervalo não for aplicável:

debug: /Stage[main]//Exec[example]: Not scheduled

Se você tiver alguns recursos, poderá usar padrões de recursos dentro da classe você está restringindo a afetar todos os recursos do mesmo tipo:

Exec {
  schedule => "slow",
}

Você precisaria fazer isso para cada tipo de recurso - Exec, File, Augeas, etc.

Algumas notas sobre como melhorar isso:

  • Eu não sei como aplicá-lo a todos os tipos de recursos da classe
  • A aplicação do meta-parâmetro schedule a uma classe parece não funcionar, pode valer a pena gerar um bug
por 17.12.2011 / 10:31
3

Acredito que você pode realizar isso por meio de uma declaração Ambiente . Você invoca na linha de comando:

puppet agent --environment latetbus

Você pode usá-lo para especificar um manifesto diferente no arquivo puppet.conf:

[latebus]
  manifest = $confdir/latetbus/site.pp

E até pode fazer módulos diferentes dessa maneira.

Há também um método para adicionar fatos personalizados ao facter . Isso aproveita plugins para tornar o trabalho. Você cria um arquivo rubi personalizado para verificar algo:

# run_latebus.rb

facter.add("latebus_exec") do
    setcode do
        %x{if [ -e /tmp/run_latebus ] ; then echo "true" ; else echo "false" ; fi}.chomp
    end
end

Onde o script de invocação do agente fantoche seria touch /etc/run_latebus antes de iniciar puppet agent , que é avaliado por Facter durante a execução de fantoches.

O arquivo .rb é colocado em um módulo personalizado, especificamente no diretório lib/facter do módulo em si.

    
por 17.12.2011 / 01:45

Tags