Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts 

Tsis ntev los sis tom qab, txhua tus neeg khiav dej num VMware tuaj rau automate cov haujlwm niaj hnub. Nws tag nrho pib nrog cov kab hais kom ua, tom qab ntawd los PowerShell lossis VMware PowerCLI.

Cia peb hais tias koj tau paub txog PowerShell me ntsis ntxiv dua li pib ISE thiab siv cov qauv cmdlets los ntawm cov qauv uas ua haujlwm vim "qee yam khawv koob". Thaum koj pib suav cov tshuab virtual hauv ntau pua, koj yuav pom tias cov ntawv sau uas pab tawm ntawm qhov me me khiav qeeb qeeb ntawm qhov loj. 

Hauv qhov xwm txheej no, 2 cov cuab yeej yuav pab tau:

  • PowerShell Runspaces - ib txoj hauv kev uas tso cai rau koj mus rau parallelize qhov kev ua tiav ntawm cov txheej txheem sib cais; 
  • Tau-Saib - PowerCLI kev ua haujlwm yooj yim, ib qho analogue ntawm Get-WMIObject hauv Windows. Qhov cmdlet no tsis rub cov khoom nrog cov chaw, tab sis tau txais cov ntaub ntawv hauv daim ntawv ntawm cov khoom yooj yim nrog cov ntaub ntawv yooj yim. Feem ntau nws tawm sai dua.

Tom ntej no, kuv yuav tham luv luv txog txhua lub cuab yeej thiab qhia cov piv txwv ntawm kev siv. Cia peb txheeb xyuas cov ntawv tshwj xeeb thiab pom thaum twg ib qho ua haujlwm zoo dua li lwm qhov. Mus!

Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts

Thawj theem: Runspace

Yog li, Runspace yog tsim los rau kev ua haujlwm sib luag ntawm cov haujlwm sab nraud ntawm lub ntsiab module. Yog lawm, koj tuaj yeem tso lwm cov txheej txheem uas yuav noj tau qee lub cim xeeb, processor, thiab lwm yam. Yog tias koj tsab ntawv khiav hauv ob peb feeb thiab siv lub cim xeeb gigabyte, feem ntau koj yuav tsis xav tau Runspace. Tab sis rau cov ntawv sau rau kaum tawm txhiab tus khoom nws xav tau.

Koj tuaj yeem pib kawm ntawm no: 
Pib Siv PowerShell Runspaces: Ntu 1

Qhov twg siv Runspace muab:

  • ceev los ntawm kev txwv cov npe ntawm cov lus txib,
  • parallel ua haujlwm ntawm kev ua haujlwm,
  • kev nyab xeeb

Nov yog ib qho piv txwv los ntawm Internet thaum Runspace pab:

β€œKev sib cav sib cav yog ib qho kev ntsuas nyuaj tshaj plaws los taug qab hauv vSphere. Hauv vCenter, koj tsis tuaj yeem mus thiab pom qhov twg VM tau siv ntau qhov chaw cia. Luckily, koj tuaj yeem sau cov ntaub ntawv no hauv feeb ua tsaug rau PowerShell.
Kuv yuav qhia ib tsab ntawv uas yuav tso cai rau VMware cov thawj coj saib xyuas sai thoob plaws vCenter thiab tau txais cov npe ntawm VMs nrog cov ntaub ntawv ntawm lawv qhov nruab nrab noj.  
Tsab ntawv siv PowerShell runspaces tso cai rau txhua tus tswv tsev ESXi los sau cov ntaub ntawv siv los ntawm nws tus kheej VMs hauv ib qho Runspace cais thiab qhia txog kev ua tiav tam sim ntawd. Qhov no tso cai rau PowerShell kaw cov haujlwm tam sim ntawd, tsis yog rov hais dua los ntawm cov tswv thiab tos kom txhua tus ua tiav nws qhov kev thov. "

Tau qhov twg los: Yuav Ua Li Cas Qhia Virtual Machine I/O ntawm ESXi Dashboard

Hauv cov ntaub ntawv hauv qab no, Runspace tsis muaj txiaj ntsig ntxiv lawm:

