Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa 

Nenguva isipi, chero VMware system maneja anouya kuzoita otomatiki mabasa. Izvo zvese zvinotanga nemutsetse wekuraira, wozouya PowerShell kana VMware PowerCLI.

Ngatiti wagona PowerShell zvishoma kumberi pane kutanga ISE uye kushandisa yakajairwa cmdlets kubva kumamodule anoshanda nekuda kwe "imwe mhando yemashiripiti". Paunotanga kuverenga chaiwo muchina mumazana, uchaona kuti zvinyorwa zvinobatsira padikidiki zvinomhanya zvinooneka pachiyero chikuru. 

Mumamiriro ezvinhu aya, 2 maturusi achabatsira:

  • PowerShell Runspaces - nzira inokubvumira kuti uenzanise maitiro ekuita mumatambo akasiyana; 
  • Get-View -yakakosha PowerCLI basa, analogue yeGet-WMIObject muWindows. Iyi cmdlet haidhonze zvinhu zvinoperekedza, asi inogamuchira ruzivo muchimiro chechinhu chakareruka chine mhando dzedata dziri nyore. Muzviitiko zvakawanda inobuda nokukurumidza.

Tevere, ini ndichataura muchidimbu nezve chishandiso chimwe nechimwe uye kuratidza mienzaniso yekushandisa. Ngationgororei zvinyorwa uye tione kana imwe inoshanda zviri nani pane imwe. Enda!

Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa

Danho rekutanga: Runspace

Saka, Runspace yakagadzirirwa kuenderana kugadzirisa kwemabasa kunze kweiyo hombe module. Ehe, unogona kuvhura imwe nzira inodya imwe ndangariro, processor, nezvimwe. Kana script yako ikamhanya mumaminitsi mashoma uye ichipedza gigabyte yendangariro, kazhinji haungade Runspace. Asi kune zvinyorwa zvemakumi ezviuru zvezvinhu zvinodiwa.

Unogona kutanga kudzidza pano: 
Kutanga Kushandisa PowerShell Runspaces: Chikamu 1

Chii chinopa kushandisa Runspace:

  • kumhanya nekudzikamisa rondedzero yemirairo yakaitwa,
  • parallel execution yemabasa,
  • kuchengeteka.

Heino muenzaniso kubva paInternet apo Runspace inobatsira:

"Kupokana kwekuchengetedza ndeimwe yemametric akaomesesa kutevedzera muvSphere. Mukati mevCenter, haugone kungoenda unoona kuti ndeipi VM iri kushandisa zvimwe zviwanikwa zvekuchengetedza. Neraki, unogona kuunganidza iyi data mumaminitsi nekuda kwePowerShell.
Ini ndichagovera script inobvumira VMware system administrator kuti ikurumidze kutsvaga mukati mevCenter uye kugamuchira runyoro rweVM nedata paavhareji yavo yekushandisa.  
Iyo script inoshandisa PowerShell runspaces kubvumira yega yega ESXi mugadziri kuunganidza ruzivo rwekushandisa kubva kune yayo maVM mune yakaparadzana Runspace uye nekukasira kushuma kupera. Izvi zvinobvumira PowerShell kuvhara mabasa nekukasira, pane kudzokorodza kuburikidza nevanotambira uye kumirira kuti imwe neimwe ipedze chikumbiro chayo.

Source: Nzira yekuratidza Virtual Machine I / O pane ESXi Dashboard

Muchiitiko chiri pazasi, Runspace haichabatsiri:

"Ndiri kuyedza kunyora script inounganidza data rakawanda kubva kuVM uye kunyora data nyowani pazvinenge zvichidikanwa. Dambudziko nderekuti kune akawanda maVM, uye masekonzi mashanu-5 anoshandiswa pamushini mumwe chete. " 

Source: Multithreading PowerCLI ine RunspacePool

Pano iwe uchada Get-View, ngatienderere mberi kwairi. 

Danho rechipiri: Get-View

Kuti unzwisise kuti sei Get-View ichibatsira, zvakakosha kuyeuka kuti cmdlets inoshanda sei kazhinji. 

