расписание в puppet или puppet schedule


Относительно недавно познакомился с 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;
}
comments powered by Disqus