"Kuv tabtom sim sau ib tsab ntawv uas sau ntau cov ntaub ntawv los ntawm VM thiab sau cov ntaub ntawv tshiab thaum tsim nyog. Qhov teeb meem yog tias muaj ntau VMs, thiab 5-8 vib nas this yog siv rau ib lub tshuab. " 

Tau qhov twg los: Multithreading PowerCLI nrog RunspacePool

Ntawm no koj yuav xav tau Get-View, cia peb txav mus rau nws. 

Qhov thib ob theem: Tau-Saib

Kom nkag siab tias yog vim li cas Get-View yog qhov tseem ceeb, nws tsim nyog nco ntsoov tias cmdlets ua haujlwm li cas. 

Cmdlets xav tau kom yooj yim tau cov ntaub ntawv yam tsis tas yuav kawm API cov phau ntawv siv thiab rov tsim lub log tom ntej. Dab tsi hauv cov hnub qub coj ib puas lossis ob kab ntawm cov lej, PowerShell tso cai rau koj ua nrog ib qho lus txib. Peb them rau qhov yooj yim no nrog ceev. Tsis muaj khawv koob hauv cmdlets lawv tus kheej: tib tsab ntawv, tab sis nyob rau theem qis, sau los ntawm kev txawj txhais tes ntawm tus tswv los ntawm tshav ntuj Is Nrias teb.

Tam sim no, rau kev sib piv nrog Get-View, cia peb coj mus rau Get-VM cmdlet: nws nkag mus rau lub tshuab virtual thiab xa rov qab cov khoom sib xyaw, uas yog, nws txuas lwm yam khoom siv rau nws: VMHost, Datastore, thiab lwm yam.  

Get-View nyob rau hauv nws qhov chaw tsis ntxiv dab tsi tsis tsim nyog rau cov khoom xa rov qab. Ntxiv mus, nws tso cai rau peb nruj me ntsis qhia cov ntaub ntawv peb xav tau, uas yuav ua rau cov khoom tso tawm yooj yim dua. Hauv Windows Server feem ntau thiab hauv Hyper-V tshwj xeeb, Get-WMIObject cmdlet yog ib qho analogue ncaj qha - lub tswv yim zoo ib yam.

Get-View tsis yooj yim rau kev ua haujlwm niaj hnub ntawm cov khoom taw tes. Tab sis thaum nws los txog ntau txhiab thiab kaum txhiab yam khoom, nws tsis muaj nqi.

Koj tuaj yeem nyeem ntxiv ntawm VMware blog: Taw qhia rau Get-View

Tam sim no kuv yuav qhia koj txhua yam uas siv cov ntaub ntawv tiag tiag. 

Sau tsab ntawv kom unload VM

Muaj ib hnub kuv cov npoj yaig hais kom kuv kho nws cov ntawv. Txoj haujlwm yog ib txwm ua: nrhiav txhua VMs nrog qhov sib npaug ntawm huab.uuid parameter (yog, qhov no ua tau thaum cloning VM hauv vCloud Director). 

Qhov kev daws teeb meem pom tseeb uas los rau hauv siab yog:

  1. Tau txais cov npe ntawm txhua tus VMs.
  2. Parse daim ntawv ua cas.

Tus thawj version yog tsab ntawv yooj yim no:

function Get-CloudUUID1 {
   # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список всСх Π’Πœ
   $vms = Get-VM
   $report = @()

   # ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, получая ΠΈΠ· Π½Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 2 свойства: Имя Π’Πœ ΠΈ Cloud UUID.
   # Заносим Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½ΠΎΠ²Ρ‹ΠΉ PS-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с полями VM ΠΈ UUID
   foreach ($vm in $vms)
   {
       $table = "" | select VM,UUID

       $table.VM = $vm.name
       $table.UUID = ($vm | Get-AdvancedSetting -Name cloud.uuid).Value
          
       $report += $table
   }
# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ всС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹
   $report
}
# Π”Π°Π»Π΅Π΅ РУКАМИ парсим ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Txhua yam yog yooj yim heev thiab meej. Nws tuaj yeem sau tau ob peb feeb nrog kev so kas fes. Ntsia rau ntawm qhov pom thiab nws ua tiav.

