PowerCLI为VSphere批量创建虚拟机 | ESXi | PowerShell
一、【背景介绍】
????????笔者认为在一款软件出厂前,前后端各司其职,我们拿到的图形界面的各类按钮,本质是前端小伙伴对后端暴露的接口包装的功能,所以这就意味着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———————————————————————————————————————————————————————————————————————
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!