2016-10-15 1 views
0

Поскольку я использую возможность для установки задач cron, и поскольку я хочу избежать одновременного выполнения одних и тех же задач одновременно на всем моем сервере, я ищу элегантный решение для генерации cron «случайным образом», сохраняя невосприимчивость, когда я повторно запускаю свою важную роль.Создайте значение cron, остающееся идентичным на основе строки

Я сделал это рабочий сценарий:

#!/bin/bash 
if [ $# -lt 1 ] 
then 
    echo "Syntax error : at least one argument is needed" 
    echo "Syntax: $0 string [ -hmbf ]" 
    echo "-h : display only the hour" 
    echo "-m : display only the minute" 
    echo "-b : display both hour and minute" 
    echo "-f : display both hour and minute in cron format" 
    exit 
fi 

case $2 in 
    -h|--hour) 
    onlyhour=true 
    ;; 
    -m|--minute) 
    onlyminute=true 
    ;; 
    -b|--both) 
    bothhourminute=true 
    ;; 
    -f|--full) 
    fullcron=true 
    ;; 
    *) 
      # unknown option 
    ;; 
esac 

n=$(md5sum <<< "$1") 
number=$((0x${n%% *})) 
number=${number#-} 

position=0 
while [ $position -lt ${#number} ]; do 
     onenumber=${number:$position:1} 
     twonumber=${number:$position:2} 
     if [[ $onenumber -ge 0 && $onenumber -le 6 && -z ${hour+x} ]]; then hour=$onenumber; fi 
     if [[ $twonumber -ge 0 && $twonumber -le 59 && -z ${minute+x} ]]; then minute=$twonumber; fi 
     let position=position+1 
     if [[ -n "$hour" && -n "$minute" ]] 
       then 
         if [ "$onlyhour" = true ] ; then 
           echo $hour 
           exit 0 
         elif [ "$onlyminute" = true ] ; then 
           echo $minute 
           exit 0 
         elif [ "$fullcron" = true ] ; then 
           echo $minute $hour '* * *' 
           exit 0 
         else 
           echo $minute $hour 
           exit 0 
         fi 
     fi 
done 

Идея заключается в том, чтобы вызвать скрипт и дать имя сервера в качестве аргумента.

Я, тем не менее, не убежден в своем собственном решении. Есть ли лучший способ сделать это? Я ищу что-то прямое в Ansible.

ответ

0

Используйте анзибль cron модуля со случайными значениями

- cron: name='JOB_NAME' job="JOB" minute={{ 59 |random }} hour={{ 4 |random(start=3) }} 

Это позволит создать хроны это минута в диапазоне (0-59) и часов в пределах (3-4)

+0

Это интересно в ... но не indempotent. Результат будет различным каждый раз –

1

идемпотентных cron задачи, с раз посеяны inventory_hostname:

- cron: 
    name: myjob 
    job: myscript.sh 
    minute: "{{ (inventory_hostname | hash | list | map('int',0,16) | sum) % 60 }}" 
    hour: "{{ (inventory_hostname | hash | list | map('int',0,16) | sum) % 24 }}" 
+0

Мне очень нравится этот вариант - «случайность» детерминирована, поэтому Ansible не будет продолжать изменять файл. –

+0

И если вам нужно сопоставить более короткий диапазон часов (т. Е. «От 2AM до 5AM»), замените «% 24» на «% 3», а затем добавьте 2 к результату. –

2

по анзибль версии 2.3, это также можно инициализировать случайное число родов из семени. Таким образом, вы можете создавать случайные-но-идемпотентные номера:

{{59 | случайное число (начальный = inventory_hostname)}} * * * * корень/скрипт/с/хрона

+0

Теперь, когда Ansible 2.3 отсутствует, это действительно должно быть рекомендуемым способом. Спасибо за это! – tubaguy50035