Если мы обновим наши системы с помощью SaltStack, это займет около 40 секунд.
В течение этих 40 секунд состояние системы не согласовано.
] Если в этот период запускаются задания cron, вполне вероятно, что они производят странные ошибки.
Конечно, мы могли бы полностью изменить наши настройки и использовать контейнеры. Это сделало бы возможным атомарное обновление. Но для этого потребуется много работы, с которой сегодня невозможно справиться.
Есть ли способ отключить задания cron на миньоне, если выполняется соль?
Чтобы полностью отключить задания cron, вы можете просто отключить демон cron
(обычно это crond
в CentOS и cron
] на сервере Ubuntu).
Вы можете остановить и запустить его прямо в режиме соли.
Если вам нужно отключить запуск cron только для некоторых конкретных заданий cron, вы можете просто создать сценарий (назовем его run-crons
) и используйте его, чтобы отключить только определенные запуски cron. Например, вы можете создать запись cron, подобную:
* * * * * root run-crons && echo «это мое настоящее задание cron»
с помощью скрипта 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 / или 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 или определенные процессы во время обновления, но не помешало бы немного глубже изучить его возможности.