关山难越,谁悲失路之人;萍水相逢,尽是他乡之客。
百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程教程 > 技术文章 > 正文

PowerCLI虚拟机自定规范批量创建虚拟机测试

guanshanw 2023-08-24 00:17 115 浏览 0 评论

1、背景需求

使用Powershell的VMware PowerCLI模块创建虚拟机,基本思路,通过Powershell的Import-Excel模块读取自定义Excel表格的内容,到vCenter Server中执行脚本的操作命令。

测试环境如下:

vCenter Server下的一个群集Cluster,Cluster启用了DRS,并配置了自动化级别为全自动,以便使群集在虚拟机启动时自动选择虚拟机的存放主机。群集内主机挂载有共享存储DATA。创建的虚拟机都放置在共享存储上。

群集Cluster上的主机规划有

默认管理网vSwitch0端口组VM Network,VLAN ID:0。

业务网vSwitch1端口组INSIDE-NETWORK01,VLAN ID:1000。

心跳网络vSwith2端口组heartbeat,VLAN ID:999。

vCenter Server已有虚拟机模板:rehl7.9和Windows2016。模板要求:

1、安装VM Tools

2、建议非Minimal安装,rhel7.9使用'Server with GUI'。

要实现以上目标,规划了Excel的虚拟机配置信息表中的各字段如下:

虚拟机配置资源表

使用power shell的import-excel来读取这个资源表,再连接到vCenter Server执行虚拟机创建操作。

2、工具:

1)、Window 10的Powershell

PS C:\Users\stcoc> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.610
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.610
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

2)、Powershell的模块:

下边VMware的是安装或者导入的。模块的放置目录

PS C:\Users\stcoc> Get-Module | Select-Object -Property ModuleType,Version,Name | ft -a

	ModuleType 			Version         					Name
	---------- 						-------         						----
  Manifest 						3.1.0.0         						Microsoft.PowerShell.Management
  Manifest 						3.0.0.0         						Microsoft.PowerShell.Security
  Manifest 						3.1.0.0         						Microsoft.PowerShell.Utility
  Manifest 						3.0.0.0         						Microsoft.WSMan.Management
  Script 								2.0.0           							PSReadline
  Script 								7.0.0.15939650  			VMware.Vim
  Script 								12.0.0.15939657 		 VMware.VimAutomation.Cis.Core
  Script 								12.0.0.15939652 		 VMware.VimAutomation.Common
  Script 								12.0.0.15939655 		 VMware.VimAutomation.Core
  Script 								12.1.0.16997004 		 VMware.VimAutomation.Sdk

3)、模块放置目录:

PS C:\Program Files\WindowsPowerShell\Modules> Get-ChildItem -Directory


    目录: C:\Program Files\WindowsPowerShell\Modules


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2020/12/31      1:00                ImportExcel
d-----         2019/12/7     17:31                Microsoft.PowerShell.Operation.Validation
d-----         2019/12/7     17:31                PackageManagement
d-----         2019/12/7     17:31                Pester
d-----         2019/12/7     17:31                PowerShellGet
d-----        2020/12/31      1:00                PSReadline
d-----        2020/12/31      1:00                VMware.CloudServices
d-----        2020/12/31      1:00                VMware.DeployAutomation
d-----        2020/12/31      1:00                VMware.ImageBuilder
d-----        2020/12/31      1:00                VMware.PowerCLI
d-----        2020/12/31      1:00                VMware.Vim
d-----        2020/12/31      1:00                VMware.VimAutomation.Cis.Core
d-----        2020/12/31      1:00                VMware.VimAutomation.Cloud
d-----        2020/12/31      1:00                VMware.VimAutomation.Common
d-----        2020/12/31      1:00                VMware.VimAutomation.Core
d-----        2020/12/31      1:00                VMware.VimAutomation.Hcx
d-----        2020/12/31      1:00                VMware.VimAutomation.HorizonView
d-----        2020/12/31      1:00                VMware.VimAutomation.License
d-----        2020/12/31      1:00                VMware.VimAutomation.Nsxt
d-----        2020/12/31      9:48                VMware.VimAutomation.Sdk
d-----        2020/12/31      1:00                VMware.VimAutomation.Security
d-----        2020/12/31      1:00                VMware.VimAutomation.Srm
d-----        2020/12/31      1:00                VMware.VimAutomation.Storage
d-----        2020/12/31      1:00                VMware.VimAutomation.StorageUtility
d-----        2020/12/31      1:00                VMware.VimAutomation.Vds
d-----        2020/12/31      1:00                VMware.VimAutomation.Vmc
d-----        2020/12/31      1:00                VMware.VimAutomation.vROps
d-----        2020/12/31      1:00                VMware.VimAutomation.WorkloadManagement
d-----        2020/12/31      1:00                VMware.VumAutomation

4)、安装有Windows office 套件。

3、脚本内容:

