原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。 邮箱:[email protected]
本文使用Powershell调用VMware-PowerCLI实现批量创建虚拟机的功能。
环境说明
软件名 | 版本 | 说明 |
Windows | Windows 10专业版 21H2 | 操作系统 |
Ubuntu | Ubuntu 22.04.1 LTS | 操作系统 |
PowerShell(Windows) | PowerShell 5.1.19041 | Powershell |
PowerShell(Ubuntu) | PowerShell 7.2.6 | Powershell |
VMware-PowerCLI | VMware-PowerCLI-12.6.0 | Powershell-sdk |
使用说明
目前只适用于Centos7及以上的操作系统,同时操作系统必须关闭NetworkManager,同时网络配置基础配置在。
图 1参数说明
使用到的类名
- New-vm:新建虚拟机
- Set-vm:设置虚拟机
- Get-vm:获取虚拟机信息
- Get-NetworkAdapter:获取虚拟机网络适配器信息
- set-NetworkAdapter:设置虚拟机网络适配器信息
- New-HardDisk:新建虚拟机磁盘
- Start-VM:启动虚拟机
模块参数说明
New-vm模块字段:
- -Name:新虚拟机名
- -Template:模板虚拟机名
- -VMHost:宿主机管理地址
- -Datastore:lun名
- -StorageFormat:磁盘格式一般使用Thin模式
- -Location:虚拟机文件夹
Set-vm模块字段:
- -VM:虚拟机名
- -Confirm:是否进行二次确认配置
- -MemoryGB:设置内存值
- -NumCpu:设置CPU
New-HardDisk模块字段:
- -VM:虚拟机名称
- -CapacityGB:置备的存储容量
- -Persistence:
- -DiskType:磁盘类型
- -StorageFormat:存储格式
- -Confirm:是否进行二次确认配置
Start-VM模块字段:
- -VM:虚拟机名称
脚本及配置文件
脚本文件
Add-PSSnapin VMware.VimAutomation.Core #Script explain:virtual machine Temp must installed vm-tools #Table format of virtual machine to be created(CSV字段参考内容,不在程序中实际运行,不要取消掉从该行开始的3行前的#号) #Vmname Template PhysicalHost Datastore Vmcpu Vmmem Vmdir Ipaddr Hostname NetworkMask OsType Disk_01 Disk_02 NetworkVLAN NetGATEWAY #Test_power_shell_20221008_lvan Centos_7.9_lvm_TM 192.168.100.151 TEST-EMC-DS01 16 32 XY_Admin_Main_Used 192.168.100.222 Test_power_shell_20221008_lvan 255.255.0.0 Centos7 0 20 TRUST_VLAN2102 192.168.100.1 #define variable(定义全局变量:vcenter地址、vcenter用户名、vcenter密码、待操作虚拟机配置文件路径) $vcenter_url='172.16.16.223' $vcenter_user='[email protected]' $vcenter_password='VMware_Test@2022' $file_name='E:\Create_Vm\yh_test_create_vm\test2_lvan_v5.csv' #Connect Vcenter(连接Vceneter 如果连接失败,退出程序并反馈退出码为 1) Connect-VIServer $vcenter_url -user $vcenter_user -password $vcenter_password if ( $? ){ echo "Connect Vcenter Success." }else{ echo "Connect Vcenter faile,Please check whether the Vcenter ip or user password is correct.exit code 1" exit 2 } #define create virtual machine function(虚拟机基于模板创建函数) function create_vm_from_temp(){ #Import CSV Info(导入CSV文件,如果导入文件失败,退出程序并反馈退出码为 2) Try{ $vms = Import-CSV $file_name } Catch{ echo "Error: Read file error,Please Check whether the xx file exists.Program exit code 2" exit 1 } foreach ($vm in $vms){ ##从这里开始就是创建虚拟机的部分 ##判断当前虚拟机是否存在如果虚拟机存在程序退出,反馈退出码 3 if ( Get-VM $vm.Vmname ) { Write-Host --ForegroundColor Blue "主机名已经存在: $vm.Vmname" echo "Virtual machine name Already exists,Please edit Virtual Machine $vm.Vmname." exit 3 } #该模板需要安装tools,同时对应的操作系统选择正确。 #通过模板创建一个虚拟机 New-vm -vmhost $vm.PhysicalHost -Name $vm.Vmname -Template $vm.Template -Datastore $vm.Datastore -Location $vm.Vmdir -StorageFormat "Thin" #设置虚拟机内存、网卡VLAN $vmnname = Get-VM $vm.Vmname Set-VM -VM $vmnname -Confirm:$false -MemoryGB $vm.Vmmem -NumCpu $vm.Vmcpu Get-NetworkAdapter $vmnname | set-NetworkAdapter -NetworkName $vm.NetworkVLAN -StartConnected:$true -Confirm:$false ##设置磁盘 ##从这里开始就是结束创建虚拟机的部分 ##添加第一块磁盘 if ( $vm.Disk_01 -eq "" -or $vm.Disk_01 -eq 0){ echo "not add disk" }else{ New-HardDisk -VM $vmnname -CapacityGB $vm.Disk_01 -Persistence persistent -DiskType Flat -StorageFormat Thin -Confirm:$false } ##添加第二块磁盘 if ( $vm.Disk_02 -eq "" -or $vm.Disk_02 -eq 0){ echo "not add disk" }else{ New-HardDisk -VM $vmnname -CapacityGB $vm.Disk_02 -Persistence persistent -DiskType Flat -StorageFormat Thin -Confirm:$false } } } #define start virtual machine power function(虚拟机开机函数) function start_vm(){ #Import CSV Info(导入CSV文件,如果导入文件失败,退出程序并反馈退出码为 6) Try{ $vms = Import-CSV $file_name } Catch{ echo "Error: Read file error,Please Check whether the xx file exists.Program exit code 6" exit 1 } foreach ($vm in $vms){ Get-VM $vm.Vmname | Start-VM #针对只有一台或两台机器的时候,要把秒数调整为15 Start-Sleep -s 3 } } #执行命令 #exec virtual machine command(执行操作系统配置IP地址命令) function exec_virtual_command(){ #Import CSV Info(导入CSV文件,如果导入文件失败,退出程序并反馈退出码为 4) Try{ $vms = Import-CSV $file_name } Catch{ echo "Error: Read file error,Please Check whether the xx file exists.Program exit code 4" exit 1 } foreach ($vm in $vms){ ##这一步开始就是设置操作系统IP地址和mask的部分 ##判断当前虚拟机是否存在如果虚拟机不存在,反馈退出码 5 if ( Get-VM $vm.Vmname ) { Write-Host --ForegroundColor Blue "主机名存在: $vm.Vmname" }else{ echo "Virtual machine name Not exists,Please edit Virtual Machine $vm.Vmname." exit 5 } #设置命令通过重定向方式修改,这种方式有bug #$command_text="echo IPADDR="+$vm.Ipaddr+" >> /etc/sysconfig/network-scripts/ifcfg-ens192; echo NETMASK="+$vm.NetworkMask+" >> /etc/sysconfig/network-scripts/ifcfg-ens192; echo GATEWAY="+$vm.NetGATEWAY+" >> /etc/sysconfig/network-scripts/ifcfg-ens192; systemctl restart network" #设置命令通过sed替换方式修改,保证IPADDR、NETMASK、GATEWAY字段都有 $command_text="sed -i " + "-e 's/IPADDR.*/"+"IPADDR="+$vm.Ipaddr+"/g' "+" -e 's/NETMASK.*/"+"NETMASK="+$vm.NetworkMask+"/g' "+" -e 's/GATEWAY.*/"+"GATEWAY="+$vm.NetGATEWAY+"/g' "+"/etc/sysconfig/network-scripts/ifcfg-ens192"+";systemctl restart network" #echo "$command_text" ,引用变量不能用引号 echo $command_text ##执行命令 Get-VM $vm.Vmname | Invoke-VMScript -ScriptText $command_text -GuestUser 'root' -GuestPassword 'Huawei_12345#' if ( $?) { echo "Command exec Success." } } } create_vm_from_temp #start_vm #exec_virtual_command
配置文件
图 2
标签:VC,虚拟机,VM,echo,Linux,vm,CSV,Vmname From: https://www.cnblogs.com/Pigs-Will-Fly/p/17437214.html