ansible-如何在ansible中迭代儿童组?

问题描述

我确实有如下清单文件

[ParentGroup]
儿童组1
ChildrenGroup2

[ChildrenGroup1]
host1
host2
host3

[ChildrenGroup2]
host4
host5
host6

现在我想明智地迭代子项。.

即在host1,host2,host3上并行执行我的任务,即ChildrenGroup1中仅存在于主机上,一旦成功,我就需要与ChildrenGroup2一起使用,即在host4,host5,host6上

要注意点吗?

  1. 如果任何一个子组主机发生故障,那么我们需要等待/暂停,然后再继续下一个子组
  2. 我的库存中将有许多儿童组
  3. 我只需要一次对一个儿童小组执行任务。
  4. 我也要确保所有子组也能一次性解决

您能建议如何实现这一目标吗?

解决方法

这里的关键限制是一个剧本无法启动另一个剧本。唯一的选择是import_playbook。剧本启动时,导入的文件必须可用。结果,解决方案是一个两步过程。在第一步中创建剧本,然后运行它们。例如,给定库存

shell> cat hosts
[ParentGroup:children]
ChildrenGroup1
ChildrenGroup2

[ChildrenGroup1]
host1
host2
host3

[ChildrenGroup2]
host4
host5
host6

您要按照问题中的说明运行剧本pb.yml。拿起剧本并通过将 {{item}} 放入主机来创建模板:

shell> cat pb.yml.j2
- hosts: "{{ item }}"
  gather_facts: false
  tasks:
    - debug:
        msg: "{{ inventory_hostname }}: Playbook started."

1。创建剧本

下面的剧本在第一个任务中创建了 my_groups 组的列表。然后,模板任务将迭代此列表,并为组创建剧本。下一个模板任务将这些剧本导入到剧本pb-groups.yml

shell> cat pb-init.yml
- hosts: localhost
  vars:
    groups_other: [ParentGroup,all,ungrouped]
  tasks:
    - set_fact:
        my_groups: "{{ groups.keys()|difference(groups_other) }}"
    - template:
        src: pb.yml.j2
        dest: "pb-{{ item }}.yml"
      loop: "{{ my_groups }}"
    - template:
        src: pb-groups.yml.j2
        dest: pb-groups.yml
shell> cat pb-groups.yml.j2
- hosts: localhost
  gather_facts: false

{% for group in my_groups %}
- import_playbook: pb-{{ group }}.yml
{% endfor %}

查看创建的文件

shell> cat pb-ChildrenGroup1.yml 
- hosts: "ChildrenGroup1"
  gather_facts: false
  tasks:
    - debug:
        msg: "localhost: Playbook started."
shell> cat pb-ChildrenGroup2.yml 
- hosts: "ChildrenGroup2"
  gather_facts: false
  tasks:
    - debug:
        msg: "localhost: Playbook started."
shell> cat pb-groups.yml
- hosts: localhost
  gather_facts: false

- import_playbook: pb-ChildrenGroup1.yml
- import_playbook: pb-ChildrenGroup2.yml

2。运行创建的剧本

shell> ansible-playbook pb-groups.yml

PLAY [localhost] ****

PLAY [ChildrenGroup1] ****

TASK [debug] ****
ok: [host1] => 
  msg: 'localhost: Playbook started.'
ok: [host2] => 
  msg: 'localhost: Playbook started.'
ok: [host3] => 
  msg: 'localhost: Playbook started.'

PLAY [ChildrenGroup2] ****

TASK [debug] ****
ok: [host4] => 
  msg: 'localhost: Playbook started.'
ok: [host5] => 
  msg: 'localhost: Playbook started.'
ok: [host6] => 
  msg: 'localhost: Playbook started.'

PLAY RECAP ****

  ...


我的清单中的许多儿童组

更改库存。例如

shell> cat hosts
[ParentGroup:children]
ChildrenGroup1
ChildrenGroup2
ChildrenGroup3

[ChildrenGroup1]
host1
host2

[ChildrenGroup2]
host4
host5

[ChildrenGroup3]
host3
host6

下面的命令可以正常工作

shell> ansible-playbook pb-init.yml
  ...
shell> ansible-playbook pb-groups.yml

PLAY [localhost] ****

PLAY [ChildrenGroup1] ****

TASK [debug] ****
ok: [host1] => 
  msg: 'localhost: Playbook started.'
ok: [host2] => 
  msg: 'localhost: Playbook started.'

PLAY [ChildrenGroup2] ****

TASK [debug] ****
ok: [host4] => 
  msg: 'localhost: Playbook started.'
ok: [host5] => 
  msg: 'localhost: Playbook started.'

PLAY [ChildrenGroup3] ****

TASK [debug] ****
ok: [host3] => 
  msg: 'localhost: Playbook started.'
ok: [host6] => 
  msg: 'localhost: Playbook started.'

PLAY RECAP ****

  ...