Как вы развертываете задания cron для производства?
Вопрос
Как люди внедряют cronjobs / контроль версий в производство? Меня больше интересуют соглашения / стандарты, которые используют люди, чем какое-либо конкретное решение, но я использую git для контроля версий, а cronjob запускает скрипт python / django.
Решение
Если вы используете Fabric для развертывания, вы можете добавить функцию, которая редактирует ваш 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 в временный файл.
Добавить строку в tmpfile. Р>
Напишите crontab обратно.
Вероятно, это не совсем то, что вы хотите сделать, но вы можете подумать о том, чтобы проверять crontab в git и перезаписывать его на сервере при каждом развертывании. (если для вашего проекта есть выделенный пользователь.)
Другие советы
Используя Fabric, я предпочитаю сохранять нетронутую версию моего crontab локально, так что я точно знаю, что находится на производстве, и могу легко редактировать записи в дополнение к их добавлению.
Сценарий, который я использую, выглядит примерно так (некоторый код отредактирован, например, заботится о резервном копировании):
def deploy_crontab():
put('crontab', '/tmp/crontab')
sudo('crontab < /tmp/crontab')
Вы также можете взглянуть на:
http: // django- fab-deploy.readthedocs.org/en/0.7.5/_modules/fab_deploy/crontab.html#crontab_update р>
Модуль django-fab-deploy содержит несколько удобных сценариев, включая crontab_set и crontab_update
Вероятно, вы можете использовать что-то вроде CFEngine / Chef для развертывания (он может развертывать все, включая задания cron)
Однако, если вы зададите этот вопрос - возможно, у вас много рабочих серверов, на каждом из которых выполняется большое количество запланированных заданий. Если это так, то вам, вероятно, нужен инструмент, который может не только развертывать задания, но и отслеживать неудачные попытки, позволяет легко просматривать журналы с последнего запуска, выполнять статистику, позволяет легко изменять расписание для многих заданий и серверы сразу (из-за планового обслуживания ...) и т. д.
Я использую коммерческий инструмент под названием "UC4". Я не очень рекомендую это, поэтому я надеюсь, что вы можете найти лучшую программу, которая может решить ту же проблему. Я просто говорю, что администрирование заданий не заканчивается при их развертывании.
На самом деле есть 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, как если бы вы просто скопировали файл.
Если вы используете Django, ознакомьтесь с вакансиями система из расширений django-команд .
Преимущества состоят в том, что вы можете держать свои работы внутри структуры проекта, с контролем версий, писать все на Python и настраивать crontab только один раз.
Я использую Buildout для управления своими проектами Django. В Buildout я использую z3c.recipe.usercrontab
для установки заданий cron при развертывании или обновлении.
Я предпочитаю, чтобы ваш проект находился под контролем версий, в том числе crontab.txt. Затем с помощью Fabric все так просто:
@task
def crontab():
run('crontab deployment/crontab.txt')
Это установит содержимое deploy / crontab.txt
в crontab пользователя, которого вы подключаете к серверу. Если у вас нет завершенного проекта на сервере, вам нужно поместить
файл crontab.