Как вы развертываете задания cron для производства?

StackOverflow https://stackoverflow.com/questions/1603034

  •  05-07-2019
  •  | 
  •  

Вопрос

Как люди внедряют 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.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top