PowerCLI为VSphere批量创建虚拟机 | ESXi | PowerShell

发布时间:2023年12月30日

一、【背景介绍】

????????笔者认为在一款软件出厂前,前后端各司其职,我们拿到的图形界面的各类按钮,本质是前端小伙伴对后端暴露的接口包装的功能,所以这就意味着api提供的功能一般都会比前端点点点提供的功能多(笔者认为是这样,如果有谬误请狠狠捶我)

????????笔者在接触VMware工业解决方案VSphere时,要分配一大批机器,但是没有现成的api和sdk,刚好看到有PowerCLI工具就拿来用了,这是一个PowerShell下运行的CLI工具,不过据笔者浅显的认知貌似这个PowerShell不是主流工具,相信小伙伴们都是从bash开始接触命令,从C扫盲班开始接触编程语言。不过好在语言这个东西学会了一门其他都入门的很快

总之,华语乐坛需要一个天王巨星,语言领域需要一个秦始皇


????????代码逻辑非常简单,不过为了更方便理解,这里给出两个重要概念。接触过资源编排的应该会在某些地方看到这两个单词metadata、userdata,这里指的是虚拟机配置方面,没见过也没关系,且听我慢慢道来。

metadata

元数据,一旦生成无法轻易更改,一般是重要基础设置。例如CPU核心数、内存数量、操作系统等

userdata

用户数据,一般指经常更改的数据,一般是个性化设置。内容和日常在BASH中的命令无异,可以理解为机器配置好后,第一次开机执行的操作。

那么在PowerCLI发起的创建机器命令中,New-VM,Set-NetworkAdapter这种就属于是设置metadata的;Invoke-VMScript执行的命令就属于userdata

本文也就看一乐,感兴趣的小伙伴建议详细看看官网文档

Invoke-VMScript Command | VMware PowerCLI Reference

二、【代码实现】

本代码提供从PowerCLI发起命令批量创建机器,其中提供了针对Windows和Linux设置初始内网IP的方法,按需求取消注释即可。另外Invoke-VMScript命令需要虚拟机安装VMtools才能执行。


# 基础信息
$baseVMName = 'vm-test' # 这里写待克隆的机器名,但是我估计如果有多个同名可能会报错
$NetAdapterName = "test-adap666"    # 网络标签名
$numCpu = 4
$memoryGB = 16
$baseIPAddress = '1.1.1.'
$ds = "vsan999"

# 创建50台虚拟机
for ($i = 1; $i -le 50; $i++) {
    $cloneName = "$baseVMName-clone-$i"
    $newIPAddress = "$baseIPAddress$i"

    # 这里写存储集群名,这里被我注掉了,本质是选了个第一大剩余空间的存储集群
    # $ds = Get-Datastore | Where-Object { $_.Type -eq 'VMFS' -and $_.ExtensionData.Summary.MultipleHostAccess } | Sort-Object -Property FreeSpaceGB -Descending | Select-Object -Index 1
     
    # 这里写物理机名,这里是选了待克隆机器统计群的任意一个物理机
    $esx = Get-Cluster -VM $baseVMName | Get-VMHost | Get-Random

    # 创建新的虚拟机克隆
    $newVM = New-VM -VM $baseVMName -Name $cloneName -Datastore $ds -VMHost $esx -Confirm:$false -NumCpu $numCpu -MemoryGB $memoryGB #-StartAction PowerOn

    # sleep 60s 测试用的,笔者一开始以为创建命令下发后,在机器成功创建前可能无法做更改指令,但是实操发现不需要sleep,给注释掉了
    # Start-Sleep -Seconds 60 

    # 设置虚拟机网络连接和标签,默认不连接,防止冲突
    Get-VM -Name $cloneName | Get-NetworkAdapter | Set-NetworkAdapter -VM $newVM -NetworkName $NetAdapterName -StartConnected:$false


# 下面提供了两种设置IP的方法,windows和linux,使用region和endregion分割

    # region windows set IP addr ———————————————————————————————————————————————————————————————————————————————————————————
#     $code = @'
# `$if = Get-NetAdapter -Physical | where{`$_.LinkLayerAddress -eq '$mac'}

# New-NetIPAddress -InterfaceIndex `$if.ifIndex -IPAddress $ip -PrefixLength $prefix

# '@
#     $vmName = 'MyVM'
#     $ip = '192.168.1.111'
#     $prefix = '24'

#     $vm = Get-VM -Name $vmName
#     $nic = Get-NetworkAdapter -VM $vm -Name 'Network adapter 1'
#     $mac = $nic.MacAddress.Replace(':', '-')

#     Invoke-VMScript -VM $vm -ScriptType Powershell -ScriptText $ExecutionContext.InvokeCommand.ExpandString($code)
    # endregion             ——————————————————————————————————————————————————————————————————————————————————————————

    # region linux set ip addr ————————————————————————————————————————————————————————————————————————
#     $code = @'
# #!/bin/bash

# # Find the network interface (assuming eth0)
# interface="eth0"

# # Assign IP address and netmask
# ip="192.168.1.111"
# netmask="255.255.255.0"

# # Configure the network interface
# ifconfig $interface $ip netmask $netmask
# '@

#     $vmName = 'MyVM'

#     # Get the virtual machine object
#     $vm = Get-VM -Name $vmName

#     # Execute the Linux script in the virtual machine
#     Invoke-VMScript -VM $vm -ScriptType Bash -ScriptText $code
    # endregion———————————————————————————————————————————————————————————————————————
}

文章来源:https://blog.csdn.net/m0_62856417/article/details/135283116
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。