Cmdlets inodiwa kuti uwane ruzivo zviri nyore pasina chikonzero chekudzidza mabhuku ereferenzi eAPI uye kudzoreredza vhiri rinotevera. Chii mumazuva ekare chakatora zana kana maviri mitsara yekodhi, PowerShell inokubvumira kuti uite nemurairo mumwe. Isu tinobhadhara izvi zviri nyore nekukurumidza. Iko hakuna mashiripiti mukati me cmdlets ivo pachavo: script yakafanana, asi pamwero wakaderera, yakanyorwa nemaoko ane hunyanzvi ehunyanzvi kubva kuIndia yezuva.

Zvino, kuenzanisa neGet-View, ngatitore Get-VM cmdlet: inowana iyo chaiyo muchina uye inodzosera chinhu chakaumbwa, ndiko kuti, inonamatira zvimwe zvinhu zvine hukama kwairi: VMHost, Datastore, nezvimwe.  

Get-View munzvimbo yayo haiwedzere chero chinhu chisingadikanwi kune chakadzoserwa chinhu. Uyezve, inotibvumira kunyatsotsanangura kuti ndeupi ruzivo rwatinoda, izvo zvichaita kuti chinhu chinobuda chive nyore. MuWindows Server mune zvese uye muHyper-V kunyanya, iyo Get-WMIObject cmdlet ianalogue yakananga - iyo pfungwa yakangofanana.

Get-View haigoneki kune zvechinyakare mashandiro pane point zvinhu. Asi kana zvasvika kune zviuru nemakumi ezviuru zvezvinhu, hazvina mutengo.

Unogona kuverenga zvakawanda paVMware blog: Nhanganyaya yeGet-View

Zvino ini ndichakuratidza zvese uchishandisa kesi chaiyo. 

Kunyora script kuburitsa VM

Rimwe zuva wandaishanda naye akandikumbira kuti ndigadzirise script yake. Basa racho inzira yakajairika: tsvaga maVM ese ane duplicate cloud.uuid parameter (hongu, izvi zvinogoneka kana cloning VM muvCloud Director). 

Mhinduro iri pachena inouya mupfungwa ndeiyi:

  1. Tora runyoro rwese maVM.
  2. Rondedzera rondedzero neimwe nzira.

Yekutanga vhezheni yaive iri nyore script:

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
}
# Π”Π°Π»Π΅Π΅ РУКАМИ парсим ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Zvese zviri nyore uye zvakajeka. Inogona kunyorwa mumaminitsi mashoma nekuzorora kwekofi. Nyora pane kusefa uye zvaitwa.

Asi ngatiyere nguva:

Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa

Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa

2 maminetsi 47 masekondi paunenge uchigadzira dzinenge 10k VMs. Bhonasi kusavapo kwemasefa uye kuda kugadzirisa nemaoko zvabuda. Zviripachena, iyo script inoda optimization.

Runspaces ndidzo dzekutanga kuuya kuzonunura kana iwe uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge uchinge riine metrics kubva kuvCenter kana uchida kugadzirisa makumi ezviuru zvezvinhu. Ngationei kuti nzira iyi inounza chii.

Batidza kumhanya kwekutanga: PowerShell Runspaces

Chinhu chekutanga chinouya mumusoro cheichi chinyorwa ndechekuita loop kwete sequentially, asi mune dzakafanana tambo, unganidza data rese muchinhu chimwe uye worisefa. 

Asi pane dambudziko: PowerCLI haizotibvumire kuvhura akawanda akazvimiririra masesheni kuvCenter uye inokanda chikanganiso chinosekesa:

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.

Kuti ugadzirise izvi, unofanirwa kutanga wapfuura ruzivo rwesesheni mukati merukova. Ngatiyeukei kuti PowerShell inoshanda nezvinhu zvinogona kupfuudzwa separameter kungave kune basa kana kuScriptBlock. Ngatipfuurei chikamu muchimiro chechinhu chakadaro, tichipfuura $global:DefaultVIServers (Batanidza-VIServer ne -NotDefault kiyi):

$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 $_
           }
       }
   }

Zvino ngatishandise multithreading kuburikidza neRunspace Pools.  

