获取验证码
手动部署 VCF Operations 9.0 OVA 不仅步骤繁琐、配置易出错,还需人工值守等待服务启动,极大影响运维效率。本文基于实战经验,提供PowerShell+PowerCLI、Bash+OVFTool两套自动化部署脚本,可一键完成 OVA 部署、虚拟机开机与 /admin 端点就绪校验,全程无需人工干预。同时明确两款脚本的功能差异,搭配 VCF Operations API 可实现后续配置自动化,帮 VMware 与 VCF 运维人员简化部署流程、大幅提升工作效率。
近期收到一位用户的邮件咨询,希望了解如何通过 OVA 镜像自动化部署 VCF Operations 9.0。这让我想起 2014 年曾写过相关主题的博客,但随着版本迭代,旧脚本中的 OVF 配置属性已不再适配新版本,亟需更新优化。
作为长期专注于 VMware 云基础架构(VCF)的从业者,我多年来手动编写了大量部署脚本(未借助 AI 工具),基于这些经验,很快完成了 VCF Operations 9.0 的适配工作,并对脚本功能做了进一步增强,以满足实际部署中的高效需求。
为覆盖不同用户的使用习惯(Windows/PowerShell、Linux/macOS/Bash),本次同步提供两种脚本方案,均可直接下载使用:
PowerShell 脚本:基于 VMware PowerCLI 开发,文件名为 deploy_vcf_operations.ps1
# Author: William Lam # Description: Deploy VCF Operations 9.x OVA $VCF_OPERATIONS_OVA = "Operations-Appliance-9.0.2.0.25137838.ova" $VCENTER_HOST="vc01.vcf.lab" $VCENTER_USERNAME="[email protected]" $VCENTER_PASSWORD="VMware1!VMware1!" $VCENTER_CLUSTER="VCF-Mgmt-Cluster" $VM_NETWORK="DVPG_FOR_VM_MANAGEMENT" $VM_DATASTORE="vsanDatastore" $VCF_OPERATIONS_VMNAME="vcf02" $VCF_OPERATIONS_FQDN="vcf02.vcf.lab" $VCF_OPERATIONS_DEPLOYMENT_SIZE="small" $VCF_OPERATIONS_NETWORK_TYPE="Static" $VCF_OPERATIONS_IP=172.30.0.100 $VCF_OPERATIONS_SUBNET=255.255.255.0 $VCF_OPERATIONS_GATEWAY=172.30.0.1 $VCF_OPERATIONS_DNS_SERVER=192.168.30.29 $VCF_OPERATIONS_DNS_DOMAIN="vcf.lab" $VCF_OPERATIONS_DNS_SEARCH="vcf.lab" $VCF_OPERATIONS_ROOT_PASSWORD="VMware1!VMware1!" $VCF_OPERATIONS_TIMEZONE="Etc/UTC" $VCF_OPERATIONS_ENABLE_FIPS=$true #### DO NOT EDIT BEYOND HERE if (-not $global:DefaultVIServer -or -not $global:DefaultVIServer.IsConnected) { Write-Error "No active PowerCLI connection found. Please run Connect-VIServer." exit } $ovfconfig = Get-OvfConfiguration $VCF_OPERATIONS_OVA $ovfconfig.DeploymentOption.Value = $VCF_OPERATIONS_DEPLOYMENT_SIZE $ovfconfig.Common.root_password.Value = $VCF_OPERATIONS_ROOT_PASSWORD $ovfconfig.Common.enableFIPS.Value = $VCF_OPERATIONS_ENABLE_FIPS $ovfconfig.Common.timezone.Value = $VCF_OPERATIONS_TIMEZONE $ovfconfig.Common.VMware_Aria_Operations.domain.Value = $VCF_OPERATIONS_DNS_DOMAIN $ovfconfig.Common.VMware_Aria_Operations.searchpath.Value = $VCF_OPERATIONS_DNS_SEARCH $ovfconfig.Common.VMware_Aria_Operations.DNS.Value = $VCF_OPERATIONS_DNS_SERVER $ovfconfig.Common.VMware_Aria_Operations.ipv4_type.Value = $VCF_OPERATIONS_NETWORK_TYPE $ovfconfig.Common.VMware_Aria_Operations.ipv4_address.Value = $VCF_OPERATIONS_IP $ovfconfig.Common.VMware_Aria_Operations.ipv4_gateway.Value = $VCF_OPERATIONS_GATEWAY $ovfconfig.Common.VMware_Aria_Operations.ipv4_netmask.Value = $VCF_OPERATIONS_SUBNET $ovfconfig.NetworkMapping.Network_1.Value = $VM_NETWORK $VMHost = Get-Cluster $VCENTER_CLUSTER| Get-VMHost | Select -first 1 Write-Host -ForegroundColor Green "Deploying VCF Operations ..." $vm = Import-VApp -Source $VCF_OPERATIONS_OVA -OvfConfiguration $ovfconfig -Name $VCF_OPERATIONS_VMNAME -Location $VCENTER_CLUSTER -VMHost $VMHost -Datastore $VM_DATASTORE -DiskStorageFormat thin -Force Write-Host -ForegroundColor Green "Powering on VCF Operations $VCF_OPERATIONS_VMNAME ..." $vm | Start-VM -Confirm:$false | Out-Null Write-Host "Waiting for VCF Operations UI to be ready ..." while(1) { try { $requests = Invoke-WebRequest -Uri "https://${VCF_OPERATIONS_FQDN}/admin" -Method GET -SkipCertificateCheck -TimeoutSec 5 if($requests.StatusCode -eq 200) { Write-Host "`tVCF Operations UI https://${VCF_OPERATIONS_FQDN}/admin is now ready!" break } } catch { Write-Host "VCF Operations UI is not ready yet, sleeping for 120 seconds ..." sleep 120 } }
Bash 脚本:基于 VMware OVFTool 开发,文件名为 deploy_vcf_operations.sh
#!/bin/bash # Author: William Lam # Description: Deploy VCF Operations 9.x OVA OVFTOOL="/usr/bin/ovftool" VCF_OPERATIONS_OVA="Operations-Appliance-9.0.2.0.25137838.ova" VCENTER_HOST="vc01.vcf.lab" VCENTER_USERNAME="[email protected]" VCENTER_PASSWORD="VMware1!VMware1!" VCENTER_DATACENTER="VCF-Datacenter" VCENTER_CLUSTER="VCF-Mgmt-Cluster" VM_NETWORK="DVPG_FOR_VM_MANAGEMENT" VM_DATASTORE="vsanDatastore" VCF_OPERATIONS_VMNAME="vcf02" VCF_OPERATIONS_FQDN="vcf02.vcf.lab" VCF_OPERATIONS_DEPLOYMENT_SIZE="small" VCF_OPERATIONS_NETWORK_TYPE="Static" VCF_OPERATIONS_IP="172.30.0.100" VCF_OPERATIONS_SUBNET="255.255.255.0" VCF_OPERATIONS_GATEWAY="172.30.0.1" VCF_OPERATIONS_DNS_SERVER="192.168.30.29" VCF_OPERATIONS_DNS_DOMAIN="vcf.lab" VCF_OPERATIONS_DNS_SEARCH="vcf.lab" VCF_OPERATIONS_ROOT_PASSWORD="VMware1!VMware1!" VCF_OPERATIONS_TIMEZONE="Etc/UTC" VCF_OPERATIONS_ENABLE_SSH="True" VCF_OPERATIONS_ENABLE_FIPS="True" ### DO NOT EDIT BEYOND HERE ### echo -e "\nDeploying VCF Operation ${VCF_OPERATIONS_VMNAME} ..." "${OVFTOOL}" --acceptAllEulas --noSSLVerify --skipManifestCheck --X:enableHiddenProperties --allowExtraConfig --X:waitForIp --sourceType=OVA --powerOn \ "--deploymentOption=${VCF_OPERATIONS_DEPLOYMENT_SIZE}" \ "--net:Network 1=${VM_NETWORK}" --datastore=${VM_DATASTORE} --diskMode=thin --name=${VCF_OPERATIONS_VMNAME} \ "--prop:ipv4_type.VMware_Aria_Operations=${VCF_OPERATIONS_NETWORK_TYPE}" \ "--prop:ipv4_address.VMware_Aria_Operations=${VCF_OPERATIONS_IP}" \ "--prop:ipv4_netmask.VMware_Aria_Operations=${VCF_OPERATIONS_SUBNET}" \ "--prop:ipv4_gateway.VMware_Aria_Operations=${VCF_OPERATIONS_GATEWAY}" \ "--prop:domain.VMware_Aria_Operations=${VCF_OPERATIONS_DNS_DOMAIN}" \ "--prop:searchpath.VMware_Aria_Operations=${VCF_OPERATIONS_DNS_SEARCH}" \ "--prop:DNS.VMware_Aria_Operations=${VCF_OPERATIONS_DNS_SERVER}" \ "--prop:enableFIPS=${VCF_OPERATIONS_ENABLE_FIPS}" \ "--prop:timezone=${VCF_OPERATIONS_TIMEZONE}" \ "--prop:guestinfo.cis.appliance.ssh.enabled=${VCF_OPERATIONS_ENABLE_SSH}" \ "--prop:root_password=${VCF_OPERATIONS_ROOT_PASSWORD}" \ ${VCF_OPERATIONS_OVA} "vi://${VCENTER_USERNAME}:${VCENTER_PASSWORD}@${VCENTER_HOST}/${VCENTER_DATACENTER}/host/${VCENTER_CLUSTER}" echo "Waiting for VCF Operations UI to be ready ..." while true; do STATUS=$(curl -sk -o /dev/null -w "%{http_code}" "https://${VCF_OPERATIONS_FQDN}/admin" --connect-timeout 5) if [ "$STATUS" -eq 200 ]; then echo -e "\tVCF Operations UI https://${VCF_OPERATIONS_FQDN}/admin is now ready!" break else echo "VCF Operations UI is not ready yet (Status: $STATUS), sleeping for 120 seconds ..." sleep 120 fi done

两款脚本均实现了 “一站式部署”,流程自动化程度高:
自动完成 VCF Operations 9.0 OVA 镜像的部署配置
部署后自动启动虚拟机(应用设备)
实时检测 /admin URL 端点的可用性,直至服务就绪后才结束流程
无需人工监控启动状态,避免因服务未就绪导致的后续操作失败
需要特别注意的是,由于依赖工具不同,两款脚本存在一个核心功能差异:
Bash 脚本(OVFTool):支持通过 “隐藏 OVF 属性” 手动启用 SSH 服务(适合需要登录设备调试的场景)
PowerShell 脚本(PowerCLI):暂不支持 SSH 启用选项(适合标准化部署、无需手动调试的场景)
脚本仅完成 “部署 + 启动 + 就绪检测”,若需进行 VCF Operations 的后续个性化配置(如对接 VCF 集群、告警规则设置等),可参考官方提供的 VCF Operations API 文档,实现部署后的全流程自动化。