Sha*_*bak 5 ansible ansible-2.x ansible-inventory
我想在我使用group_by模块动态创建的多个主机组上运行包含某些角色的剧本.
我能够像下面的例子那样做(ping替换我的实际角色).
我想知道是否有办法在循环中单独运行每个组而不是列出所有实例ID.我不想为每个实例id创建一个重复的行.
这里的目的是一次部署到每个数据中心的一个实例,而不是使用需要很长时间的低序列运行所有实例.
可能有不同的方法,我不想在清单中为每个instance_id创建静态组.
---
- hosts: tag_type_edgenode
tasks:
- group_by: key=instance_id_{{instance_id}}
register: dyn_groups
- hosts: instance_id_1
tasks:
- ping:
- hosts: instance_id_2
tasks:
- ping:
- hosts: instance_id_3
tasks:
- ping:
- hosts: instance_id_4
tasks:
- ping:
Run Code Online (Sandbox Code Playgroud)
如果每组中的主机数相同,则可以使用pattern + serial.
Ansible通过按顺序移动组的模式形成主机列表.因此,如果您拥有相同数量的主机,则由serial形成的批次将等于组.
在您的示例中,如果每组中只有3个主机,则可以使用:
- hosts: instance_id_*
serial: 3
tasks:
- ping:
Run Code Online (Sandbox Code Playgroud)
如果你不介意一点Ansible修补,你可以修改_get_serialized_batches方法.
之前添加此代码while len(all_hosts) > 0::
if 'serialize_by_var' in play.get_vars():
param = play.get_vars()['serialize_by_var']
sb = []
def by_param(x):
vrs = x.get_vars()
if param in vrs:
return vrs[param]
else:
return None
s_hosts = sorted(all_hosts,key=by_param)
for k, g in itertools.groupby(s_hosts, by_param):
sb.append(list(g))
display.vv('Serializing by host var "{}": {}'.format(param,sb))
return sb
Run Code Online (Sandbox Code Playgroud)
你可以通过任何变量序列化主机,如下所示:
- hosts: tag_type_edgenode
vars:
serialize_by_var: instance_id
tasks:
- ping
Run Code Online (Sandbox Code Playgroud)