解决方案1
你可以用
host_vars
要么
group_vars
,可以在单独的文件中,也可以直接在库存中。
我将尝试使用库存文件(以及应用cron的playbook)生成一个符合您描述的简单示例:
[site1]
host1 cron_restart_minute=0
host2 cron_restart_minute=30
host3 cron_restart_minute=15
host4 cron_restart_minute=45
[site2]
host5 cron_restart_minute=0
host6 cron_restart_minute=30
host7 cron_restart_minute=15
host8 cron_restart_minute=45
</code>
这使用主机变量,如果重复出现问题,您还可以创建其他组并使用组变量。
在剧本或角色中,您可以简单地引用该变量。
在同一台主机上:
- name: Configure the cron job
cron:
# your other options
minute: "{{ cron_restart_minute }}"
</code>
在另一台主机上,您可以访问其他主机变量,如下所示:
hostvars[host2].cron_restart_minute
解决方案2
如果您需要更动态的解决方案,例如因为您不断添加和删除主机,则可以使用在任务中设置变量
register
要么
set_fact
,并计算,例如,当前主机所在的唯一组中的主机数。
例:
- name: Set fact for cron_restart_minute
set_fact:
cron_restart_minute: “{{ 60 / groups[group_names[0]].length * (1 + groups[group_names[0]].index(inventory_hostname)) | int }}”
</code>
我没有测试过这个表达,但我相信它有效。这是Python / Jinja2。
group_names
给出上面的库存是一个1元素数组,因为没有主机同时在两个组中。
groups
包含组中的所有主机,然后我们通过它查找其长度或当前主机的索引
inventory_hostname
(
0
,
1
,
2
,
3
)。