Iyo algorithm iri seinotevera:

  1. Isu tinowana runyorwa rweese maVM.
  2. Muhova dzakafanana tinowana gore.uuid.
  3. Isu tinounganidza data kubva kuhova kuita chinhu chimwe.
  4. Isu tinosefa chinhu nekuchiisa mumapoka nekukosha kweiyo CloudUUID ndima: idzo uko huwandu hwehutsika hwakasiyana hwakakura kupfuura 1 ndiwo maVM atiri kutsvaga.

Nekuda kweizvozvo, tinowana iyo script:


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
}

Runako rwechinyorwa ichi ndechekuti inogona kushandiswa mune dzimwe nyaya dzakafanana nekungotsiva iyo ScriptBlock uye maparamita anozopfuudzwa kune kurukova. Zvishandise!

Tinoyera nguva:

Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa

Masekonzi 55. Zviri nani, asi zvinogona kukurumidza. 

Ngatifambei kune yechipiri kumhanya: GetView

Ngationei kuti chii chakaipa.
Kutanga uye zvakanyanya, iyo Get-VM cmdlet inotora nguva yakareba kuti iite.
Chechipiri, iyo Get-AdvancedOptions cmdlet inotora zvakatowanda kuti ipedze.
Ngatitangei kubata neyechipiri. 

Get-AdvancedOptions yakanakira munhu ega zvinhu zveVM, asi zvakanyanya kunetsa kana uchishanda nezvinhu zvakawanda. Isu tinogona kuwana ruzivo rwakafanana kubva kune chaiyo muchina chinhu pachayo (Tora-VM). Ichangovigwa zvakanaka muExtensionData chinhu. Kushongedzerwa nekusefa, tinomhanyisa maitiro ekuwana iyo data inodiwa.

Nekufamba zvishoma kweruoko izvi ndizvo:


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

Inoshanduka kuita izvi:


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

Iyo inobuda yakafanana neGet-AdvancedOptions, asi inoshanda kakawanda nekukurumidza. 

Iye zvino kuwana-VM. Haisi kukurumidza nekuti inobata nezvinhu zvakaoma kunzwisisa. Mubvunzo une musoro unomuka: nei tichida rumwe ruzivo uye inotyisa PSObject mune iyi kesi, isu tichingoda zita reVM, mamiriro ayo uye kukosha kwehunhu hunonyengera?  

Pamusoro pezvo, chipingamupinyi chiri muchimiro cheGet-AdvancedOptions chakabviswa pane script. Kushandisa Runspace Pools iko zvino kunoratidzika kunge kwakawandisa sezvo pasisina chikonzero chekufananidza basa rinononoka pane squat tambo paunenge uchipa chikamu. Chishandiso chacho chakanaka, asi kwete chechiitiko ichi. 

Ngatitarisei kuburitswa kweExtensionData: hachisi chimwe chinhu kunze kweGet-View chinhu. 

Ngatishevedzei pamaitiro echinyakare ePowerShell masters: mutsara mumwe uchishandisa mafirita, kuronga uye kuisa mapoka. Zvese zvinotyisa zvakapfuura zvakapunzika mumutsara mumwe uye zvinoitwa muchikamu chimwe chete:


$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

Tinoyera nguva:

Maitiro ekugadzira rocket booster yePowerCLI zvinyorwa

9 seconds kune zvingangoita 10k zvinhu nekusefa nemamiriro aunoda. Hukuru!

Pane mhedziso

Mhedzisiro inogamuchirwa zvakananga zvinoenderana nesarudzo yechishandiso. Zvinowanzonetsa kutaura chokwadi kuti ndezvipi chaizvo zvinofanira kusarudzwa kuti zvibudirire. Imwe neimwe yedzakanyorwa nzira dzekumhanyisa zvinyorwa zvakanaka mukati memiganhu yekushanda kwayo. Ndinovimba kuti chinyorwa ichi chichakubatsira iwe mune rakaoma basa rekunzwisisa izvo zvekutanga zve process automation uye optimization mune yako zvivakwa.

PS: Munyori anotenda nhengo dzese dzenharaunda nerubatsiro nerutsigiro rwavo mukugadzirira chinyorwa. Nyangwe vane makumbo. Uye kunyange avo vasina makumbo, kufanana neboa constrictor.

Source: www.habr.com

Voeg