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

posted @ 2023-05-27 19:35  飞翔的小胖猪  阅读(477)  评论(0编辑  收藏  举报