PowerShell在VC上批量创建虚拟机-for-Linux
本文使用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及以上的操作系统,可以对使用network和NetworkManager管理网络的虚拟机进行IP地址配置。
在使用非NetworkManager配置IP地址时系统必须关闭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:虚拟机名称
脚本及配置文件
脚本文件
该脚本配置IP地址有两种方式,第一种修改网口配置文件,第二种使用NetworkManager工具进行配置,具体使用那一种,读者可根据自身选择适当的修改函数 exec_virtual_command 中的内容。
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_v4 Hostname NetworkMask OsType Disk_01 Disk_02 NetworkVLAN NetGATEWAY_v4 Ipaddr_v6 NetGATEWAY_v6 #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 A409:100:5A10:200:300:0000:0000:0002 A409:100:5A10:200:300:0000:0000:0001 #define variable(定义全局变量:vcenter地址、vcenter用户名、vcenter密码、待操作虚拟机配置文件路径) $vcenter_url='172.168.30.100' $vcenter_user='administrator@vsphere.local' $vcenter_password='TES_VCENTER_passw0rd' $file_name='.\vmware_info.csv' $virtual_os_password='TEST2*@_pe_*L26' #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 2 } } #执行命令 #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" #network模式下修改IP地址。 #设置命令通过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" #NetworkManager模式下修改IP地址。 #ipv4 $command_text_v4="nmcli conn modify ens192 ipv4.method manual connection.autoconnect yes ipv4.addresses "+ '"'+$vm.Ipaddr_v4+'/24"'+" ipv4.gateway "+'"'+$vm.NetGATEWAY_v4+'"'+";nmcli conn down ens192;nmcli conn up ens192" #ipv6 $command_text_v6="nmcli conn modify ens192 ipv6.method manual connection.autoconnect yes ipv6.addresses "+ '"'+$vm.Ipaddr_v6+'/116"'+" ipv6.gateway "+'"'+$vm.NetGATEWAY_v6+'"'+";nmcli conn down ens192;nmcli conn up ens192" #echo "$command_text" ,引用变量不能用引号 # echo $command_text ##执行命令v4 Get-VM $vm.Vmname | Invoke-VMScript -ScriptText $command_text_v4 -GuestUser 'root' -GuestPassword $virtual_os_password if ( $?) { echo "Command exec Success. edit ipv4 addresss!!!!! ok ok ok ok ok !!!!" } ##执行命令,如果不要IPv6地址设置时注释掉就好了。 Get-VM $vm.Vmname | Invoke-VMScript -ScriptText $command_text_v6 -GuestUser 'root' -GuestPassword $virtual_os_password if ( $?) { echo "Command exec Success. edit ipv6 addresss!!!!! ok ok ok ok ok !!!!" } } } #调用函数 create_vm_from_temp start_vm exec_virtual_command
配置文件
请按照途中所示内容进行配置文件修改,需要注意的时第一行为列头部分,不可修改。第一行修改过后会导致脚本程序识别不到对应的参数值。
图 2