Как люди развертывают/управляют версиями cronjobs для производства? Мне более любопытно, что люди используют стандарты/стандарты, чем какое-либо конкретное решение, но я использую git для контроля версий, а cronjob запускает python/django script.
Как вы создаете рабочие места cron для производства?
Ответ 1
Если вы используете Fabric для deploment, вы можете добавить функцию, которая редактирует ваш crontab.
def add_cronjob():
run('crontab -l > /tmp/crondump')
run('echo "@daily /path/to/dostuff.sh 2> /dev/null" >> /tmp/crondump')
run('crontab /tmp/crondump')
Это добавит работу к вашему crontab (отказ от ответственности: полностью непроверенный и не очень идемпотентный).
-
Сохраните crontab в tempfile.
-
Добавить строку в tmp файл.
-
Напишите crontab назад.
Это не совсем то, что вы хотите сделать, но по этим строкам вы могли бы подумать о проверке crontab на git и перезаписать его на сервере при каждом развертывании. (если для вашего проекта есть выделенный пользователь.)
Ответ 2
Используя Fabric, я предпочитаю хранить чистую версию моего crontab локально, таким образом, я точно знаю, что происходит на производстве, и вы можете легко редактировать записи в дополнение к их добавлению.
Ткань script Я использую выглядит что-то вроде этого (некоторый код отредактирован, например, позаботится о резервных копиях):
def deploy_crontab():
put('crontab', '/tmp/crontab')
sudo('crontab < /tmp/crontab')
Ответ 3
Вы также можете взглянуть на:
http://django-fab-deploy.readthedocs.org/en/0.7.5/_modules/fab_deploy/crontab.html#crontab_update
Модуль django-fab-deploy имеет ряд удобных сценариев, включая crontab_set и crontab_update
Ответ 4
Возможно, вы можете использовать что-то вроде CFEngine/Chef для развертывания (он может развернуть все - включая задания cron)
Однако, если вы зададите этот вопрос - возможно, у вас есть много производственных серверов, на которых выполняется большое количество запланированных заданий. Если это так, вам, вероятно, нужен инструмент, который может не только разворачивать задания, но и отслеживать неудачу успеха, позволяет легко просматривать журналы с последнего запуска, запускать статистику, позволяя легко изменять расписание для многих заданий и серверов (из-за запланированного обслуживания...) и т.д.
Я использую коммерческий инструмент под названием "UC4". Я не рекомендую это, поэтому надеюсь, что вы сможете найти лучшую программу, которая может решить ту же проблему. Я просто говорю, что администрирование заданий не заканчивается при их развертывании.
Ответ 5
Есть действительно 3 варианта ручного развертывания crontab, если вы не можете подключить свою систему до системы управления конфигурацией, например cfengine/puppet.
Вы можете просто использовать crontab -u user -e, но вы рискуете, что у кого-то есть ошибка в их копировании/вставке.
Вы также можете скопировать файл в каталог cron, но для этого файла нет синтаксической проверки, а в Linux вы должны запустить touch/var/spool/cron, чтобы crond мог перенести изменения,
Примечание В какой-то момент каждый пользователь забудет команду касания.
По моему опыту этот метод - мой любимый ручной способ развертывания crontab.
diff /var/spool/cron/<user> /var/tmp/<user>.new
crontab -u <user> /var/tmp/<user>.new
Я думаю, что метод, о котором я упоминал выше, является лучшим, потому что вы не рискуете ошибками копирования/вставки, которые помогут вам поддерживать согласованность с вашим файлом с контролируемой версией. Он выполняет синтаксическую проверку задач cron внутри файла, и вам не нужно будет выполнять команду touch так, как если бы вы просто скопировали файл.
Ответ 6
Если вы используете Django, посмотрите на систему заданий из django-команд-расширений.
Преимущества в том, что вы можете сохранить свои задания внутри своей структуры проекта, с контролем версий, написать все в Python и настроить crontab только один раз.
Ответ 7
Я использую Buildout для управления моими проектами Django. С помощью Buildout я использую z3c.recipe.usercrontab
для установки заданий cron при развертывании или обновлении.
Ответ 8
Наличие вашего проекта под управлением версии, включая ваш crontab.txt, является тем, что я предпочитаю. Затем, Fabric, это так просто:
@task
def crontab():
run('crontab deployment/crontab.txt')
Это установит содержимое deployment/crontab.txt
в crontab пользователя, подключенного к серверу. Если у вас нет полного проекта на сервере, сначала нужно put
файл crontab.