在执行 SaltStack 期间关闭 Cron

在执行 SaltStack 期间关闭 Cron

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

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

如果在此期间启动了 cron 作业,则它们可能会产生奇怪的错误。

当然,我们可以完全改变我们的设置并使用容器。这将使原子更新成为​​可能。但这需要大量工作,而目前还无法处理。

如果 salt 被执行,有没有办法禁用 minion 上的 cron 作业?

答案1

要完全禁用 cron 作业,您只需关闭cron守护进程(通常crond在 CentOS 和cronUbuntu 服务器中)。
您可以在 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 或某些进程,但深入研究一下它的功能也无妨。

相关内容