Ansible-在清单中具有相同命名约定的特定主机组上运行剧本

时间:2019-01-06 21:29:10

标签: ansible ansible-2.x ansible-inventory ansible-role

让我们说一下,我有这种清单,它由主要组下的子组相似的名称组成,但末尾具有不同的服务器IP。 名称相似,是因为这就是我要使用的命名约定,并且我只希望最后的服务器ip有所不同。

[maingroup] 
group1 
group2

[group1] 
subgroup1
subgroup2 
subgroup3 

[group2]
subgroup1 
subgroup2 
subgroup3 

[subgroup1]
server1
server2
server3

[subgroup2]
server4
server5
server6

我想要一个可以接受某些参数的python / shell脚本,例如:

python test.py maingroup group1 subgroup1 

然后在传递vars时在特定主机上运行ansible角色(不确定是否正确):

ansible-playbook -i host.yml --extra-vars "variable_maingroup=maingroup variable_group=group variable_subgroup=subgroup"

我想确保仅在具有以下路径的服务器上运行ansible:maingroup> group1> subgroup1,并将其传递给我的ansible角色作为要在其上运行的主机。

所以我的问题是,我如何才能仅将maingroup.group1下的subgroup1中的服务器作为目标,与传递给脚本的参数顺序相同,而不是在group2中,并且我需要在任务中将哪些内容更改为将此主机作为var传递?

我知道我可以将主机作为一个额外的变量传递,但是我将如何实现这种特定的结构?

有这样的想法:

- hosts: {{ hostvars[groups['maingroup']['group1']['subgroup1'] }}

非常感谢!

1 个答案:

答案 0 :(得分:0)

经过一番挖掘,我找到了问题的答案,因此可以使用 patterns 完成。

内部任务/角色:

- hosts: "{{subgroup}}:&{{group}}:&{{maingroup}}"

命令:

ansible-playbook -i hosts test.yml --extra-vars "maingroup=maingroup group=group1 subgroup=subgroup1"

这将在特定组和特定主要组中包含的子组上运行

如命令中所示:它将仅在group1中包含的subgroup1上运行