如何从vmware_guest_disk_info输出中提取backing_datastore值
VMware虚拟机backing_datastore字段提取失败解决方法
提取失败核心原因有两点:一是未找对vmware_guest_disk_info模块返回值的嵌套层级,二是不同版本的community.vmware集合字段位置存在变动,未做兼容处理。
返回结构层级说明
模块注册的disk_fact变量不是平铺的磁盘列表,实际嵌套规则如下:
- 最外层为模块通用返回字段:
changed、failed等执行状态字段 - 全量磁盘数据存放在
guest_disk_info键下,该值为字典结构:键为磁盘唯一标识,值为单块磁盘的属性对象 - backing datastore名称在单块磁盘的
backing子字典内:新版本集合字段名为datastore,1.10.0之前的老版本集合直接在磁盘属性根节点放置backing_datastore字段
标准返回结构示例:
disk_fact: changed: false failed: false guest_disk_info: "2000": label: "Hard disk 1" scsi_controller: 0 unit_number: 0 capacity_in_kb: 104857600 backing: datastore: "prod_datastore_01" # 新版本存储名字段 filename: "[prod_datastore_01] centos7/centos7.vmdk" # 老版本兼容字段,部分版本会同时返回 backing_datastore: "prod_datastore_01"
正确取值代码示例
- name: 采集目标虚拟机磁盘信息 community.vmware.vmware_guest_disk_info: hostname: "{{ vcenter_host }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" validate_certs: false name: "{{ matched_vm_name }}" # 支持用moid、uuid、IP匹配目标虚拟机 register: disk_fact - name: 遍历输出所有磁盘所属的backing存储 ansible.builtin.debug: msg: >- 磁盘{{ item.value.label }}(控制器{{ item.value.scsi_controller }}:{{ item.value.unit_number }}) 所属datastore:{{ item.value.backing.datastore | default(item.value.backing_datastore, true) }} loop: "{{ disk_fact.guest_disk_info | dict2items }}"
常见问题排查
- 遍历方式错误:
guest_disk_info是字典类型而非列表,直接遍历该值只会拿到磁盘的键名,无法获取属性,必须通过dict2items过滤器转为键值对列表后再遍历 - 权限不足:如果字段返回空值,检查vCenter服务账号是否具备存储浏览权限,缺少
Datastore.Browse权限时该字段会被强制置空 - 版本适配问题:建议优先升级
community.vmware集合到最新稳定版,使用示例中的default过滤器做新旧版本兼容,避免字段路径变动导致的报错 - 匹配逻辑错误:如果前置通过IP匹配虚拟机的逻辑出错,拿到非目标主机的VM对象,也会出现字段不符合预期的问题,可在磁盘采集前输出匹配到的VM名称、MOID做校验
- 调试技巧:拿不准字段路径时,直接将完整返回值写入本地文件排查,不要盲猜字段位置:
- name: 输出disk_fact全量结构到本地调试 ansible.builtin.copy: content: "{{ disk_fact | to_nice_yaml(indent=2) }}" dest: "./disk_fact_debug.yaml" delegate_to: localhost
内容的提问来源于stack exchange,提问作者pugazhendhi_r
相关产品推荐
相关产品推荐

