23

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

4

9 回答 9

22

如果您使用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。

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

于 2009-10-21T21:00:24.960 回答
10

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

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

def deploy_crontab():
    put('crontab', '/tmp/crontab')
    sudo('crontab < /tmp/crontab')
于 2011-01-23T22:14:01.943 回答
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

于 2013-11-18T14:44:55.797 回答
1

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

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

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

于 2009-10-22T05:31:35.597 回答
1

如果您无法将系统连接到配置管理系统(如 cfengine/puppet),则确实有 3 个手动部署 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 命令。

于 2011-07-04T21:44:45.293 回答
1

我更喜欢让您的项目(包括您的 crontab.txt)处于版本控制之下。然后,使用Fabric,就这么简单:

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

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

于 2017-07-07T07:35:48.730 回答
0

如果您使用的是 Django,请查看django-command-extensions 中的作业系统

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

于 2009-10-24T08:03:10.973 回答
0

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

于 2011-05-06T03:45:25.590 回答
0

你说:

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

但是,公平地说,特定的解决方案将取决于您的环境,并且没有通用的优雅银弹。鉴于您碰巧使用的是 Python/Django,我推荐Celery。它是 Python 的异步任务队列,与 Django 很好地集成。而且,除了作为异步任务队列提供的功能之外,它还具有周期性任务的特定功能。

我亲自使用过该django-celery-beat集成,它与 Django 设置完美集成,并在分布式环境中正常运行。如果您的定期任务与 Django 相关,我强烈建议您查看 Celery,我开始仅将它用于某些异步邮件,最终将它用于许多异步任务 + 定期健全性检查和其他 Web 应用程序维护的东西。

于 2019-12-17T09:28:56.677 回答