# Import-Module VMware.PowerCLI 并连接到vCenter
$username="administrator@vsphere.local"
$password=ConvertTo-SecureString "VMware1!" -AsPlainText -Force
$credential=New-Object System.Management.Automation.PSCredential($username,$password)
$server = Connect-VIServer -Server 10.10.10.230 -Credential $credential -Force -Verbose
# 导入Excel文件内容
$excel=Import-Excel -Path D:\Scripts\Template.xlsx
# 创建临时的虚拟机的自定义规范配置
$windows=New-OSCustomizationSpec -Name Windows `
-Type NonPersistent `
-OSType Windows `
-NamingScheme vm `
-FullName Zeus `
-OrgName domain.com `
-AdminPassword "P@ssw0rd" `
-AutoLogonCount 3 `
-ChangeSid:$true `
-ProductKey "WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY" `
-LicenseMode PerServer `
-LicenseMaxConnections 5 `
-Workgroup workgroup `
-DnsSuffix domain.com `
-TimeZone 210 `
-Verbose
$linux=New-OSCustomizationSpec -Name Linux `
-Type NonPersistent `
-OSType Linux `
-NamingScheme vm `
-DnsSuffix domain.com `
-Domain domain.com `
-Verbose

foreach($vm in $excel){
$vmcompute=Get-Cluster -Name $vm.cluster -Server $server
$vmdatastore=Get-Datastore -Name $vm.datastore -Server $server
# 通过用户名创建一个用户目录,在用户目录内创建虚拟机
Get-Folder -Name $vm.username -Type VM
if($? -ne $true){
    "Folder Not Exist,Wait For Craete " | Write-Verbose
    New-Folder -Name $vm.username -Location VM
    }
$vmfolder=Get-Folder -Name $vm.username
# 以excel内的用户名-业务类型-节点数字定义虚拟机名称
$vmname=$vm.username+"-"+$vm.application+"-"+$vm.nodenumber
$vmtemplate=Get-Template -Name $vm.template
$vmswitch=Get-VirtualSwitch -Server $server | Where-Object {$_.Name -eq $vm.vswitch}
# VLanID值为0,设置成默认的端口组"VM Network"
if($vmswitch -eq "vSwitch0" -and $vm.vlan -eq 0 ){
    $vmportgroup=Get-VirtualPortGroup -Name "VM Network" -Standard -VirtualSwitch $vmswitch
    $windows | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -AlternateGateway 223.5.5.5
    $linux | Get-OSCustomizationNicMapping  | Set-OSCustomizationNicMapping  -Dns $vm.defaultgateway -AlternateGateway 223.5.5.5
    }else{
        # 根据VLAN号确定端口组
        $vmportgroup=Get-VirtualPortGroup -VirtualSwitch $vmswitch | Where-Object {$_.VLanId -eq $vm.vlan}
        $vmportgroup | Write-Verbose
        }
# 根据系统模板类型创建虚拟机
if($vm.template -like "rhel*" -or $vm.template -like "centos*"){
    $linux | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -IpMode UseStaticIP `
    -IpAddress $vm.ipaddress `
    -SubnetMask $vm.subnetmask `
    -DefaultGateway $vm.defaultgateway -Verbose
    
    New-VM -Name $vmname `
    -ResourcePool $vmcompute `
    -Datastore $vmdatastore -Template $vmtemplate `
    -OSCustomizationSpec $linux -Location $vmfolder -Notes $vm.remarks -Verbose
    }else{
        $windows | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping -IpMode UseStaticIP `
        -IpAddress $vm.ipaddress `
        -SubnetMask $vm.subnetmask -DefaultGateway $vm.defaultgateway `
        -Dns $vm.defaultgateway -Verbose
    
    New-VM -Name $vmname `
    -ResourcePool $vmcompute `
    -Datastore $vmdatastore -Template $vmtemplate `
    -OSCustomizationSpec $windows -Location $vmfolder `
    -Notes $vm.remarks -Verbose
        }
$vmdeployed=Get-VM -Name $vmname
# 配置虚拟机计算资源
$vmdeployed | Set-VM -NumCpu $vm.numcpu -CoresPerSocket ($vm.numcpu/2)  -MemoryGB $vm.memory -Verbose -Confirm:$false
# 配置虚拟机网络端口组
$mynetworkadapter=$vmdeployed | Get-NetworkAdapter -Name "Network adapter 1" 
if($mynetworkadapter.Name -ne $vmportgroup.Name){
Set-NetworkAdapter -NetworkAdapter $mynetworkadapter -NetworkName $vmportgroup -Type Vmxnet3 -StartConnected:$true -WakeOnLan:$true -RunAsync -Verbose -Confirm:$false
}
# 配置虚拟机的磁盘个数和容量
$vmolddisksize= ($vmdeployed | Get-HardDisk).CapacityGB
if($vmolddisksize -lt $vm.disksize){
    $count=1
    while($count -le $vm.newdiskcounts ){
        $vmeachdisksize=($vm.disksize-$vmolddisksize)/$vm.newdiskcounts
        if($vmeachdisksize -eq 0){
        "You don't need new Harddisk" | Write-Verbose
        }else{
        New-HardDisk -CapacityGB $vmeachdisksize -Datastore $vmdatastore -StorageFormat Thin -VM $vmdeployed
        }
        $count+=1
        }
    }