Tab sis cia peb ntsuas lub sijhawm:

Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts

Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts

2 feeb 47 vib nas this thaum ua yuav luag 10k VMs. Ib qho ntxiv yog qhov tsis muaj cov lim dej thiab qhov xav tau los txheeb xyuas cov txiaj ntsig tau. Obviously, tsab ntawv yuav tsum optimization.

Runspaces yog thawj tus tuaj rau kev cawm thaum koj xav tau ib txhij tau txais cov tswv cuab metrics los ntawm vCenter lossis xav tau txheej txheem kaum tawm txhiab khoom. Cia peb saib seb qhov kev coj ua no coj li cas.

Qhib thawj qhov ceev: PowerShell Runspaces

Thawj qhov uas los rau hauv lub siab rau tsab ntawv no yog ua kom lub voj tsis sib luag, tab sis nyob rau hauv cov kab sib txuas, sau tag nrho cov ntaub ntawv rau hauv ib qho khoom thiab lim nws. 

Tab sis muaj ib qho teeb meem: PowerCLI yuav tsis tso cai rau peb qhib ntau qhov kev sib tham ywj siab rau vCenter thiab yuav cuam tshuam qhov yuam kev lom zem:

You have modified the global:DefaultVIServer and global:DefaultVIServers system variables. This is not allowed. Please reset them to $null and reconnect to the vSphere server.

Txhawm rau daws qhov no, koj yuav tsum xub hla cov ntaub ntawv sib tham hauv cov kwj dej. Cia peb nco ntsoov tias PowerShell ua haujlwm nrog cov khoom uas tuaj yeem dhau los ua qhov ntsuas tsis yog rau ib qho haujlwm lossis rau ScriptBlock. Cia peb dhau qhov kev sib tham hauv daim ntawv ntawm cov khoom zoo li no, hla $ ntiaj teb:DefaultVIServers (Txuas-VIServer nrog tus yuam sij -NotDefault):

$ConnectionString = @()
foreach ($vCenter in $vCenters)
   {
       try {
           $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
       }
       catch {
           if ($er.Message -like "*not part of a linked mode*")
           {
               try {
                   $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
               }
               catch {
                   throw $_
               }
              
           }
           else {
               throw $_
           }
       }
   }

Tam sim no cia peb siv ntau txoj hauv kev los ntawm Runspace Pools.  

Lub algorithm yog raws li nram no:

  1. Peb tau txais cov npe ntawm txhua tus VMs.
  2. Nyob rau hauv parallel kwj peb tau cloud.uuid.
  3. Peb sau cov ntaub ntawv los ntawm kwj mus rau hauv ib yam khoom.
  4. Peb lim cov khoom los ntawm kev sib koom ua ke los ntawm tus nqi ntawm CloudUUID teb: cov uas muaj pes tsawg tus nqi tshwj xeeb ntau dua 1 yog VMs peb tab tom nrhiav.

Yog li ntawd, peb tau txais tsab ntawv:


function Get-VMCloudUUID {
   param (
       [string[]]
       [ValidateNotNullOrEmpty()]
       $vCenters = @(),
       [int]$MaxThreads,
       [System.Management.Automation.PSCredential]
       [System.Management.Automation.Credential()]
       $Credential
   )

   $ConnectionString = @()

   # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с сСссионным ΠΊΠ»ΡŽΡ‡ΠΎΠΌ
   foreach ($vCenter in $vCenters)
   {
       try {
           $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -AllLinked -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
       }
       catch {
           if ($er.Message -like "*not part of a linked mode*")
           {
               try {
                   $ConnectionString += Connect-VIServer -Server $vCenter -Credential $Credential -NotDefault -Force -ErrorAction stop -WarningAction SilentlyContinue -ErrorVariable er
               }
               catch {
                   throw $_
               }
              
           }
           else {
               throw $_
           }
       }
   }

   # ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ список всСх Π’Πœ
   $Global:AllVMs = Get-VM -Server $ConnectionString

   # ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!
   $ISS = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
   $RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxThreads, $ISS, $Host)
   $RunspacePool.ApartmentState = "MTA"
   $RunspacePool.Open()
   $Jobs = @()

