【问题标题】:ansible - how to iterate children groups in ansible? [closed]ansible - 如何在 ansible 中迭代子组? [关闭]
【发布时间】:2020-10-26 06:18:52
【问题描述】:

我确实有如下库存文件

[父组]
儿童组1
ChildrenGroup2

[儿童组1]
主机1
主机2
主机3

[儿童组2]
主机4
主机5
主机6

现在我想明智地迭代儿童..

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

注意事项?

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

您能否就如何推进这件事提出建议?

【问题讨论】:

  • 您不需要手动迭代。 Ansible 会为你做这件事。只需指定任务并定义它是针对哪些主机。如果您想重用任务,请定义一个角色并将该角色首先应用到第一个组,然后再应用到第二个组。
  • @ceving 等人。当您不理解问题时,这不是关闭问题的理由。
  • @ceving,你不明白这个问题。你说“...首先将角色应用于第一组,然后将角色应用于第二组。”。可能有“...我的库存中有许多儿童组”。看我的回答。
  • @Samuel Liew。当我的答案已经附上时,你投票结束了这个问题。您说“更新问题,使其仅关注一个问题”。问题是:“在多个组上按顺序播放”。你还发现了什么问题?

标签: ansible ansible-inventory ansible-facts ansible-template


【解决方案1】:

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

shell> cat hosts
[ParentGroup:children]
ChildrenGroup1
ChildrenGroup2

[ChildrenGroup1]
host1
host2
host3

[ChildrenGroup2]
host4
host5
host6

您想按照问题中的描述运行 playbook pb.yml。获取剧本并通过将 {{ item }} 放入 hosts:

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

1.创建剧本

下面的剧本在第一个任务中创建了组 my_groups 的列表。然后模板任务迭代这个列表并为组创建剧本。下一个模板任务将这些 playbook 导入 playbook 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 ****

  ...

【讨论】:

  • 谢谢,弗拉基米尔。这应该会检查并恢复到这里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多