如何将cron作业部署到生产中?

时间:2009-10-21 19:24:03

标签: django git cron crontab

人们如何将cronjobs部署/版本控制生产?我对人们使用的约定/标准比任何特定的解决方案更好奇,但我碰巧使用git进行版本控制,而cronjob正在运行python / django脚本。

9 个答案:

答案 0 :(得分:21)

如果您使用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. 将crontab保存到临时文件中。

  2. 在tmpfile中附加一行。

  3. 写回crontab。

  4. 这可能并不完全是你想要做的,但沿着这些方面,你可以考虑将crontab检查为git并在每次部署时在服务器上覆盖它。 (如果您的项目有专门的用户。)

答案 1 :(得分:10)

使用Fabric,我更喜欢在本地保留我的crontab的原始版本,这样我就可以确切地知道生产中的内容,并且除了添加它们之外还可以轻松编辑条目。

我使用的结构脚本看起来像这样(一些代码被编辑,例如处理备份):

def deploy_crontab():
    put('crontab', '/tmp/crontab')
    sudo('crontab < /tmp/crontab')

答案 2 :(得分:4)

您还可以查看:

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

django-fab-deploy模块有许多方便的脚本,包括crontab_set和crontab_update

答案 3 :(得分:1)

您可以使用CFEngine / Chef之类的东西进行部署(它可以部署所有内容 - 包括cron作业)

但是,如果您提出这个问题 - 可能是您有许多生产服务器,每个服务器都运行大量预定作业。 如果是这种情况,您可能需要一个不仅可以部署作业,还可以跟踪成功失败的工具,允许您轻松查看上次运行的日志,运行统计信息,允许您轻松更改许多作业的计划和服务器一次(由于计划维护......)等。

我使用名为“UC4”的商业工具。我不是真的推荐它,所以我希望你能找到一个可以解决同样问题的更好的程序。我只是说当你部署它们时,作业管理不会结束。

答案 4 :(得分:1)

如果无法将系统连接到配置管理系统(如cfengine / puppet),则有三种手动部署crontab的选项。

您只需使用 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命令。

答案 5 :(得分:0)

如果您使用的是Django,请查看jobs system from django-command-extensions

好处是,您可以将您的工作保留在项目结构中,使用版本控制,在Python中编写所有内容并仅配置crontab一次。

答案 6 :(得分:0)

我使用Buildout来管理我的Django项目。使用Buildout,我使用z3c.recipe.usercrontab在部署或更新中安装cron作业。

答案 7 :(得分:0)

让您的项目受版本控制,包括您的crontab.txt,是我更喜欢的。然后,使用Fabric,就像这样简单:

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

这会将deployment/crontab.txt的内容安装到您连接到服务器的用户的crontab上。如果您在服务器上没有完整的项目,那么您首先想要put crontab文件。

答案 8 :(得分:0)

您说:

  

我对人们使用的约定/标准比任何特定的解决方案都更加好奇

但是,公平地讲,特定的解决方案将取决于您的环境,并且没有通用的优雅方法。假设您刚好使用Python / Django,建议您使用Celery。它是Python的异步任务队列,与Django很好地集成。而且,除了它作为异步任务队列提供的功能之外,它还具有periodic tasks的特定功能。

我亲自使用了django-celery-beat集成,它与Django设置完美集成,并且在分布式环境中可以正常运行。如果您的定期任务与Django有关,那么我强烈建议您看一下Celery,我开始仅将其用于某些异步邮件,而最终将其用于大量异步任务,定期的健全性检查和其他Web应用程序维护。