# ScriptBlock с магиСй!)))
# ИмСнно ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² ΠΏΠΎΡ‚ΠΎΠΊΠ΅
   $scriptblock = {
       Param (
       $ConnectionString,
       $VM
       )

       $Data = $VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}

       return $Data
   }
# Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΈ

   foreach($VM in $AllVMs)
   {
       $PowershellThread = [PowerShell]::Create()
# ДобавляСм скрипт
       $null = $PowershellThread.AddScript($scriptblock)
# И ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² скрипту
       $null = $PowershellThread.AddArgument($ConnectionString)
       $null = $PowershellThread.AddArgument($VM)
       $PowershellThread.RunspacePool = $RunspacePool
       $Handle = $PowershellThread.BeginInvoke()
       $Job = "" | Select-Object Handle, Thread, object
       $Job.Handle = $Handle
       $Job.Thread = $PowershellThread
       $Job.Object = $VM.ToString()
       $Jobs += $Job
   }

# Π‘Ρ‚Π°Π²ΠΈΠΌ градусник, Ρ‡Ρ‚ΠΎΠ±Ρ‹ наглядно ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΠΉ
# И здСсь ΠΆΠ΅ ΠΏΡ€ΠΈΠ±ΠΈΠ²Π°Π΅ΠΌ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠΈΠ΅ задания
   While (@($Jobs | Where-Object {$_.Handle -ne $Null}).count -gt 0)
   {
       $Remaining = "$($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).object)"

       If ($Remaining.Length -gt 60) {
           $Remaining = $Remaining.Substring(0,60) + "..."
       }

       Write-Progress -Activity "Waiting for Jobs - $($MaxThreads - $($RunspacePool.GetAvailableRunspaces())) of $MaxThreads threads running" -PercentComplete (($Jobs.count - $($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False}).count)) / $Jobs.Count * 100) -Status "$(@($($Jobs | Where-Object {$_.Handle.IsCompleted -eq $False})).count) remaining - $remaining"

       ForEach ($Job in $($Jobs | Where-Object {$_.Handle.IsCompleted -eq $True})){
           $Job.Thread.EndInvoke($Job.Handle)     
           $Job.Thread.Dispose()
           $Job.Thread = $Null
           $Job.Handle = $Null
       }
   }

   $RunspacePool.Close() | Out-Null
   $RunspacePool.Dispose() | Out-Null
}


function Get-CloudUUID2
{
   [CmdletBinding()]
   param(
   [string[]]
   [ValidateNotNullOrEmpty()]
   $vCenters = @(),
   [int]$MaxThreads = 50,
   [System.Management.Automation.PSCredential]
   [System.Management.Automation.Credential()]
   $Credential)

   if(!$Credential)
   {
       $Credential = Get-Credential -Message "Please enter vCenter credentials."
   }

   # Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Get-VMCloudUUID, Π³Π΄Π΅ ΠΌΡ‹ распараллСливаСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ
   $AllCloudVMs = Get-VMCloudUUID -vCenters $vCenters -MaxThreads $MaxThreads -Credential $Credential
   $Result = $AllCloudVMs | Sort-Object Value | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group
   $Result
}

Qhov kev zoo nkauj ntawm tsab ntawv no yog tias nws tuaj yeem siv rau lwm qhov zoo sib xws los ntawm kev hloov pauv ScriptBlock thiab cov kev txwv uas yuav dhau mus rau cov kwj deg. Siv nws!

Peb ntsuas lub sijhawm:

Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts

55 vib nas this. Nws zoo dua, tab sis nws tseem tuaj yeem nrawm dua. 

Cia peb txav mus rau qhov nrawm thib ob: GetView

Cia peb kawm seb qhov twg yog qhov tsis raug.
Ua ntej thiab qhov tseem ceeb, Get-VM cmdlet siv sijhawm ntev los ua.
Thib ob, Get-AdvancedOptions cmdlet siv sijhawm ntev dua los ua kom tiav.
Cia peb nrog tus thib ob ua ntej. 

