使用powercli创建模板与克隆虚机

用powercli练练手,需从实际案例出发,本节将使用powercli写两个demo,一个是创建模板,并根据模板创建新的虚机;另一个demo是克隆虚机。


【注意】

  1、创建模板与克隆操作只能在vcenter上使用

  2、powercli是 异步任务,因此需等待一个任务完成后,再去执行下一个任务。(使用 -Runasync 与 -ErrorAction stop 类似于linux中的nohup与&的使用)

一、创建模板并根据模板生成虚机

$task = Stop-VM win -Confirm:$false -ErrorAction Stop -RunAsync        #停止虚机,并放后台
while( $task.state -eq "Running" )                          #使用while循环时刻监控上一任务是否结束
{
    $task = Get-Task -ID $task.id
}


$task1 = New-Template -VM ( Get-VM win2 ) -Name "tp" -Location "nickdc"  -ErrorAction Stop -RunAsync    #根据虚机创建模板
while( $task1.state -eq "Running" )
{
    $task1 = Get-Task -ID $task1.id
}

#根据模板创建虚机
$task2 = New-VM -Name win3 -Template ( Get-Template tp) -VMHost (Get-VMHost 10.32.2.99) -Datastore (Get-Datastore datastore1) -ResourcePool testpool -ErrorAction Stop -RunAsync
while( $task2.state -eq "Running" )
{
    $task2 = Get-Task -ID $task2.id
}

Start-vm win3                  #开启虚机

二、克隆虚机

脚本过程:确认虚机名与虚机所在的磁盘--> 连接vcenter-->关闭虚机-->克隆虚机-->开启虚机

$eap = $ErrorActionPreference
Try{
    $ErrorActionPreference = 'Stop'


    # set vm name & clone vm name
    $sourcevmname = "abcd"
    $clonevmname = "123"   

    # check vm name 
    $tip1 = Read-Host "make sure source vm name is $sourcevmname , if true , input 'y/Y' "
    $tip2 = Read-Host "make sure clone vm name $clonevmname , if true , input 'y/Y'"

    if ( $tip1 -eq "y|Y"  -and $tip2 -eq "y|Y" )
    {
        echo "please make sure vm name "
        exit 1
    }

    #connect vcentr
    $vcenterip = "8.8.8.8"
    $user = "administrator@vsphere.com"
    $passwd = "123456"
    Connect-VIServer $vcenterip -User $user -Password $passwd -SaveCredentials
    sleep 20 

    $starttime = date -Format "HH:mm:ss"
    echo "start time : $starttime"

    #shutdown vm
    echo (get-vm $sourcevmname).PowerState
    if( (get-vm $sourcevmname).PowerState -eq "PoweredOn" )
    {
        stop-vm $sourcevmname -Confirm:$false
        echo "stop vm"
        sleep 30
    }

    #clone vm
    $myDatastore = Get-Datastore -Name datastore1
    $vmhost = Get-VMHost -Name 10.32.2.99
    $pool = Get-ResourcePool -Name testpool
    echo "start clone vm..."
    $task = New-VM -Name $clonevmname -VM $sourcevmname -Datastore $myDatastore -VMHost $vmhost -ResourcePool $pool -RunAsync -ErrorAction Stop
    while( $task.state -eq "Running" )
    {
        $task = Get-Task -ID $task.id
    }
    echo "clone ok!"

    sleep 5

    #start vm
    echo "start vm"
    start-vm $clonevmname
    echo "everything ok!"

    $usetime = (New-TimeSpan $starttime ).TotalMinutes
    $msg = "clone take {0:n0} minutes" -f  $usetime 
    echo $msg
}
Catch{
    Write-Host "error !"
    Exit 1
}
Finally{
    $ErrorActionPreference = $eap  
}

  

 

posted @ 2019-02-27 14:48  一个有故事的devops  阅读(4365)  评论(0编辑  收藏  举报