Ansible中的幂等性和随机变量 [英] Idempotence and Random Variables in Ansible
问题描述
是否有一种方法可以保证使用随机生成的变量的剧本的幂等性?
Is there a way to guarantee idempotence for playbooks that use randomly generated variables?
例如,我想设置crontabs以便在不同时间在多台服务器上触发电子邮件,因此我使用ansible的set_fact模块创建随机整数:
For example, I want to setup my crontabs to trigger emails on multiple servers at different times, so I create random integers using ansible's set_fact module:
tasks:
- set_fact:
first_run_30="{{ 30 | random }}"
run_once: yes
然后像下面这样使用ansible将这些生成的变量应用于我的crontab:
Then apply those generated variables to my crontab using ansible like so:
- 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的支配原则会因为使用这种策略而被打破,因为每次制作比赛时您都会看到变化:
This works very well, however, ansible's indempotence principle is, I believe, broken using this strategy because each time a play is made you see a change:
TASK: [Setup cron30job] *****************************************
changed: [127.0.0.1]
此外,在crontab中,在三个单独的运行期间,每次都在root下进行检查:
Further, in the crontab checking under root each time during three separate runs:
[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
我想知道,如果有解决方法,或者也许在我的情况下无法实现独立性.
If there is a workaround, or maybe indempotence just will not be possible in my scenario, I would like to know.
推荐答案
代替随机值,您可以获得与节点相关的信息,例如主机名的哈希或IP地址的最后一个字节.
Instead of a random value, you could get something related to the node, like an hash of the hostname or the last byte of the ip address.
这是一个示例:
- name: Get a pseudo-random minute
shell: expr $((16#`echo "{{inventory_hostname}}" | md5sum | cut -c 1-4`)) % 30
register: minute
changed_when: false
这篇关于Ansible中的幂等性和随机变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!