VMWare PowerCLI Script


批量创建VMWare虚拟机

在桌面操作系统中,可以通过 VMware PowerCLI调用接口,批量创建VMWare虚拟机,给基础服务器环境部署带来便利。

官方文档

下面以Windows系统为例,实现一个批量创建虚拟机的PowerShell脚本

一、安装PowerCli模块

首先需要右键以管理员身份启动Windows PowerShell

启动powershell后,安装PowerCli模块

PS C:\Windows\system32> Install-Module -Name VMware.PowerCLI

二、连接vCenter Server或VCSA

连接vCenter管理服务器,或者直接连接ESXi

Connect-VIServer <vcenter domain or ip address> -User Administrator@vsphere.local 

将弹出Specific Credential对话框,输入管理员用户名和密码

三、创建预配置文件

创建一个配置文件,可以指定一些选项,如虚拟机名称、ip地址、资源池、存储位置等

本例中创建vm.csv文件

第一行:

NamePrefix,Name,ResourcePool,vmHost,vmDatastore,IP,baseVM
  • NamePrefix: 指定名称前缀,如Test-VM-

  • Name: 虚拟机名称,如以业务命名,Nginx01

  • ResourcePool: 部署的资源池,如 web-project

  • vmHost: 部署到哪个主机,可以指定具体某台ESXi名称,前一项指定了ResourcePool,本项可以留空

  • vmDatastore: 部署到哪个存储LUN,也可以指定某个Cluster

  • IP: 要配置的虚拟机ip地址,如果要设置静态ip,可以作为参数传入

  • baseVM: 从哪个虚拟机复制,或从哪个模板部署,如 Template-CentOS7.9

还有很多其他选项可以配置,具体可参考VMWare官方文档

四、Create 脚本

创建脚本 createvm.ps1

$vms = Import-CSV vm.csv
foreach ($vm in $vms){

#	  $Cluster = "" #指定放置到哪个Cluster
	  $resourcePool = Get-ResourcePool $vm.ResourcePool 

	  $vmNamePrefix= $vm.NamePrefix
	  $baseVM = Get-Template $vm.baseVM
	  $vmHost = $vm.vmHost
	  $dataStore = $vm.vmDatastore
	  
	  # 设置虚拟机名称格式,NamePrefix + Name + ipSuffix
	  $tempArr = $vm.IP.Split('.')
	  $ipSuffix = '-' + $tempArr[2] + '.' + $tempArr[3]
	  $vmName = $vmNamePrefix + $vm.Name + $ipSuffix
	  
	  #复制虚拟机
      #New-VM -VM $baseVM -Name $vmName -ResourcePool $resourcePool -VMHost $vmHost -Datastore $dataStore -RunAsync 
	  
	  #从模板创建虚拟机
	  New-VM -Template $baseVM -Name $vmName -ResourcePool $resourcePool -VMHost $vmHost -Datastore $dataStore -RunAsync 
} 

五、执行脚本

切换到脚本所在目录,运行脚本,即可批量创建好虚拟机

PS D:\VMWare\PowerCLi> .\createvm.ps1

六、开机

开机脚本

foreach ($vm in $vms){
   $tempArr = $vm.IP.Split('.')
   $ipPostfix = '-' + $tempArr[2] + '.' + $tempArr[3]
   $vmName1 = $vm.NamePrefix + $vm.Name + $ipPostfix
   $Task = Start-VM -VM $vmName1 -RunAsync
   echo $vmName1 + "Starting..."
} 
# 启动虚拟机 每隔3s检测一次VMWare Tools状态,判断虚拟机是否已经启动完成
do{
  sleep 3
  $vmName1 = Get-VM $vmName1
  $toolsStatus = $vmName1.extensionData.Guest.ToolsStatus
  echo "Wait for System Ready..." $toolsStatus
}while($toolsStatus -ne "toolsOK")
sleep 5

七、修改密码

模板的默认账户/密码

$User = "root" #虚拟机模板默认用户名
$passwd = "password" #虚拟机模板默认用户名

生成随机密码

$Assembly = Add-Type -AssemblyName System.Web
$newPass = [System.Web.Security.Membership]::GeneratePassword(8,2)

修改默认密码

foreach ($vm in $vms){
   $tempArr = $vm.IP.Split('.')
   $ipPostfix = '-' + $tempArr[2] + '.' + $tempArr[3]
   $vmName2 = $vm.NamePrefix + $vm.Name + $ipPostfix
   # 修改密码命令
   $script = "echo root:" + "'" + $newPass + "'" + "|chpasswd;$"

   Get-VM $vmName2 | Invoke-VMScript  -GuestUser $User -GuestPassword $passwd -ScriptText $script -ScriptType Bash 
} 
# 将新密码输出到console端
echo "New Password:" $newPass

八、总结

以上是最基本的PowerCli应用,在实际使用中还会有更复杂的需求,可以写出更加智能化的运维脚本,让工作更轻松,减少加班,哈哈


文章作者: Netcat-fan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Netcat-fan !
  目录