You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible能否在剧本或任务中运行/合并两个不同的Inventory清单?

问题描述

我通过以下命令运行Ansible剧本:

ansible-playbook test-playbook.yml -i /roles/test/vars/inventory/configuration.yml

当前使用的自定义清单configuration.yml内容如下:

-----configuration.yml-----

virtual_servers:
  hosts:
      test1.local:
        name: "test-1.local"
        type: "standard"
        vs_port: 443
        description: ""
        monitor_interval: 30
        ssl_flag: true
        ...
(omissis)

剧本片段示例:

- name: "Verify data"
  import_role:
    name: test_role
    tasks_from: verify_data
  delegate_to: localhost

在执行配置F5负载均衡器的任务时,需要访问另一台主机,示例任务如下:

- name: Get failover state
  f5networks.f5_modules.bigip_device_info:
    gather_subset:
      - devices
    provider:
      server: "{{ item }}"
      user: "{{ username }}"
      password: "{{ password }}"
    delegate_to: localhost
  with_items: groups[target_devices]

但运行时提示target_devices组不存在,因为该组未定义在configuration.yml中。想了解是否可以通过添加或合并另一个清单子集来解决这个问题,原本以为委派可以实现,但未找到方法。

解决方案

1. 运行时合并多个清单文件

Ansible支持同时指定多个清单源,用逗号分隔即可。你可以创建一个单独的清单文件(比如f5_inventory.yml)来定义target_devices组,然后在运行命令时同时加载两个清单:

f5_inventory.yml 示例:

target_devices:
  hosts:
    f5-1.local:
    f5-2.local:

修改后的运行命令:

ansible-playbook test-playbook.yml -i /roles/test/vars/inventory/configuration.yml,-i ./f5_inventory.yml

这样Ansible会自动合并两个清单中的主机和组,任务里的groups['target_devices']就能正常获取到主机列表。

2. 在现有清单中直接添加目标组

如果不需要分开维护清单,可以直接在configuration.yml中追加target_devices组的定义:

virtual_servers:
  hosts:
      test1.local:
        name: "test-1.local"
        type: "standard"
        vs_port: 443
        description: ""
        monitor_interval: 30
        ssl_flag: true
        ...

# 添加F5设备组
target_devices:
  hosts:
    f5-1.local:
    f5-2.local:

修改后重新运行原命令即可,无需调整参数。

3. 直接定义目标设备变量(无需修改清单)

如果不想调整清单结构,可以在剧本或角色的变量中直接定义target_devices列表,替代组的引用:

- name: Get failover state
  f5networks.f5_modules.bigip_device_info:
    gather_subset:
      - devices
    provider:
      server: "{{ item }}"
      user: "{{ username }}"
      password: "{{ password }}"
    delegate_to: localhost
  with_items: "{{ target_devices }}"
  vars:
    target_devices: ["f5-1.local", "f5-2.local"]

或者把target_devices定义在角色的vars/main.yml中,这样整个角色都能复用这个变量。

注意:delegate_to: localhost只是指定任务在本地执行,和清单中的组定义无关——它不会自动引入新的主机组,只是改变任务的执行节点。

内容的提问来源于stack exchange,提问作者Alessandro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:48:20