Назад | Перейти на главную страницу

Как оценить класс не на каждом прогоне марионеток?

Я хотел бы иметь метод, который оценивает определенный класс только один раз в день в определенное время. Прямо сейчас я запускаю свой марионеточный агент из cron, но я хотел бы изменить его, чтобы он работал как демон или запускался чаще. Барьер с увеличением частоты заключается в том, что есть один класс, на обработку которого уходит около 4 минут, и это не обязательно должно происходить очень часто. Я пытаюсь найти метод, позволяющий оценивать этот конкретный класс только один раз в день из cron.

Есть ли для меня простой способ установить переменную среды (FOO=bar;puppet agent ..) или добавьте параметр командной строки (puppet agent .. --foo bar) в crontab, который станет фактом, который я могу использовать в своих манифестах, чтобы включать или не включать класс?

class foobar {
  if 'bar' == $::foo {
    # do the slow stuff
  }
}

А график звучит так, как будто он предоставит то, что вы ищете. Сначала вы создаете ресурс расписания, который указывает, когда что-то может выполняться и сколько раз в заданный период.

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

Приведенный выше пример будет оцениваться или запускаться только в 1–5 утра и не более одного раза. Вы можете удалить range параметр, и он будет запускаться в любое время дня, но опять же, только один раз.

В ресурсах вы затем указываете schedule мета-параметр чтобы связать их с приведенным выше расписанием:

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

Когда вы запускаете Puppet с --debug, теперь вы увидите следующее, если он уже оценивался указанное количество раз или диапазон неприменим:

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

Если у вас есть несколько ресурсов, вы можете использовать параметры ресурса по умолчанию внутри класса вы ограничиваете влияние на все ресурсы одного типа:

Exec {
  schedule => "slow",
}

Вам нужно будет сделать это для каждого типа ресурса - Exec, File, Augeas и т. Д.

Пара замечаний по улучшению этого:

  • Я не знаю, как применить его ко всем типам ресурсов в классе
  • Применяя schedule мета-параметр класса не работает, возможно, стоит поднять ошибку

Я считаю, что это можно сделать с помощью Окружающая среда декларация. Вы вызываете его из командной строки:

puppet agent --environment latetbus

Вы можете использовать его, чтобы указать другой манифест в файле puppet.conf:

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

И даже может так делать разные модули.

Также существует способ добавление пользовательских фактов в facter. Это использует плагины для работы. Вы создаете собственный рубиновый файл, чтобы что-то проверить:

# 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

Где сценарий вызова марионеточного агента touch /etc/run_latebus до начала puppet agent, который оценивается Facter во время выполнения марионетки.

Файл .rb размещен в настраиваемом модуле, в частности в lib/facter каталог самого модуля.