# 启动虚拟机
$vmdeployed | Start-VM -RunAsync
# Start-Sleep -Seconds 20
# $vmdeployed | Select-Object -Property Name,{$_.Guest.IPaddress}
}
# 删除临时虚拟机自定义配置规范并退出
Get-OSCustomizationSpec -Type NonPersistent | Remove-OSCustomizationSpec -Verbose -Confirm:$false
Disconnect-VIServer -Server $server -Confirm:$false -Verbose

4、执行情况

虚拟机资源表创建虚拟机结果如下:


powershell创建虚拟机

以上,完成了通过虚拟机自定义规范,通过powershell脚本创建虚拟机的目标,要创建其他业务的虚拟机,可以通过修改Excel中的内容,再次执行即可,excel中的字段内容尽量缩短,因为虚拟机名称和DNS有字符数限制。

相关推荐

七条简单命令让您玩转Git
七条简单命令让您玩转Git

凭借着出色的协作能力、快速部署效果与代码构建辅助作用,Git已经得到越来越多企业用户的青睐。除了用于开发商业及消费级应用之外,众多科学及政府机构也开始尝试使用这...

2023-10-07 12:14 guanshanw

基本完整的关于Git分支branch的操作
基本完整的关于Git分支branch的操作

Git使用背景项目中要用到dev或者其他分支开发完代码,需要将该分支合并到master的需求操作步骤下面以dev名称为lex为分支名为例来操作一遍客户端操作:...

2023-10-07 12:14 guanshanw

Git 进阶(合并与变基)
Git 进阶(合并与变基)

在Git中整合来自不同分支的修改主要有两种方法:合并(merge)以及变基(rebase)合并(merge)merge流程图merge的原理是找到这两个分...

2023-10-07 12:13 guanshanw

Git学习笔记 003 Git进阶功能 part5 合并(第一部分)

合并(merge)是很常用的操作。尤其是一个庞大的很多人参与开发的企业级应用。一般会设定一个主分支,和多个副分支。在副分支开发完成后,合并到主分支中。始终保持主分支是一个完整的,稳定的最新状态的分支。...

非标题党,三张图帮你理解git merge和git rebase的区别
非标题党,三张图帮你理解git merge和git rebase的区别

初始场景:基于正常的开发分支修改几个小bug,然后在合并到开发分支上。gitmergegitcheckoutfeaturegitmergeho...

2023-10-07 12:13 guanshanw

git 初次使用(01)
git 初次使用(01)

先从github上克隆代码下来:使用vscode克隆代码如下图,填写上github仓库地址:vscode有时候克隆代码速度比较慢,可以用命令行方式克隆gitc...

2023-10-07 12:12 guanshanw

Git 远程操作

4.Git远程操作命令说明gitremote远程版本库操作gitfetch从远程获取版本库gitpull下载远程代码并合并gitpush上传远程代码并合并4.1远程版本库操作gitre...

Git常用命令-总结
Git常用命令-总结

创建git用户$gitconfig--globaluser.name"YourName"$gitconfig--globaluser.em...

2023-10-07 12:12 guanshanw

git中删除从别人clone下来项目的git信息,并修改为自己的分支

如果你从别人的Git存储库中克隆了一个项目,并想要删除与该存储库相关的Git信息,并将其修改为你自己的分支,则可以执行以下步骤:使用gitclone命令克隆存储库:gitclone<u...

git系列-回滚和放弃本地修改

回滚历史提交就是reset的功能。这种情况是已经提交远程仓库,需要回滚到之前的提交。gitreset--hardcommitId//注:强制提交后,当前版本后面的提交版本将会删掉!gi...

GIT使用小技巧大全
GIT使用小技巧大全

在大型软件工程的开发过程中,版本控制是无法绕过去的;目前来说,最火的版本控制软件就是GIT了。早两年SVN比较火,不过被大神linus喷了几次后,就日落西山了,...

2023-10-07 12:11 guanshanw

git相关命令-上
git相关命令-上

这些命令都是看了文档后,个人觉得比较有用的一些,展示给大家。回到远程仓库的状态抛弃本地所有的修改,回到远程仓库的状态。gitfetch--all&...

2023-10-07 12:10 guanshanw

Git命令行接口:掌握Git的必备技能
Git命令行接口:掌握Git的必备技能

Git是一款强大的分布式版本控制工具,它支持命令行界面操作。熟练掌握Git命令行接口,是开发者使用Git的必备技能之一。在这篇文章中,我们将介绍Git命令行接口...

2023-10-07 12:10 guanshanw

Git命令详解
Git命令详解

相信各位小伙伴们应该都对git有一些了解,毕竟作为代码管理的神器,就算不是IT行业的小伙伴肯定也或多或少的听说过一些。今天就来和小伙伴们分享一下自己总结的常用命...

2023-10-07 12:10 guanshanw

工作7年收集到的git命令
工作7年收集到的git命令

概念git中的术语解释:仓库也叫版本库(repository)stage:暂存区,add后会存到暂存区,commit后提交到版本库git安装linux...

2023-10-07 12:10 guanshanw

取消回复欢迎 发表评论: