| |
Одним из сильных качеств cfengine является использование им классов для определения систем из одного или нескольких файлов. Многим администраторам также хотелось бы, чтобы демон cron работал подобным образом. Одним из способов установить cron из глобальной конфигурации является использование функции editfiles , существующей в cfengine, для редактирования файлов cron отдельно друг от друга. Но гораздо лучше использовать классы времени cfengine для работы в качестве пользовательского интерфейса для cron. Это позволяет иметь один центральный файл cfengine, в котором находятся все задания cron в системе, при этом все замечательные функции, предоставляемые cron, остаются доступны. Как применяются все основные преимущества?
Главная идея, лежащая в основе этого принципа, - установить регулярную задачу cron на каждой системе, которая с определённой частотой запускает cfagent. Каждый раз при запуске cfagent он оценивает классы времени и выполняет команды shell, заданные в его файле конфигурации. В таком случае cfagent используется в качестве упаковщика(wrapper) для скриптов cron, поэтому классы cfagent можно использовать для управления заданиями на множестве компьютеров. Классы времени в cfagent, по меньшей мере, настолько же мощный инструмент, как и возможности cron по спецификации времени, поэтому использование такого метода не повлечёт каких-либо ограничений. См. раздел 5.3 [Создание гибких классов времени], стр.60. Единственный недостаток заключается в дополнительных издержкахна анализ конфигурационного файла cfagent.
Для более детального рассмотрения вопроса, представим, что следующий файл crontab устанавливается на каждый компьютер сети:
# # Global Cron file # 0,15,30,45 * * * * /usr/local/sbin/cfexecd -F
Структура cfagent.conf должна отражать принципы, согласно которым требуется осуществлять запуск задач в системе. Необходимо активизировать соответствующие задания и отключить неиспользуемые в соответствии с временем суток. Это можно сделать тремя способами:
action: Hr00.Min10_15||Hr12.Min45_55:: Command
control: Hr00:: # Action-sequence for daily run at midnight actionsequence = ( sequence ) !Hr00:: # Action-sequence otherwise actionsequence = ( sequence )
import:
Hr00:: cf.dailyjobs
any:: cf.hourlyjobs
Последний вариант является самым эффективным из всех трёх, поскольку cfagent даже не приходится тратить время, анализируя файлы на наличие тех действий, которые заранее являются ненужными.
Проблема, заключающаяся в запуске всех cfagent в одно и то же время, используя один cron файл, состоит в том, что это может привести к разногласиям или неэффективной работе. Например, если сто cfagent вдруг захотят одновременно получить копию файла из главного источника, это приведёт к огромной нагрузке на сервер. Такую ситуацию можно предотвратить, если ввести временную задержку, уникальную для каждого компьютера и не превышающую заданного интервала. Cfagent использует алгоритм хэширования для генерации числа минут от нуля до заданного максимального значения. Это выглядит примерно так:
# Put this in update.conf, so that the updates are also splayed control: SplayTime = ( 10 ) # minutes
Если такое число не равно нулю, то после анализа своего файла конфигурации и определения времени cfagent перейдёт в режим ожидания. Каждый механизм будет переходить в такой режим на разные промежутки, которые не превышают заданного в минутах времени. Механизмы хэширования, основанные на полностью уточнённых именах компьютеров, используются для определения уникального промежутка для каждого из них. Чем короче интервал, тем более сконцентрировано будут работать компьютеры. Чем длиннее интервал, тем менее нагруженным окажутся серверы. Такое распределение времён работы позволит уменьшить нагрузку на серверы, даже если они пришли из неподчинённых доменов, но работают по тем же cron принципам.
Каждый раз при запуске cfagent определяет время по часам системы и задаёт значение следующим классы времени и даты:
Yrxx: : | Текущий год, например, Yr1997, Yr2001. Как правило, этот класс используется не часто, но он может пригодиться, чтобы включить индикаторы Нового Года или подчистить системы перед новым тысячилетием. |
`February'. | Эти классы можно использовать, например, для определения сроков летних каникул студентов, или для проведения дополнительной очистки систем,чтобы поддерживать определённые административные функции на протяжении конференции. |
Day:: | День недели может использоваться, как класс, например, `Monday', `Sunday'. |
Dayxx:: | День месяца (дата) может использоваться для того, чтобы выделить что-то по дате. Например, первый день каждого месяца определяется `Day1', 21ый - `Day21' и т.д. |
Hrxx:: | Час в сутках (24 часа): `Hr00'...`Hr23'. |
Minxx:: | Точная минута запуска cfagent: `Min0' ... `Min59'. Как правило, отдельно этот класс не используется, но они могут комбинироваться для задания произвольного промежутка времени. |
Minxx_xx:: | Пятиминутный интервал в том часу, когда работал cfagent в виде: `Min0_5', `Min5_10' .. `Min55_0'. |
Классы времени, задающие точное время запуска cfagent в минутах, вряд ли будут часто использоваться, поскольку маловероятно, что кому-либо потребуется просить cron запускать cfagent каждую минуту каждый день: ему просто не хватит времени на окончание одной работы перед тем, как быть запущенным снова. Более того, многие факторы могут повлиять на задержку запуска cfagent. Возможность определять точное времени запуска, главным образом, используется для создания составных классов, которые задают произвольные промежутки времени. Для этого необходимо использовать действие group или classes, чтобы создать алиас для групп со значением времени. Ниже приведём несколько нестандартных примеров:
classes: # synonym groups: LunchAndTeaBreaks = ( Hr12 Hr10 Hr15 ) NightShift = ( Hr22 Hr23 Hr00 Hr01 Hr02 Hr03 Hr04 Hr05 Hr06 ) ConferenceDays = ( Day26 Day27 Day29 Day30 ) QuarterHours = ( Min00 Min15 Min30 Min45 ) TimeSlices = ( Min01 Min02 Min03 Min33 Min34 Min35)
В данных примерах значением левой части выражений является логическое объединение элементов в правой части. Это значит, что, если хоть какой-нибудь из классов в скобках будет определён, то и значение левой части тоже будет определено. Таким образом можно понятно и по-разному задавать промежутки времени внутри программы, не используя где-либо операторов | или ..
Как часто необходимо запускать глобальный скрипт cron? Для ответа на этот вопрос необходимо обдумать следующие аспекты:
В cfengine использует грамотные механизмы блокировки и ожидания, которых достаточно для исполнения команд shell, висящих с предыдущих запусков cron, поэтому никаких наложений не произойдёт. См. раздел 6.2.3. [Спам и безопасность]
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |