Как вы развертываете задания cron для производства? - PullRequest
21 голосов
/ 21 октября 2009

Как люди внедряют cronjobs / контроль версий в производство? Меня больше интересуют соглашения / стандарты, которые используют люди, чем какое-либо конкретное решение, но я использую git для контроля версий, а cronjob запускает скрипт python / django.

Ответы [ 8 ]

21 голосов
/ 22 октября 2009

Если вы используете 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 (отказ от ответственности: полностью не проверен и не очень идемпотентен).

  1. Сохранить хронтаб в временном файле.

  2. Добавить строку в tmpfile.

  3. Напишите crontab обратно.

Вероятно, это не совсем то, что вы хотите сделать, но вы можете подумать о том, чтобы проверить crontab в git и перезаписывать его на сервере при каждом развертывании. (если для вашего проекта есть выделенный пользователь.)

10 голосов
/ 24 января 2011

Используя Fabric, я предпочитаю сохранять нетронутую версию моего crontab локально, так что я точно знаю, что находится на производстве, и могу легко редактировать записи в дополнение к их добавлению.

Сценарий, который я использую, выглядит примерно так (некоторый код отредактирован, например, заботится о резервном копировании):

def deploy_crontab():
    put('crontab', '/tmp/crontab')
    sudo('crontab < /tmp/crontab')
4 голосов
/ 18 ноября 2013

Вы также можете взглянуть на:

http://django -fab-deploy.readthedocs.org / ен / 0.7.5 / _modules / fab_deploy / crontab.html # crontab_update

Модуль django-fab-deploy содержит несколько удобных сценариев, включая crontab_set и crontab_update

1 голос
/ 05 июля 2011

На самом деле есть 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, как если бы вы просто скопировали файл.

1 голос
/ 22 октября 2009

Вероятно, вы можете использовать что-то вроде CFEngine / Chef для развертывания (он может развертывать все, включая задания cron)

Однако, если вы зададите этот вопрос - возможно, у вас много рабочих серверов, на каждом из которых выполняется большое количество запланированных заданий. Если это так, то вам, вероятно, нужен инструмент, который может не только развертывать задания, но и отслеживать неудачные попытки, позволяет легко просматривать журналы с последнего запуска, выполнять статистику, позволяет легко изменять расписание для многих заданий и сервера сразу (из-за планового обслуживания ...) и т. д.

Я использую коммерческий инструмент под названием "UC4". Я не очень рекомендую это, поэтому я надеюсь, что вы можете найти лучшую программу, которая может решить ту же проблему. Я просто говорю, что администрирование заданий не заканчивается при их развертывании.

0 голосов
/ 07 июля 2017

Я предпочитаю, чтобы ваш проект находился под контролем версий, в том числе crontab.txt. Затем, с Fabric , это так просто:

@task
def crontab():
    run('crontab deployment/crontab.txt')

Это установит содержимое deployment/crontab.txt в crontab пользователя, которого вы подключаете к серверу. Если у вас нет законченного проекта на сервере, вам нужно сначала put файл crontab.

0 голосов
/ 06 мая 2011

Я использую Buildout для управления моими проектами Django. В Buildout я использую z3c.recipe.usercrontab для установки заданий cron при развертывании или обновлении.

0 голосов
/ 24 октября 2009

Если вы используете Django, взгляните на систему jobs из django-command-extensions .

Преимущества состоят в том, что вы можете держать свои работы внутри структуры проекта, с контролем версий, писать все на Python и настраивать crontab только один раз.

...