Terraform vSphere Provider ovf_deploy部署VM的remote_ovf_url配置问题
答复结论
- 你的推测完全正确:
remote_ovf_url本身就不支持填写vCenter数据存储的文件夹路径、vCenter Web UI的前端路由地址。 - 当前官方Terraform vSphere Provider的
ovf_deploy配置块,原生不支持直接读取存放在vCenter数据存储、vCenter内容库中的OVF文件完成部署。
原因说明
remote_ovf_url 参数的设计逻辑,是要求传入Terraform执行节点可以直接通过HTTP/HTTPS协议访问、不需要依赖浏览器会话鉴权的文件直链。你之前尝试的三类URL全部不符合要求:
- 从OVF导出页复制的
/cls/data/路径是vCenter前端生成的带短期令牌的临时接口,依赖浏览器登录会话,且令牌过期后就会失效 - F12抓包拿到的
/ui/data/properties/路径是内容库文件夹的属性查询接口,根本不是OVF文件的下载地址 - 数据存储页面拼接的
/ui/app/datastore/路径是vSphere Client的前端路由地址,返回的是网页内容,不是OVF文件本体
Terraform进程运行时不会携带你浏览器的登录Cookie,自然无法通过这些地址拉取到OVF文件,必然部署失败。
可行解决方案
根据你的使用场景,选以下任意一种方式即可:
- 使用内部HTTP静态服务存放OVF
把OVF文件、同目录关联的vmdk磁盘文件、mf清单文件放到Nginx静态服务、内部对象存储等位置,生成不需要登录鉴权的直链填入remote_ovf_url,确保在Terraform运行的机器上直接用curl访问该URL可以直接下载到OVF文件即可。注意:OVF是多文件结构,必须保证关联的vmdk、mf文件和OVF在同路径下可访问,否则部署时会报找不到磁盘的错误。
- 使用本地OVF路径部署
把数据存储上的OVF及关联文件下载到Terraform执行节点的本地磁盘,把remote_ovf_url替换为local_ovf_path参数,填写本地文件的绝对路径即可部署。 - 通过内容库克隆方式部署(最适配vCenter原生场景)
如果你的OVF已经上传到vCenter内容库,不要用ovf_deploy块,直接通过内容库模板克隆的方式创建虚拟机,参考配置片段:
如果OVF目前只存在于数据存储上,可以先手动将其导入vCenter内容库,再用上述方式部署,比走HTTP直链更稳定。# 查找目标内容库 data "vsphere_content_library" "target" { name = "替换为你的内容库名称" } # 查找内容库中存放的OVF模板 data "vsphere_content_library_item" "ovf_tpl" { name = "替换为内容库中的OVF模板名称" library_id = data.vsphere_content_library.target.id } resource "vsphere_virtual_machine" "vm" { # 省略你原有配置中的名称、集群、主机、存储、网络、CPU内存等基础参数 # 用clone块替换原来的ovf_deploy块 clone { template_uuid = data.vsphere_content_library_item.ovf_tpl.id } }
现有配置的额外修正点
你当前配置里同时写了ovf_deploy块和根级别的disk块,会产生配置冲突:从OVF部署时系统盘的配置已经从OVF模板中读取,不需要额外定义系统盘的disk块,除非你要额外挂载独立的数据盘,否则请删除根级别对应disk0的disk配置块,避免部署报错。
内容的提问来源于stack exchange,提问作者coding_newbie
相关产品推荐
相关产品推荐

