有没有办法保证使用随机生成的变量的剧本的幂等性?

例如,我想设置crontabs以便在不同时间在多台服务器上触发电子邮件,因此我使用ansible的set_fact模块创建随机整数:

  tasks:
  - set_fact:
      first_run_30="{{ 30 | random }}"
    run_once: yes


然后使用如下所示将这些生成的变量应用到我的crontab中:

   - name: Setup cron30job
    cron: name=cron30job minute={{first_run_30}},{{first_run_30 | int + 30}} job='/bin/bash /cron30job.sh' state=present user=root
    environment:
      MAILTO: 'me@somelist.com'
      MAILFROM: 'me@somehost.com'


这样做非常有效,但是,我相信使用该策略会破坏ansible的独立性原则,因为每次演出后您都会看到变化:

TASK: [Setup cron30job] *****************************************
changed: [127.0.0.1]


此外,在crontab中,在三个单独的运行期间,每次在root下检查:

[ansible]# cat /var/spool/cron/root
#Ansible: cron30job
5,35 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
9,39 * * * * /bin/bash /sw/test/cron30job.sh
#Ansible: cron30job
6,36 * * * * /bin/bash /sw/test/cron30job.sh


我想知道,如果有解决方法,或者在我的场景中无法实现独立性。

最佳答案

代替随机值,您可以获得与该节点相关的信息,例如主机名的哈希或ip地址的最后一个字节。

这是一个例子:

- name: Get a pseudo-random minute
  shell: expr $((16#`echo "{{inventory_hostname}}" | md5sum | cut -c 1-4`)) % 30
  register: minute
  changed_when: false

07-24 09:38
查看更多