Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI 

Ngokushesha noma kamuva, noma yimuphi umlawuli wesistimu ye-VMware uza ukuze enze imisebenzi evamile. Konke kuqala ngomugqa womyalo, bese kuza i-PowerShell noma i-VMware PowerCLI.

Ake sithi uphumelele i-PowerShell kancane kunokwethula i-ISE nokusebenzisa ama-cmdlets ajwayelekile asuka kumamojula asebenza ngenxa “yohlobo oluthile lomlingo”. Uma uqala ukubala imishini ebonakalayo emakhulwini, uzothola ukuthi imibhalo esiza esikalini esincane ihamba kancane ngokuphawulekayo esikalini esikhulu. 

Kulesi simo, amathuluzi ama-2 azosiza:

  • I-PowerShell Runspaces - indlela evumela ukuthi uhambisane nokuqhutshwa kwezinqubo emicu ehlukene; 
  • Thola-Ukubuka - umsebenzi oyisisekelo we-PowerCLI, i-analogue ye-Get-WMIObject ku-Windows. Le cmdlet ayidonsi izinto ezihambisana naso, kodwa ithola ulwazi ngendlela yento elula enezinhlobo zedatha ezilula. Ezimweni eziningi iphuma ngokushesha.

Okulandelayo, ngizokhuluma kafushane ngethuluzi ngalinye futhi ngibonise izibonelo zokusetshenziswa. Ake sihlaziye imibhalo ethile futhi sibone lapho enye isebenza kangcono kunomunye. Hamba!

Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI

Isigaba sokuqala: I-Runspace

Ngakho-ke, i-Runspace yakhelwe ukucubungula okufanayo kwemisebenzi ngaphandle kwemojula eyinhloko. Impela, ungaqalisa enye inqubo ezodla inkumbulo ethile, iphrosesa, njll. Uma iskripthi sakho sisebenza emizuzwini embalwa futhi sisebenzisa inkumbulo eyigigabhayithi, cishe ngeke udinge i-Runspace. Kodwa ngemibhalo yamashumi ezinkulungwane zezinto iyadingeka.

Ungaqala ukufunda lapha: 
Ukuqala Ukusetshenziswa Kwezikhala Zokugijima ze-PowerShell: Ingxenye 1

Yini enikeza i-Runspace:

  • isivinini ngokunciphisa uhlu lwemiyalo ekhishiwe,
  • ukwenziwa kwemisebenzi efanayo,
  • ukuphepha.

Nasi isibonelo esivela ku-inthanethi lapho i-Runspace isiza:

“Umbango wesitoreji ungenye yamamethrikhi okunzima ukuwalandela ku-vSphere. Ngaphakathi kwe-vCenter, awukwazi ukuvele uhambe ubone ukuthi iyiphi i-VM edla izinsiza eziningi zokugcina. Ngenhlanhla, ungakwazi ukuqoqa le datha ngemizuzu ngenxa ye-PowerShell.
Ngizokwabelana ngeskripthi esizovumela abaphathi besistimu ye-VMware ukuthi baseshe ngokushesha kuyo yonke i-vCenter futhi bathole uhlu lwama-VM anedatha ngokusetshenziswa kwawo okumaphakathi.  
Umbhalo usebenzisa izindawo zokugijima ze-PowerShell ukuze uvumele umsingathi ngamunye we-ESXi ukuthi aqoqe ulwazi lokusetshenziswa kuma-VM akhe ku-Runspace ehlukile futhi abike ngokushesha ukuqedwa. Lokhu kuvumela i-PowerShell ukuthi ivale imisebenzi ngokushesha, kunokuba iphindaphinde ngabasingathi futhi ilinde ngamunye ukuthi aqedele isicelo sakhe.”

Source: Ungabonisa kanjani Umshini Obonakalayo I/O Kudeshibhodi ye-ESXi

Esimeni esingezansi, i-Runspace ayisasebenziseki:

“Ngizama ukubhala umbhalo oqoqa imininingwane eminingi ku-VM bese ubhala imininingwane emisha uma kunesidingo. Inkinga ukuthi maningi impela ama-VM, kanti imizuzwana emi-5-8 isetshenziswa emshinini owodwa.” 

Source: I-Multithreading PowerCLI ene-RunspacePool

Lapha uzodinga i-Get-View, asiqhubekele kuyo. 

Isigaba sesibili: Thola-Ukubuka

