$VMS = import-csv -Path 'vm001.csv'
$Job = $VMS | ForEach-Object -Parallel {
#忽略位
$Skip = $($_.skip)
if ($Skip -eq "yes") { continue }
#虚拟机名字
$VMname = $($_.name)
#资源池名字
$Resource_Pool = $($_.res_pool)
#虚拟机文件夹
$Folder = $($_.folder)
#datastore名字
$Datasto = $($_.datastore)
#模板名称
$Template = $($_.template)
#IP地址
$ip = $($_.ip)
$subnetmask = $($_.subnetmask)
$gateway = $($_.gateway)
$dns1 = $($_.dns1)
$dns2 = $($_.dns2)
#备注信息
$note = $($_.note)
#CPU
$CPU = $($_.cpus)
$core = $($_.cores)
#内存
$memory = $($_.memory)
#硬盘
$disk = $($_.disk)
#每个进程都需要重新连接一次 vcenter服务器
Connect-VIServer "vcenter." -User [email protected] -Password Huayun@123
#自定义策略名称,需要先建立一个linux 或者 windows 的虚拟机自定义规范模板,后面的模板基于此自定义规范进行复制修改
$OSCustomizationSpec = New-OSCustomizationSpec -OSCustomizationSpec $($_.OSCustomizationSpec) -Name $VMname
if ($OSCustomizationSpec.OSType -eq "Linux") {
# Update Spec with our desired IP information
#Get-OSCustomizationSpec -name $OSCustomizationSpec |Get-OSCustomizationNicMapping |Set-OSCustomizationNicMapping -IpMode UseStaticIP -IpAddress $VM.ip -SubnetMask $VM.subnetmask -DefaultGateway 10.0.4.254
$OSCustomizationSpec |
Get-OSCustomizationNicMapping |
Set-OSCustomizationNicMapping -IPmode UseStaticIP `
-IpAddress $ip `
-SubnetMask $subnetmask `
-DefaultGateway $gateway `
}
else {
$OSCustomizationSpec |
Get-OSCustomizationNicMapping |
Set-OSCustomizationNicMapping -IPmode UseStaticIP `
-IpAddress $ip `
-SubnetMask $subnetmask `
-DefaultGateway $gateway `
-Dns $dns1, $dns2 #windows must
}
$OSCustomizationSpec |Set-OSCustomizationSpec -NamingScheme fixed -NamingPrefix $VMname
# Get updated Spec Object
$Spec = Get-OSCustomizationSpec -Name $OSCustomizationSpec
New-VM -Name $VMname `
-Template $Template `
-Datastore $Datasto `
-ResourcePool $Resource_Pool `
-OSCustomizationSpec $Spec `
-Location $Folder `
-Notes $note
Set-VM -VM $VMname `
-NumCpu $CPU `
-CoresPerSocket $core `
-MemoryGB $memory `
-Confirm:$false
Get-HardDisk -VM $VMname | Set-HardDisk -CapacityGB $disk -Confirm:$false
#Get-VM -Name $vmname | Get-NetworkAdapter | Set-NetworkAdapter -Portgroup $vdport -Confirm:$false
Start-VM -VM $VMname
Remove-OSCustomizationSpec -OSCustomizationSpec $OSCustomizationSpec -Confirm:$false
} -ThrottleLimit 5 -AsJob
Receive-Job -Job $Job -Wait
Remove-Job -Job $Job
该PowerCLI脚本可以自动化部署虚拟机,批量多线程操作,包括以下步骤:
- 从CSV文件中读取虚拟机配置信息,包括虚拟机名称、资源池、虚拟机文件夹、数据存储、模板、IP地址、子网掩码、网关、DNS、备注、CPU、内存和硬盘等。
- CSV表头作为变量名称使用。
- 根据虚拟机配置信息创建自定义规范,根据规范配置虚拟机的IP地址、子网掩码、网关、DNS等。
- 使用自定义规范创建虚拟机。
- 配置虚拟机的CPU、内存和硬盘等。
- 启动虚拟机。
需要注意以下事项:
- 环境需要powershel 7 以上版本,执行脚本之前安装VMware PowerCLI,建议使用最新版本。
- 执行脚本需要管理员权限。
- 执行脚本前需要准备好CSV文件,格式必须符合要求。
- 执行脚本前需要确保vCenter服务器已经连接。
- 执行脚本时需要指定自定义规范的名称,该规范必须已经存在且符合要求。
- 执行脚本时需要指定模板的名称,该模板必须已经存在且符合要求。
- 执行脚本时需要指定数据存储的名称,该数据存储必须已经存在且符合要求。
- 执行脚本时需要指定资源池的名称,该资源池必须已经存在且符合要求。
- 执行脚本时需要指定虚拟机文件夹的名称,该文件夹必须已经存在且符合要求。
- 执行脚本时需要指定虚拟机的名称、CPU、内存和硬盘等信息,这些信息必须符合要求。
- 执行脚本时需要指定IP地址、子网掩码、网关、DNS等信息,这些信息必须符合要求。
- 执行脚本时需要指定ThrottleLimit参数,该参数控制并发执行的任务数量,具体取值根据实际情况确定。
麻烦大神给一下修改建议!
标签:脚本,vsphere,OSCustomizationSpec,Get,虚拟机,VM,_.,多线程 From: https://blog.51cto.com/sonic2825/6379251