2016-01-05 2 views
0

У меня есть собственный кукольный факт (написанный в рубине), который выполняет простой скрипт bash. Скрипт проверяет все файлы в файловой системе для общедоступных разрешений и соответственно возвращает результаты. Кукольный факт проверяет вывод сценария и возвращает «fail», если вывод сценария не равен null.Как запланировать кукольные пользовательские факты для выполнения каждые X часов?

Проблема заключается в том, что сценарий является ресурсоемким, и я не хочу, чтобы он выполнялся каждые 30 минут (клиентский puppet.conf: runinternval = 1800).

Я пробовал использовать ресурс «расписание», но из-за того, как марионетки работают, это влияет только на класс, который я использую, чтобы оценить результат этого факта. Факты кукол оцениваются на каждом марионетке, независимо от чего-либо еще. (тем самым делая их доступными для ресурсов)

Я также попытался переместить код, выполняющий скрипт bash, из факта и в класс кукол, но, похоже, вы не можете оценить вывод сценария bash (используя " exec ") и сохранить его в переменной (опять же, из-за способа кукольных работ).

Теперь я сокращен, чтобы попытаться применить какой-то механизм планирования с использованием языка Ruby и реализовать его в этом факте. Я немного читал о PStore, и сейчас это похоже на хорошее направление.

Кто-нибудь знает, как я могу сделать рубиновый скрипт выполненным только ночью? Я не могу использовать crontab, потому что код будет выполняться марионеткой.

Фрагмент кода из класса кукольный:

if $::myfact == 'fail' { 
    notify { "warning blah blah...": 
    loglevel => err, 
    schedule => 'night', 
    } 
} 

Фрагмент кода из кукольного факта:

require 'facter' 
Facter.add(:myfact) do 
    setcode do 
    if File.exists? '/usr/local/puppet/scripts/myscript.sh' 
     result = Facter::Util::Resolution.exec("/usr/local/puppet/scripts/myscript.sh") 
     if result != '' 
     puts "Result of myfact is: \n #{result}" 
     'fail' 
    end 
    end 
end 

конец

ответ

1

Ваш заказ факт может увековечить свой результат в файл где-то на система. Когда он оценивается, он может сравнивать временную метку с этим файлом с текущим системным временем и либо считывать значение, либо вычислять его свеже, если это необходимо. Это также позволяет отложить обновления (например, touch файла) или вручную запросить повторную оценку (путем удаления файла).

Учитывайте, однако, имеет смысл отделить дорогостоящую оценку от сбора фактов. Даже если Facter только изредка должен переоценить факт с нуля, Facter - и, следовательно, Puppet - потребуется много времени для выполнения этих пробегов. Вместо этого вы можете использовать запланированное задание для проведения оценки в любые промежутки времени, которые вам нравятся, и имеют собственный факт всегда полагаются на кешированные результаты последней из этих оценок.

+0

«... используя запланированное задание для выполнения оценки ...» Это означает, что мне нужно усложнить мой куковый код crontabs и локальным кешем, не так ли? – amirb

+1

@amirb в отличие от усложнения вашего кода факта тем же, да. Да, вы должны это сделать. –

Смежные вопросы