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

Если мы обновим наши системы с помощью SaltStack, это займет около 40 секунд.

В течение этих 40 секунд состояние системы не согласовано.

] Если в этот период запускаются задания cron, вполне вероятно, что они производят странные ошибки.

Конечно, мы могли бы полностью изменить наши настройки и использовать контейнеры. Это сделало бы возможным атомарное обновление. Но для этого потребуется много работы, с которой сегодня невозможно справиться.

Есть ли способ отключить задания cron на миньоне, если выполняется соль?

2
задан 27 October 2017 в 15:18
2 ответа

Чтобы полностью отключить задания 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
1
ответ дан 3 December 2019 в 12:34

На самом деле есть два способа может это сделать.

Изменение метода сценария

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

0
ответ дан 3 December 2019 в 12:34

Теги

Похожие вопросы