一次在一个主机组上运行一个剧本

时间:2017-06-20 11:30:43

标签: 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:

3 个答案:

答案 0 :(得分:7)

如果每个组中的主机数相同,则可以使用pattern + serial Ansible通过按顺序移动组的模式形成主机列表。因此,如果您拥有相同数量的主机,则由serial形成的批次将等于组。

在您的示例中,如果每组中只有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

答案 1 :(得分: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

答案 2 :(得分:0)

有一种使用每个组的大小(长度)的简单方法。但是,此操作在组的所有成员上运行,并依次流过这些组。我认为OP正在要求如何对每个小组的第一位成员采取行动,我也在努力弄清楚。

- name: "Restore selected devices in model_dc"
  hosts: group_1, group_2, group_3, group_4, group_5, group_6, group_7, !excluded
  any_errors_fatal: true    # Stop entire play if one host fails
  gather_facts: no
  order: inventory
  serial: 
    - "{{ groups['group_1'] | length }}" # The number of hosts for first batch
    - "{{ groups['group_2'] | length }}" # The number of hosts for second batch
    - "{{ groups['group_3'] | length }}"
    - "{{ groups['group_4'] | length }}"
    - "{{ groups['group_5'] | length }}"
    - "{{ groups['group_6'] | length }}"
    - "{{ groups['group_7'] | length }}" # The number of hosts for every batch until the end.