是否可以从 Ansible 组中删除主机?
Is it possible remove host from Ansible group?
我有一组 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([]) )]
你能推荐一下吗?
预期的内容以及您当前的执行情况仍然有点模糊。
但是,您可以创建能够从跳转主机连接到 dest_nodes 的服务器列表。此任务需要时间,但您可以使用 run_once: true
将此任务的执行限制为一台主机。
此外,您可以 use the difference filter 从列表中排除项目 (dest_nodes)。然后执行带有 when
子句的任务 performtask.yml
。
确保首先使用:
- set_fact:
list_1: "{{ groups['dest_nodes'] }}"
- set_fact:
list_2: "{{ groups['success_nodes'] }}"
首先..
正如我们在聊天中所说的那样,它终于奏效了!
我有一组 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([]) )]
你能推荐一下吗?
预期的内容以及您当前的执行情况仍然有点模糊。
但是,您可以创建能够从跳转主机连接到 dest_nodes 的服务器列表。此任务需要时间,但您可以使用 run_once: true
将此任务的执行限制为一台主机。
此外,您可以 use the difference filter 从列表中排除项目 (dest_nodes)。然后执行带有 when
子句的任务 performtask.yml
。
确保首先使用:
- set_fact:
list_1: "{{ groups['dest_nodes'] }}"
- set_fact:
list_2: "{{ groups['success_nodes'] }}"
首先..
正如我们在聊天中所说的那样,它终于奏效了!