2016-10-15 34 views
0

由於我使用ansible來設置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

使用ansible cron模塊隨機值

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

這將創建一個cron作業是分在範圍內(0-59)和時間範圍內(3-4)

+0

這interresting ......但不具有不確定性。結果每次都會有所不同 –

1

cron任務,與​​播種時間:

- 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

由於Ansible 2.3版本,它也可以初始化隨機數屬來自種子。通過這種方式,你可以創建隨機但是冪等數字:

{{59 |隨機(種子= inventory_hostname)}} * * * *根/腳本/從/ cron的

+0

現在Ansible 2.3已經出來了,這應該是真正的推薦方式。感謝你! – tubaguy50035