人们如何将 cronjobs 部署/版本控制到生产环境?我对人们使用的约定/标准比任何特定的解决方案都更好奇,但我碰巧使用 git 进行修订控制,而 cronjob 正在运行 python/django 脚本。
9 回答
如果您使用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”的商业工具。我不是很推荐它,所以我希望你能找到一个更好的程序来解决同样的问题。我只是说,当你部署它们时,工作的管理并没有结束。
如果您无法将系统连接到配置管理系统(如 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 命令。
我更喜欢让您的项目(包括您的 crontab.txt)处于版本控制之下。然后,使用Fabric,就这么简单:
@task
def crontab():
run('crontab deployment/crontab.txt')
这会将内容安装deployment/crontab.txt
到您连接到服务器的用户的 crontab 中。如果您在服务器上没有完整的项目,您put
首先需要 crontab 文件。
如果您使用的是 Django,请查看django-command-extensions 中的作业系统。
好处是您可以通过版本控制将工作保留在项目结构中,用 Python 编写所有内容并只配置一次 crontab。
我使用Buildout来管理我的 Django 项目。使用 Buildout,我用来z3c.recipe.usercrontab
在部署或更新中安装 cron 作业。
你说:
我对人们使用的约定/标准比任何特定的解决方案都更好奇
但是,公平地说,特定的解决方案将取决于您的环境,并且没有通用的优雅银弹。鉴于您碰巧使用的是 Python/Django,我推荐Celery。它是 Python 的异步任务队列,与 Django 很好地集成。而且,除了作为异步任务队列提供的功能之外,它还具有周期性任务的特定功能。
我亲自使用过该django-celery-beat
集成,它与 Django 设置完美集成,并在分布式环境中正常运行。如果您的定期任务与 Django 相关,我强烈建议您查看 Celery,我开始仅将它用于某些异步邮件,最终将它用于许多异步任务 + 定期健全性检查和其他 Web 应用程序维护的东西。