Ukuze uqonde ukuthi kungani i-Get-View ilusizo, kufanelekile ukukhumbula ukuthi ama-cmdlets asebenza kanjani ngokujwayelekile. 

Ama-Cmdlets ayadingeka ukuze kutholwe ulwazi kalula ngaphandle kwesidingo sokufunda izincwadi eziyisethenjwa ze-API nokuqamba kabusha isondo elilandelayo. Okwakudala kwathatha imigqa eyikhulu noma emibili yekhodi, i-PowerShell ikuvumela ukuthi ukwenze ngomyalo owodwa. Sikhokhela lokhu lula ngesivinini. Akukho umlingo ngaphakathi kwama-cmdlets ngokwawo: iskripthi esifanayo, kodwa ezingeni eliphansi, elibhalwe yizandla ezinekhono zenkosi evela e-India libalele.

Manje, ukuze uqhathanise ne-Get-View, ake sithathe i-Get-VM cmdlet: ifinyelela emshinini obonakalayo futhi ibuyisela into eyinhlanganisela, okungukuthi, inamathisela ezinye izinto ezihlobene nayo: VMHost, Datastore, njll.  

I-Get-View endaweni yayo ayingezi lutho olungadingekile entweni ebuyisiwe. Ngaphezu kwalokho, kusivumela ukuthi sicacise ngokuqinile ukuthi yiluphi ulwazi esiludingayo, oluzokwenza into ephumayo ibe lula. Ku-Windows Server ngokujwayelekile naku-Hyper-V ikakhulukazi, i-Get-WMIObject cmdlet iyi-analogue eqondile - umbono uyafana ncamashi.

I-Get-View ayihambisani nomsebenzi wenjwayelo ezintweni eziyiphoyinti. Kodwa uma kuziwa ezinkulungwaneni namashumi ezinkulungwane zezinto, ayinalo inani.

Ungafunda okwengeziwe kubhulogi le-VMware: Isingeniso se-Get-View

Manje ngizokukhombisa yonke into ngisebenzisa icala langempela. 

Ukubhala iskripthi ukuze kukhishwe i-VM

Ngolunye usuku uzakwethu wangicela ukuba ngithuthukise iskripthi sakhe. Umsebenzi uyindlela evamile: thola wonke ama-VM anepharamitha ye-cloud.uuid eyimpinda (yebo, lokhu kungenzeka uma uhlanganisa i-VM ku-vCloud Director). 

Isixazululo esisobala esifika engqondweni yilesi:

  1. Thola uhlu lwawo wonke ama-VM.
  2. Hlaziya uhlu ngandlela thile.

Inguqulo yokuqala bekulesi script esilula:

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
}
# Далее РУКАМИ парсим полученный результат

Konke kulula kakhulu futhi kucacile. Ingabhalwa emizuzwini embalwa ngekhefu lekhofi. Khipha ekuhlungeni futhi sekuqedile.

Kodwa ake silinganise isikhathi:

Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI

Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI

Imizuzu emi-2 namasekhondi angama-47 lapho ucubungula cishe ama-VM angu-10k. Ibhonasi ukungabikho kwezihlungi kanye nesidingo sokuhlunga imiphumela mathupha. Ngokusobala, iskripthi sidinga ukuthuthukiswa.

I-Runspaces ingeyokuqala ezokusiza lapho udinga ukuthola kanyekanye amamethrikhi osokhaya ku-vCenter noma udinga ukucubungula amashumi ezinkulungwane zezinto. Ake sibone ukuthi le ndlela iletha ini.

Vula isivinini sokuqala: I-PowerShell Runspaces

Into yokuqala efika engqondweni yalesi skripthi ukwenza iluphu ingalandeli ngokulandelana, kodwa ngemicu efanayo, qoqa yonke idatha entweni eyodwa bese uyihlunga. 

Kodwa kunenkinga: I-PowerCLI ngeke isivumele ukuthi sivule izikhathi eziningi ezizimele ku-vCenter futhi izophonsa iphutha elihlekisayo:

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.

Ukuze uxazulule lokhu, kufanele uqale udlulise ulwazi lweseshini ngaphakathi kokusakaza. Masikhumbule ukuthi i-PowerShell isebenza nezinto ezingadluliswa njengepharamitha kumsebenzi noma ku-ScriptBlock. Masidlulise iseshini ngesimo sento enjalo, sidlule i-$global:DefaultVIServer (Xhuma-VIServer ngokhiye othi -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 $_
           }
       }
   }

