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
相关产品推荐
相关产品推荐

