用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
}
