如何使用Ansible在主机之间循环并同时设置变量

如何使用Ansible在主机之间循环并同时设置变量,ansible,Ansible,我试图简化部署HA Zookeeper集群的Ansible剧本(3个实例)。因为我需要为每个实例分别设置Zookeeper ID,所以现在看起来像这样(摘录): 现在,我认为应该可以在某种程度上以循环的方式来实现这一点。以下是我想要的一些伪代码: - for i in (1,2,3): hosts: "zoo{{ i }}" tasks: - include tasks/install-zookeeper.yml ID="{{ i }}"

我试图简化部署HA Zookeeper集群的Ansible剧本(3个实例)。因为我需要为每个实例分别设置Zookeeper ID,所以现在看起来像这样(摘录):

现在,我认为应该可以在某种程度上以循环的方式来实现这一点。以下是我想要的一些伪代码:

- for i in (1,2,3):
  hosts: "zoo{{ i }}"
  tasks:
    - include tasks/install-zookeeper.yml ID="{{ i }}"

这样做可能吗?

将每个主机的
ID
var放入您的库存中。这可以直接在清单文件中完成,也可以在
host\u vars/YouHostInventoryName.yml
文件中完成。有关这方面的更多信息,请参阅

对于本例,我们可以使用基本静态yaml库存:

---
全部:
主持人:
zoo1:
身份证号码:1
动物园2:
身份证号码:2
zoo3:
身份证号码:3
现在您只需调用每个主机上的include,它将自动从库存中获取正确的
ID

-主机:所有
任务:
-包括任务:tasks/install-zookeeper.yml
注意:仍受支持,但在不久的将来将不推荐使用。您应该转到新的
,如上述链接文档的注释所述。

相当于

- for i in (1,2,3):
  hosts: "zoo{{ i }}"
  tasks:
    - include tasks/install-zookeeper.yml ID="{{ i }}"
可以通过下面的清单和剧本来实现

shell>cat主机
[组别1]
zoo1
动物园2
zoo3
shell>cat playbook.yml
-主持人:cluster1
任务:
-包括_任务:install-zookeeper.yml
变量:
ID:“{inventory_hostname[3:0]}”

下一个选项是使用主机名中以数字开头的部分。例如
vars:
ID:“{{inventory\u主机名|
regex_replace(“^(\\D*)(.*)$”,“\\2')}”

可以动态更改库存。比如说,

shell>cat playbook.yml
-主机:本地主机
任务:
-添加\u主机:
名称:“动物园{{item+1}}”
组别:cluster1
循环:{range(0,没有服务器|默认值(3)| int)| list}}
-主持人:cluster1
任务:
-调试:
msg:“{{inventory\u主机名|
regex_replace(“^(\\D*)(.*)$”,“\\2')}”
给予

shell>ansible playbook playbook.yml-e“服务器数量=2”
确定:[缩放1]=>
味精:“1”
确定:[缩放2]=>
味精:“2”

政策是什么?似乎
ID
可能是组列表中的索引。换句话说,将
ID
分配给主机的规则是什么?或者,可能有一个
host:ID
hash的字典。这是什么?政策只是每个服务都有唯一的ID。它不需要缩放,所以我用了最简单的方法,只要我觉得合适就给它们添加刚性ID。您的答案中的解决方案可能更适合动态部署,只需稍作更改,因此我稍后可能会切换到该方法。
- for i in (1,2,3):
  hosts: "zoo{{ i }}"
  tasks:
    - include tasks/install-zookeeper.yml ID="{{ i }}"