Относительно недавно познакомился с puppet schedule и хотел поделиться наблюдениями.
Для начала, что такое puppet schedule и для чего оно нужно. Например, у вас много файловых ресурсов, которые применяются на многих серверах и этим нагружают сервер.
Для того, чтобы снизить нагрузку на puppet сервер, вы можете выставить расписание для этих ресурсов, чтоб они выполнялись не чаще, чем раз в час.
Или же у вас много пакетных ресурсов, которые нагружают ваш репозиторий частыми обращениями о проверке. Или какие-то обновления, которые можно применять только по выходным. Ну, вы поняли. Я для себя вижу применение puppet расписания для снижения нагрузки на ту или иную подсистему и для более быстрого выполнения манифеста.
Пример из жизни. Тестовая среда, которой управляет puppet. Деплой на неё происходит в виде раскатки конфигов и установки пакетов.
Часть конфигов и пакеты последней версии важно приносить без промедлений, было решено, что раз в 5 минут достаточно быстро.
Все остальные ресурсы обновляются раз в час. Puppet запускается по крону раз в 5 минут.
Для реализации этого решения было написано два простеньких расписания: main и test
Расписание поместили в основной профиль группы тестовых серверов. Тут описана концепция профилей и ролей, наподобие той, которую мы используем.
schedule {
'main':
period => hourly,
repeat => 1;
'test':
period => hourly,
repeat => 12;
}
main запускается раз в час, test — 12 раз в час, т.е. раз в 5 минут.
Далее эти расписания применили для основных групп ресурсов.
File {schedule => 'main'}
Service {schedule => 'main'}
Exec {schedule => 'main'}
Package {schedule => 'test'}
С пакетами все сработало, как описано в документации. Но некоторые файлы, которые конфиги, нам нужно тоже применять раз в 5 минут, т.к. мы их часто изменяем.
Конфиги были описаны наподобие этого. Как видно, для двух из них расписание выставлено вручную. conf2 не нуждается в частом обновлении.
file {
"/etc/soft/conf1.xml":
source => "puppet:///modules/configs/conf1.xml",
owner => soft,
group => soft,
schedule => test,
mode => 644;
"/etc/soft/conf2.xml":
content => template ("configs/conf2.xml.erb"),
owner => soft,
group => soft,
mode => 644;
"/etc/soft/conf3.xml":
content => template ("configs/conf3.xml.erb"),
owner => soft,
group => soft,
schedule => test,
mode => 644;
}
Вот тут я и столкнулся с багом: расписание не применялось. Как оказалось, каждый ресурс надо описывать отдельно и нельзя их группировать, иначе расписание, заданное для файла, не применяется, а применяется общее расписание, в нашем случае main, заданное в профиле для всех файлов.
Вот пример правильного манифеста:
file { "/etc/soft/conf1.xml":
source => "puppet:///modules/configs/conf1.xml",
owner => soft,
group => soft,
schedule => test,
mode => 644;
}
file { "/etc/soft/conf2.xml":
content => template ("configs/conf2.xml.erb"),
owner => soft,
group => soft,
mode => 644;
}
file { "/etc/soft/conf3.xml":
content => template ("configs/conf3.xml.erb"),
owner => soft,
group => soft,
schedule => test,
mode => 644;
}