Get-AdvancedOptions yog qhov yooj yim rau ib tus neeg VM cov khoom, tab sis clumsy heev thaum ua haujlwm nrog ntau yam khoom. Peb tuaj yeem tau txais tib cov ntaub ntawv los ntawm lub tshuab virtual nws tus kheej (Get-VM). Nws tsuas yog faus zoo hauv cov khoom ExtensionData. Armed nrog lim, peb ua kom cov txheej txheem kom tau txais cov ntaub ntawv tsim nyog.

Nrog me ntsis txav ntawm tes qhov no yog:


VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}

Hloov mus rau qhov no:


$VM | Where-Object {($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.ExtensionData.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}}

Cov zis yog tib yam li Get-AdvancedOptions, tab sis nws ua haujlwm ntau zaus. 

Tam sim no mus Get-VM. Nws tsis nrawm vim nws cuam tshuam nrog cov khoom siv. Ib lo lus nug tshwm sim: vim li cas peb thiaj li xav tau cov ntaub ntawv ntxiv thiab PSObject monstrous hauv qhov no, thaum peb tsuas yog xav tau lub npe ntawm VM, nws lub xeev thiab tus nqi ntawm tus cwj pwm tsis zoo?  

Tsis tas li ntawd, qhov teeb meem nyob rau hauv daim ntawv ntawm Get-AdvancedOptions tau raug tshem tawm ntawm tsab ntawv. Siv Runspace Pools tam sim no zoo li overkill vim tsis muaj qhov xav tau los ua kom sib luag ua haujlwm qeeb hla squat threads thaum muab kev sib kho. Cov cuab yeej zoo, tab sis tsis yog rau rooj plaub no. 

Cia peb saib ntawm qhov tso zis ntawm ExtensionData: nws tsis muaj dab tsi ntau dua li Get-View khoom. 

Cia peb hu rau cov txheej txheem qub ntawm PowerShell masters: ib kab siv cov ntxaij lim dej, sorting thiab pab pawg. Tag nrho cov kev ntshai yav dhau los yog elegantly vau rau hauv ib kab thiab tua nyob rau hauv ib zaug:


$AllVMs = Get-View -viewtype VirtualMachine -Property Name,Config.ExtraConfig,summary.runtime.powerstate | Where-Object {($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value -ne $null} | Select-Object @{N="VMName";E={$_.Name}},@{N="CloudUUID";E={($_.Config.ExtraConfig | Where-Object {$_.key -eq "cloud.uuid"}).Value}},@{N="PowerState";E={$_.summary.runtime.powerstate}} | Sort-Object CloudUUID | Group-Object -Property CloudUUID | Where-Object -FilterScript {$_.Count -gt 1} | Select-Object -ExpandProperty Group

Peb ntsuas lub sijhawm:

Yuav tsim lub foob pob hluav taws li cas rau PowerCLI scripts

9 vib nas this rau yuav luag 10k khoom nrog lim los ntawm qhov xav tau. Zoo heev!

Es tsis txhob ib tug xaus

Ib qho txiaj ntsig tau ncaj qha nyob ntawm qhov kev xaiv ntawm cov cuab yeej. Nws yog feem ntau nyuaj hais kom paub tseeb tias qhov twg yuav tsum tau xaiv kom ua tiav. Txhua txoj hauv kev uas tau teev tseg rau kev ceev cov ntawv sau tau zoo nyob rau hauv qhov txwv ntawm nws qhov kev siv tau. Kuv vam tias tsab xov xwm no yuav pab koj hauv txoj haujlwm nyuaj ntawm kev nkag siab lub hauv paus ntawm cov txheej txheem automation thiab optimization hauv koj cov infrastructure.

PS: Tus sau ua tsaug rau txhua tus neeg hauv zej zog rau lawv txoj kev pab thiab kev txhawb nqa hauv kev npaj tsab xov xwm. Txawm cov uas muaj paws. Thiab txawm cov uas tsis muaj ob txhais ceg, zoo li ib tug boa constrictor.

Tau qhov twg los: www.hab.com

Ntxiv ib saib