如何获取vmware.vmware_rest.vcenter_vm模块placement参数值及解决报错?
解决Ansible vmware_rest.vcenter_vm克隆VM的placement参数及权限问题
一、placement参数的取值与获取方法
placement中的datastore、resource_pool、folder必须传入对应资源的MOID(Managed Object ID),而非资源名称,以下是各参数MOID的具体获取方式:
1. 获取datastore的MOID
使用vmware.vmware_rest.vcenter_datastore_info模块查询并提取:
- name: 获取目标存储信息 vmware.vmware_rest.vcenter_datastore_info: register: datastore_info - name: 按名称提取存储MOID set_fact: target_datastore_moid: "{{ item.datastore }}" loop: "{{ datastore_info.value }}" when: item.name == "你的目标存储名称"
2. 获取resource_pool的MOID
使用vmware.vmware_rest.vcenter_resource_pool_info模块直接过滤名称:
- name: 获取目标资源池信息 vmware.vmware_rest.vcenter_resource_pool_info: filter_names: ["你的资源池名称"] register: resource_pool_info - name: 设置资源池MOID变量 set_fact: target_resource_pool_moid: "{{ resource_pool_info.value[0].resource_pool }}"
3. 获取folder的MOID
使用vmware.vmware_rest.vcenter_folder_info模块,需指定文件夹类型为VIRTUAL_MACHINE:
- name: 获取VM文件夹信息 vmware.vmware_rest.vcenter_folder_info: filter_type: VIRTUAL_MACHINE filter_names: ["你的目标VM文件夹名称"] register: folder_info - name: 设置文件夹MOID变量 set_fact: target_folder_moid: "{{ folder_info.value[0].folder }}"
二、权限不足问题的解决
报错提到的VirtualMachine.Inventory.CreateFromExisting和Resource.AssignVMToPool是克隆VM的核心权限,需为Ansible使用的vCenter账号配置以下权限:
- 在目标资源池上:添加Resource -> Assign virtual machine to resource pool权限
- 在源VM所在的文件夹/集群上:添加Virtual Machine -> Inventory -> Create from existing权限
- 额外补充权限:Datastore -> Allocate space(用于存储克隆文件)、Virtual Machine -> Configuration(用于VM参数配置)
可先给账号分配VMware管理员角色验证权限问题是否解决,之后再按需细化权限范围。
三、placement参数值为空的排查
若参数仍为空,检查以下几点:
- 用
debug模块打印查询模块的返回值(如{{ datastore_info.value }}),确认目标资源存在于返回列表中 - 核对资源名称的大小写和拼写,确保完全匹配
- 确认vCenter账号拥有读取这些资源的基础Read权限
完整示例Playbook片段
- name: 克隆VM hosts: localhost gather_facts: no tasks: - name: 获取源VM信息 vmware.vmware_rest.vcenter_vm_info: filter_names: ["源VM名称"] register: source_vm_info - name: 获取目标存储MOID vmware.vmware_rest.vcenter_datastore_info: filter_names: ["目标存储名称"] register: datastore_info - name: 获取目标资源池MOID vmware.vmware_rest.vcenter_resource_pool_info: filter_names: ["目标资源池名称"] register: resource_pool_info - name: 获取目标VM文件夹MOID vmware.vmware_rest.vcenter_folder_info: filter_type: VIRTUAL_MACHINE filter_names: ["目标文件夹名称"] register: folder_info - name: 执行克隆操作 vmware.vmware_rest.vcenter_vm: state: cloned source: "{{ source_vm_info.value[0].vm }}" name: "新VM名称" placement: datastore: "{{ datastore_info.value[0].datastore }}" resource_pool: "{{ resource_pool_info.value[0].resource_pool }}" folder: "{{ folder_info.value[0].folder }}" guest_OS: "CENTOS_7_64" # 替换为源VM对应的OS类型 register: clone_result
内容的提问来源于stack exchange,提问作者Kavisha Abeynayaka
相关产品推荐
相关产品推荐

