是否可以从 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'] }}"

首先..

正如我们在聊天中所说的那样,它终于奏效了!