Если мы обновим наши системы с помощью SaltStack, это займет около 40 секунд.
В течение этих 40 секунд состояние системы нестабильно.
Если в этот период запускаются задания cron, вполне вероятно, что они вызывают странные ошибки.
Конечно, мы можем полностью изменить нашу настройку и использовать контейнеры. Это сделало бы возможным атомарное обновление. Но для этого потребуется много работы, с которой сегодня не справиться.
Есть ли способ отключить задания cron на миньоне, если выполняется соль?
Чтобы полностью отключить задания cron, вы можете просто отключить cron
демон (обычно crond
в CentOS и cron
на сервере Ubuntu).
Вы можете остановить и запустить его прямо в солеварне.
Если вам нужно отключить запуск 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
не побежит. Вы также можете создать / удалить файл отключения во время прогона соли.
Остановиться cron
демон при запуске соли, просто включите состояние с чем-то вроде:
stop_cron:
service.dead:
- name: cron
- order: 1
start_cron:
service.running:
- name: cron
- order: last
Вам может потребоваться изменить имя демона cron в зависимости от вашего дистрибутива Linux.
Для 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
На самом деле есть два способа сделать это.
Найдите и измените сценарий, запускающий обновление 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 или определенные процессы во время обновления, но не помешало бы немного глубже изучить его возможности.