一键登录 更安全快捷
邮箱登录
我已阅读并接受 用户协议 隐私政策

VCF Operations 9.0 OVA 自动化部署实战指南|PowerShell 与 Bash 双脚本一键部署方案

手动部署 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

automate-vcf-operations-9-ova.png

三、脚本核心功能:不止于 “部署”

两款脚本均实现了 “一站式部署”,流程自动化程度高:

自动完成 VCF Operations 9.0 OVA 镜像的部署配置

部署后自动启动虚拟机(应用设备)

实时检测 /admin URL 端点的可用性,直至服务就绪后才结束流程

无需人工监控启动状态,避免因服务未就绪导致的后续操作失败

四、关键差异:PowerShell 与 Bash 脚本的区别

需要特别注意的是,由于依赖工具不同,两款脚本存在一个核心功能差异:

Bash 脚本(OVFTool):支持通过 “隐藏 OVF 属性” 手动启用 SSH 服务(适合需要登录设备调试的场景)

PowerShell 脚本(PowerCLI):暂不支持 SSH 启用选项(适合标准化部署、无需手动调试的场景)

五、后续配置参考

脚本仅完成 “部署 + 启动 + 就绪检测”,若需进行 VCF Operations 的后续个性化配置(如对接 VCF 集群、告警规则设置等),可参考官方提供的 VCF Operations API 文档,实现部署后的全流程自动化。

用户留言 User Comments