PowerShell在VC上批量创建虚拟机-for-Linux

发布时间 2023-05-27 19:44:02作者: 飞翔的小胖猪

本文使用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='administrator@vsphere.local'
$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