如果我们使用 SaltStack 更新我们的系统,这大约需要 40 秒。
在这40秒内系统的状态并不一致。
如果在此期间启动了 cron 作业,则它们可能会产生奇怪的错误。
当然,我们可以完全改变我们的设置并使用容器。这将使原子更新成为可能。但这需要大量工作,而目前还无法处理。
如果 salt 被执行,有没有办法禁用 minion 上的 cron 作业?
答案1
要完全禁用 cron 作业,您只需关闭cron
守护进程(通常crond
在 CentOS 和cron
Ubuntu 服务器中)。
您可以在 salt run 中直接停止和启动它。
如果您需要仅针对某些特定的 cron 作业禁用 cron 运行,您可以创建一个脚本(我们称之为run-crons
)并使用它来禁用特定的 cron 运行。例如,您可以创建类似于以下内容的 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
存在,则那些以 开头的特定 cron 行将run-crons
不会运行。您也可以在 salt 运行期间创建/删除禁用文件
要cron
在 salt run 时停止守护进程,只需包含类似以下内容的状态:
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
答案2
实际上,有两种方法可以做到这一点。
修改脚本方法
找到并修改运行 SaltStack 更新的脚本。它可能类似于bootstrap-salt.sh
,但可以是任何内容。尝试在更新运行时在进程列表中查找它(ps -ef |grep -i salt
)。它应该是末尾带有 .sh 的内容。找到脚本后,您可以在脚本顶部插入一行禁用 cron 的内容。这是最安全的方法。
可以是下列之一:
/etc/init.d/crond stop
或者
crontab -l -u root > /root/cron.bak
crontab -r -u root
笔记: 后者仅适用于您列出的用户,并且取决于您如何管理 cron。例如,此方法不会禁用 中列出的任何作业/etc/cron.daily/ cron.hourly/ cron.monthly/ or cron.weekly/
。如果您决定使用此方法,最好实际识别您不想在 SaltStack 更新的同时运行的进程,并禁用专门运行该进程的 cron。
然后在脚本的末尾执行下列操作之一:
/etc/init.d/crond start
或者
crontab -u root /root/cron.bak
运行守护进程方法
编写一个作为守护进程运行的脚本来检查正在运行的进程,但这种方法不太可靠,并且有可能在脚本循环的时间间隔内丢失。缓解这种情况的唯一方法是不休眠就循环,但同样,这不是真正建议的。如果您无法找到或修改启动 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
你还应该调查SaltStack 管理 cron 的能力。我不确定是否有办法让它在更新运行时自动禁用 cron 或某些进程,但深入研究一下它的功能也无妨。