人们如何将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上附加一份工作(免责声明:完全未经测试且不是非常幂等)。

  1. 将crontab保存到临时文件中。

  2. 在tmpfile中附加一行。

  3. 写回crontab。

  4. 这可能并不完全是你想要做的,但沿着这些方面,你可以考虑将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”的商业工具。我不是真的推荐它,所以我希望你能找到一个可以解决同样问题的更好的程序。我只是说当你部署它们时,作业管理不会结束。

如果无法将系统连接到配置管理系统(如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命令。

如果您使用的是Django,请查看工作来自django-command-extensions的系统

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top