Назад | Перейти на главную страницу

Завершение работы Cron во время выполнения SaltStack

Если мы обновим наши системы с помощью 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 или определенные процессы во время обновления, но не помешало бы немного глубже изучить его возможности.