Manje ake sisebenzise ukufunda okuningi nge-Runspace Pools.  

I-algorithm imi kanjena:

  1. Sithola uhlu lwawo wonke ama-VM.
  2. Emifudlaneni ehambisanayo sithola ifu.uuid.
  3. Siqoqa idatha kusuka ekusakazweni ibe into eyodwa.
  4. Sihlunga into ngokuyiqoqa ngenani lenkambu ye-CloudUUID: lawo lapho inani lamanani ahlukile likhulu kuno-1 ama-VM esiwafunayo.

Ngenxa yalokho, sithola iskripthi:


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
}

Ubuhle balesi skripthi ukuthi singasetshenziswa kwezinye izimo ezifanayo ngokumane simiselele i-ScriptBlock namapharamitha azodluliselwa ekusakazweni. Yisebenzise!

Sikala isikhathi:

Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI

55 imizuzwana. Kungcono, kodwa kusengashesha. 

Ake siye esivinini sesibili: GetView

Ake sithole ukuthi yini engalungile.
Okokuqala nokubalulekile, i-Get-VM cmdlet ithatha isikhathi eside ukuyenza.
Okwesibili, i-cmdlet ye-Get-AdvancedOptions ithatha isikhathi eside ukuqeda.
Ake sibhekane nesesibili kuqala. 

I-Get-AdvancedOptions ilungele izinto ze-VM ngayinye, kodwa ixakile uma usebenza ngezinto eziningi. Singathola ulwazi olufanayo entweni yomshini uqobo (Get-VM). Isanda kungcwatshwa kahle entweni ye-ExtensionData. Sihlome ngokuhlunga, sisheshisa inqubo yokuthola idatha edingekayo.

Ngokunyakazisa isandla kancane lokhu:


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

Iphenduka ibe yilokhu:


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

Okuphumayo kuyefana ne-Get-AdvancedOptions, kodwa kusebenza izikhathi eziningi ngokushesha. 

Manje ukuze uthole-VM. Ayisheshi ngoba ikhuluma ngezinto eziyinkimbinkimbi. Kuphakama umbuzo ophusile: kungani sidinga ulwazi olwengeziwe kanye ne-PSObject esabekayo kuleli cala, lapho sidinga nje igama le-VM, isimo sayo kanye nenani lemfanelo ekhohlisayo?  

Ngaphezu kwalokho, isithiyo esikuhlobo lwe-Get-AdvancedOptions sisusiwe kuskripthi. Ukusebenzisa i-Runspace Pools manje kubonakala sengathi kuyaqina njengoba singasekho isidingo sokufanisa umsebenzi ongasheshi emicu ye-squat lapho unikeza iseshini. Ithuluzi lihle, kodwa hhayi kuleli cala. 

Ake sibheke okukhiphayo kwe-ExtensionData: akuyona into engaphezu kwe-Get-View. 

Ake sibize isu lasendulo le-PowerShell masters: umugqa owodwa usebenzisa izihlungi, ukuhlunga nokuhlanganisa. Konke okwesabekayo kwangaphambilini kugoqeke kahle emugqeni owodwa futhi kwenziwa ngesikhathi esisodwa:


$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

Sikala isikhathi:

Ungayakha kanjani i-rocket booster yemibhalo ye-PowerCLI

Imizuzwana engu-9 cishe izinto eziyi-10k ezinokuhlunga ngesimo osifunayo. Kuhle!

Esikhundleni isiphetho

Umphumela owamukelekayo uncike ngokuqondile ekukhethweni kwethuluzi. Kuyaye kube nzima ukusho ngokuqinisekile ukuthi yini ngempela okufanele ikhethwe ukuyifinyelela. Ngayinye yezindlela ezisohlwini zokusheshisa izikripthi zinhle ngaphakathi kwemikhawulo yokusebenzisa kwayo. Ngithemba ukuthi lesi sihloko sizokusiza emsebenzini onzima wokuqonda izisekelo ze-automation yenqubo kanye nokwenza kahle kwingqalasizinda yakho.

I-PS: Umbhali ubonga wonke amalungu omphakathi ngosizo nokusekela kwawo ekulungiseleleni isihloko. Ngisho nalabo abanamadladla. Futhi ngisho nalabo abangenayo imilenze, njenge-boa constrictor.

Source: www.habr.com

Engeza amazwana