【发布时间】:2020-09-15 09:19:45
【问题描述】:
我有一组 20 个跳转服务器 jump_nodes,它们连接到一组 100 个目标目标服务器 dest_nodes。
注意:我们不确定 20 台跳转服务器中的哪台连接到 100 台目标主机中的哪台。
我们有一组任务performtask.yml 需要在所有dest_nodes 主机上执行。
下面是相同的剧本。
---
- name: "Play 1"
hosts: localhost
tasks:
- add_host:
hostname: "{{ item }}"
groups: jump_nodes
with_items: "{{ jump_server_list.split('\n') }}"
- add_host:
hostname: "{{ item }}"
groups: dest_nodes
with_items: "{{ target_server_list.split('\n') }}"
- name: "Play 3"
hosts: jump_nodes
tasks:
- name: Perform tasks on dest_nodes
include_tasks: performtask.yml
with_items: "{{ groups['dest_nodes'] }}"
上述方法的问题是它需要很多时间,即20 X 100 X <number of tasks> = 2000 X <number of tasks>
我的要求是,如果jump_nodes 主机中的任何人能够成功连接并在特定dest_nodes IP 上执行任务,请说10.0.0.99;那么这个主机10.0.0.99 应该从dest_nodes 组中删除,其他跳转服务器应该直接跳过dest_nodes IP。
这样我们将能够大大减少总执行时间和任务数量。
类似remove_hosts 的功能相当于add_hosts 可以解决问题,但我知道没有这样的功能。
更新:使用@Kevin C 提出的解决方案,我无法区分主机之间的差异,而是出现语法错误。以下都不起作用。
groups['dest_nodes' | difference(success_nodes | default([]) )]
groups['dest_nodes' | difference('success_nodes' | default([]))]
groups[dest_nodes | difference(success_nodes | default([]) )]
你能推荐一下吗?
【问题讨论】:
标签: loops ansible hosts ansible-inventory execution-time