2017-06-20 81 views
1

我想运行一个剧本,其中包含我使用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: 

回答

4

如果每个组的主机数量相等,则可以使用pattern + serial。
Ansible通过按顺序移动组的模式形成主机列表。所以如果你有相同数量的主机,那么由串行组成的批量将等于组。

在你的榜样,如果每个组中恰好有3台主机,你可以使用:

- hosts: instance_id_* 
    serial: 3 
    tasks: 
    - ping: 

如果你不介意有点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 

,您可以通过任何这样的变量序列化主机:

- hosts: tag_type_edgenode 
    vars: 
    serialize_by_var: instance_id 
    tasks: 
    - ping 
+0

第一个选项工作得很好。它通过组命令主机运行。 –

0

大厦关闭康斯坦丁的想法,你可以做这样的事情使用别名和模式列表:

--- 
- hosts: "*-server-batch-1,*-servers-batch-2,*-server-batch-3" 
    serial: 3 
    ... 
... 


[london] 
london-server-batch-1 ansible_host=server1.london.com 
london-server-batch-2 ansible_host=server2.london.com 
london-server-batch-3 ansible_host=server3.london.com 

[tokyo] 
tokyo-server-batch-1 ansible_host=server1.tokyo.com 
tokyo-server-batch-2 ansible_host=server2.tokyo.com 
tokyo-server-batch-3 ansible_host=server3.tokyo.com 
相关问题