我正在尝试为每个主机实现增量间隔事实。我试过:
---
- name: Incremental interval per host
hosts: cluster
gather_facts: true
tasks:
- name: Set interval fact
ansible.builtin.set_fact:
interval: '{{ interval | default(0) | int + 10 }}'
- name: Debug
ansible.builtin.debug:
var: interval
预期结果:
TASK [Debug] *************
ok: [apollo] =>
period: '10'
ok: [boreas] =>
period: '20'
ok: [cerus] =>
period: '30'
实际结果:
TASK [Debug] *************
ok: [apollo] =>
period: '10'
ok: [boreas] =>
period: '10'
ok: [cerus] =>
period: '10'
你能让我知道我错过了什么吗?
下面的任务做你想要的
运行该任务一次并迭代ansible_play_hosts_all。
将每次迭代委托给主机,并委托_facts将事实分配给委托的主机。
使用index_var来增加周期。
鉴于库存
用于测试的完整剧本示例
给出
Ansible 事实(和变量 - 几乎但不完全相同)属于主机。Ansible 中不存在全局变量这样的概念(除了以不同方式表现的魔法变量或特殊变量)——最终,所有变量都被扁平化到主机级别。这意味着,您的
interval
变量对于每个主机来说实际上是唯一的,因此您要增加相同的变量,但对于cluster
组中的每个主机以不同的方式。您的问题没有包含足够的信息来建议解决方案,因为这取决于您实际想要实现的目标。
仅举几个例子:
如果您只是需要为不同主机提供相同变量的不同固定值,则可以在主机级别的清单中设置它们。
如果您需要一个变量来取决于主机顺序,并且应以数学方式修复差异,则可以
interval: "{{ groups['cluster'].index(inventory_hostname) * 10 }}
在cluster
组级别进行设置。但请记住,在剧本的不同执行中或添加/删除主机时,不能保证此顺序相同。如果您需要迭代主机列表并根据发现的事实生成一些值,则需要首先收集它们,然后在不同的任务/游戏中(可能在不同的主机上)处理它们(例如
localhost
,控制节点,使用delegate_to
、delegate_facts
或操作 `hostvars['localhost'] 如果您需要变量是单个的)。