2016-10-15 33 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