如何用Ansible的VMware模块提取vCenter数据中心名称并复用
问题
使用Ansible的community.vmware.vmware_datacenter_info模块获取vCenter中多个数据中心的名称,用于后续Playbook。已完成信息收集并注册到result变量,但提取名称时出错,需解决如何将数据中心名称注册为可复用变量。
现有Playbook代码:
--- - hosts: localhost gather_facts: False tasks: - name: Gather information about all datacenters community.vmware.vmware_datacenter_info: hostname: "{{ vCenter }}" username: "{{ vCenter_username }}" password: "{{ vCenter_password }}" validate_certs: False delegate_to: localhost register: result
result变量输出:
ok: [localhost] => { "msg": { "changed": false, "datacenter_info": [ { "config_status": "gray", "moid": "datacenter-271", "name": "Sample_DC_1", "overall_status": "gray" }, { "config_status": "gray", "moid": "datacenter-276", "name": "Sample_DC_2", "overall_status": "gray" } ], "failed": false } }
尝试的错误代码:
- name: Display datacenter name debug: msg: - "{{ item.value.name }}" loop: "{{ lookup('dict', result) }}"
错误提示:
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'bool object' has no attribute 'name'"}
解决方案
错误原因
你错误地对整个result字典进行了字典循环,而result中的changed、failed是布尔类型值,循环到这些字段时,item.value是布尔对象,自然没有name属性,导致报错。正确的做法是直接循环result.datacenter_info这个数组,它才是存储所有数据中心信息的列表。
1. 提取并显示数据中心名称
使用以下任务即可正确获取名称:
- name: 显示所有数据中心名称 debug: msg: "{{ item.name }}" loop: "{{ result.datacenter_info }}"
2. 将名称注册为可复用变量
如果需要把所有数据中心名称保存为一个列表变量,供后续任务使用,可以使用set_fact模块:
- name: 注册数据中心名称列表 set_fact: datacenter_names: "{{ result.datacenter_info | map(attribute='name') | list }}" - name: 验证注册的变量 debug: msg: "所有数据中心名称: {{ datacenter_names }}"
执行后,datacenter_names变量将是一个包含所有数据中心名称的列表(示例:["Sample_DC_1", "Sample_DC_2"]),后续Playbook任务可直接调用该变量。
内容的提问来源于stack exchange,提问作者Exadon
相关产品推荐
相关产品推荐

