在执行SaltStack期间closuresCron

如果我们使用SaltStack更新我们的系统,则需要大约40秒的时间。

在这40秒内,系统状态不一致。

如果在这段时间内有cron作业,很可能会产生奇怪的错误。

当然,我们可以完全改变我们的设置,并使用容器。 这将使atomar更新成为可能。 但是这需要很多工作,而今天是无法处理的。

如果盐被执行,有没有办法可以禁用仆从上的cron作业?

要完全禁用cron作业,只需closurescron守护进程(通常在CentOS中是crond ,在Ubuntu服务器中是cron )。
您可以停止并直接在盐运行中启动它。

如果您需要禁用cron run来执行某些特定的cron作业,您可以创build一个脚本(我们称之为run-crons ),然后使用它来禁用特定的cron run-crons 。 例如,您可以创build一个类似于以下内容的cron条目:

* * * * * root run-crons && echo "this is my actual cron job"

run-crons脚本类似

 #!/bin/bash set -e [ -f /etc/disabled/crons ] && exit 10 exit 0 

所以如果/etc/disabled/crons存在, run-crons之前的特定cron run-crons不会运行。 在盐运行期间,您也可以创build/删除禁用文件

当盐运行时,要停止cron守护进程,只需包含一个如下所示的状态:

 stop_cron: service.dead: - name: cron - order: 1 start_cron: service.running: - name: cron - order: last 

您可能需要根据您的linux发行版来调整cron守护进程的名称

对于run-crons方式,包括一个类似于.sls的东西:

 disable_cron: file.managed: - name: /etc/disabled/cron - replace: false - order: 1 enable_cron: file.absent: - name: /etc/disabled/cron - order: last 

实际上有两种方法可以做到这一点。

修改脚本方法

find并修改运行SaltStack更新的脚本。 这可能是像bootstrap-salt.sh ,但可以是任何东西。 尝试在更新运行时在进程列表中查找它( ps -ef |grep -i salt )。 最后应该是带有.sh的东西。 一旦find脚本,就可以在脚本的顶部插入一个禁用cron的行。 这是最安全的方法。

这可以是以下任一项:

 /etc/init.d/crond stop 

要么

 crontab -l -u root > /root/cron.bak crontab -r -u root 

注: 后者只适用于你列出的用户,并依赖于你如何pipe理cron。 例如,此方法不会禁用/etc/cron.daily/ cron.hourly/ cron.monthly/ or cron.weekly/列出的任何作业。 如果你决定使用这个方法,那么最好是在你的SaltStack更新的同时确定你不想运行的进程,并禁用运行该进程的cron。

然后在脚本的最后一个以下内容:

 /etc/init.d/crond start 

要么

 crontab -u root /root/cron.bak 

运行守护进程方法

编写一个作为守护程序运行的脚本来检查正在运行的进程,但这不太可靠,并且在脚本循环的时间间隔内可能会错过。 缓解这个问题的唯一方法就是在没有睡眠的情况下进行循环,但是这并不是真正的build议。 如果您无法find或修改为SaltStack启动更新的脚本,我将仅使用此方法作为最后的手段。

守护进程脚本看起来像这样:

 #!/bin/bash while true do # this might have to be tweaked based on the process you are looking for SaltUpdateRunning=$(ps -ef |grep -v grep |grep -i salt |grep -i update | wc -l) if [ $SaltUpdateRunning -gt 0 ] do /etc/init.d/crond stop sleep 3600 # 1 hour just to be safe - you can modify to # match the runtime of SaltStack update /etc/init.d/crond start done sleep 1 # this is for safety but you can remove and it will loop # much faster with less chance to miss the running process done 

你还应该看看SaltStackpipe理cron的能力 。 我不知道是否有一种方法可以在更新正在运行时自动禁用cron或某些进程,但是深入挖掘它的能力并不会带来什么坏处。