Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI 

Posakhalitsa, woyang'anira dongosolo lililonse la VMware amabwera kudzasintha ntchito zanthawi zonse. Zonse zimayamba ndi mzere wolamula, kenako PowerShell kapena VMware PowerCLI.

Tinene kuti mwaphunzira PowerShell patsogolo pang'ono kuposa kuyambitsa ISE ndikugwiritsa ntchito ma cmdlets wamba kuchokera kuma module omwe amagwira ntchito chifukwa cha "matsenga amtundu wina". Mukayamba kuwerengera makina pafupifupi mazana, mupeza kuti zolemba zomwe zimathandizira pang'ono zimayenda pang'onopang'ono pamlingo waukulu. 

Munthawi imeneyi, zida za 2 zithandizira:

  • PowerShell Runspaces - njira yomwe imakulolani kuti mufanane ndi kuchitidwa kwa njira mu ulusi wosiyana; 
  • Pezani-Mawonedwe - ntchito yofunikira ya PowerCLI, analogue ya Get-WMIObject mu Windows. cmdlet iyi sikoka zinthu limodzi ndi mabungwe, koma amalandira zambiri mu mawonekedwe a chinthu chosavuta ndi yosavuta mitundu deta. Nthawi zambiri amatuluka mofulumira.

Kenako, ndilankhula mwachidule za chida chilichonse ndikuwonetsa zitsanzo zakugwiritsa ntchito. Tiyeni tifufuze zolemba zenizeni ndikuwona pamene imodzi imagwira ntchito bwino kuposa ina. Pitani!

Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI

Gawo loyamba: Runspace

Chifukwa chake, Runspace idapangidwa kuti igwirizane ndi ntchito kunja kwa gawo lalikulu. Zachidziwikire, mutha kuyambitsanso njira ina yomwe ingadye kukumbukira, purosesa, ndi zina zambiri. Ngati script yanu ikuyenda mumphindi zingapo ndikuwononga kukumbukira kwa gigabyte, mwina simungafunike Runspace. Koma pa zolembedwa za zinthu masauzande ambiri zimafunika.

Mutha kuyamba kuphunzira apa: 
Kuyamba Kugwiritsa Ntchito PowerShell Runspaces: Gawo 1

Kodi kugwiritsa ntchito Runspace kumapereka chiyani:

  • liwiro pochepetsa mndandanda wamalamulo omwe aperekedwa,
  • kugwirira ntchito limodzi,
  • chitetezo.

Nachi chitsanzo chochokera pa intaneti pomwe Runspace imathandizira:

"Mkangano wosungirako ndi imodzi mwazinthu zovuta kwambiri kuzitsata mu vSphere. Mkati mwa vCenter, simungangopita ndikuwona VM yomwe ikugwiritsa ntchito zosungira zambiri. Mwamwayi, mutha kutolera izi mumphindi zochepa chifukwa cha PowerShell.
Ndigawana script yomwe ilola oyang'anira dongosolo la VMware kuti afufuze mwachangu mu vCenter ndikulandila mndandanda wa ma VM okhala ndi data pazomwe amadya.  
Cholembacho chimagwiritsa ntchito PowerShell runspaces kulola aliyense wa ESXi kuti atenge zambiri zamagwiritsidwe kuchokera ku ma VM ake mu Runspace yosiyana ndikunena nthawi yomweyo kumaliza. Izi zimalola PowerShell kutseka ntchito nthawi yomweyo, m'malo mongobwerezabwereza ndikudikirira kuti aliyense amalize zomwe akufuna. ”

Source: Momwe Mungawonetsere Virtual Machine I/O pa Dashboard ya ESXi

Pankhani yomwe ili pansipa, Runspace sikuthandizanso:

"Ndikuyesera kulemba script yomwe imasonkhanitsa zambiri kuchokera ku VM ndikulemba zatsopano pakafunika. Vuto ndiloti pali ma VM ambiri, ndipo masekondi 5-8 amagwiritsidwa ntchito pamakina amodzi. ” 

Source: Multithreading PowerCLI yokhala ndi RunspacePool

Apa mudzafunika Get-View, tiyeni tipitirire kwa izo. 

Gawo lachiwiri: Pezani-Mawonedwe

Kuti mumvetsetse chifukwa chake Get-View ndiyothandiza, ndikofunikira kukumbukira momwe cmdlets imagwirira ntchito nthawi zonse. 

Ma Cmdlets amafunikira kuti mupeze zambiri popanda kufunika kowerenga mabuku ofotokozera a API ndikuyambiranso gudumu lotsatira. Zomwe m'masiku akale zidatenga mizere zana kapena iwiri, PowerShell imakulolani kuchita ndi lamulo limodzi. Timalipira izi mwachangu. Palibe matsenga mkati mwa cmdlets okha: script yemweyo, koma pamlingo wotsika, wolembedwa ndi manja aluso a mbuye wochokera ku India dzuwa.

Tsopano, poyerekeza ndi Get-View, tiyeni titenge Get-VM cmdlet: imafika pamakina enieni ndikubwezera chinthu chophatikizika, ndiko kuti, imaphatikizanso zinthu zina zogwirizana nazo: VMHost, Datastore, ndi zina.  

Pezani-Mawonedwe m'malo mwake sikuwonjezera chilichonse chosafunikira pa chinthu chomwe chabwezedwa. Komanso, zimatithandiza kuti tifotokoze mosamalitsa zomwe tikufuna, zomwe zingapangitse chinthucho kukhala chosavuta. Mu Windows Server ambiri komanso Hyper-V makamaka, Get-WMIObject cmdlet ndi analogi mwachindunji - lingaliro ndi chimodzimodzi.

Get-View ndizovuta pamachitidwe anthawi zonse pazida. Koma zikafika pa zinthu masauzande ndi masauzande azinthu, zilibe mtengo.

Mutha kuwerenga zambiri pa VMware blog: Mau oyamba a Get-View

Tsopano ndikuwonetsani chilichonse pogwiritsa ntchito vuto lenileni. 

Kulemba script kuti mutsitse VM

Tsiku lina mnzanga anandipempha kuti ndikonzenso bwino script yake. Ntchitoyi ndi chizolowezi chodziwika: pezani ma VM onse okhala ndi chobwerezabwereza cloud.uuid parameter (inde, izi ndizotheka popanga VM mu vCloud Director). 

Yankho lodziwikiratu lomwe limabwera m'maganizo ndi:

  1. Pezani mndandanda wa ma VM onse.
  2. Ganizirani mndandanda mwanjira ina.

Baibulo loyambirira linali losavuta:

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

Zonse ndi zophweka komanso zomveka bwino. Ikhoza kulembedwa mu mphindi zingapo ndi kupuma kwa khofi. Yang'anani pa kusefera ndipo zatha.

Koma tiyeni tiyese nthawi:

Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI

Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI

2 mphindi 47 masekondi pokonza pafupifupi 10k VMs. Bonasi ndikusowa kwa zosefera komanso kufunikira kosintha pamanja zotsatira. Mwachiwonekere, script imafuna kukhathamiritsa.

Ma Runspaces ndi oyamba kupulumutsa mukafunika kupeza ma metric olandila kuchokera ku vCenter kapena muyenera kukonza zinthu masauzande ambiri. Tiyeni tiwone chomwe njira iyi imabweretsa.

Yatsani liwiro loyamba: PowerShell Runspaces

Chinthu choyamba chomwe chimabwera m'maganizo pa script iyi ndikuchita chipikacho osati motsatizana, koma mu ulusi wofanana, sonkhanitsani deta yonse mu chinthu chimodzi ndikuchisefa. 

Koma pali vuto: PowerCLI sidzatilola kuti titsegule magawo ambiri odziyimira pawokha ku vCenter ndipo tidzaponya cholakwika choseketsa:

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 muthetse izi, muyenera kupereka kaye zambiri za gawo mkati mwa mtsinjewo. Tikumbukire kuti PowerShell imagwira ntchito ndi zinthu zomwe zitha kuperekedwa ngati parameter ku ntchito kapena ku ScriptBlock. Tiyeni tidutse gawoli ngati chinthu choterocho, kudutsa $global:DefaultVIServers (Connect-VIServer with the -NotDefault key):

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

Tsopano tiyeni tigwiritse ntchito multithreading kudzera mu Runspace Pools.  

Ma algorithm ndi awa:

  1. Timapeza mndandanda wa ma VM onse.
  2. Mu mitsinje yofananira timapeza cloud.uuid.
  3. Timasonkhanitsa deta kuchokera ku mitsinje kukhala chinthu chimodzi.
  4. Timasefa chinthucho pochiyika m'magulu ndi mtengo wa CloudUUID munda: omwe chiwerengero chazinthu zapadera ndi zazikulu kuposa 1 ndi ma VM omwe tikufuna.

Zotsatira zake, timapeza 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
}

Kukongola kwa script iyi ndikuti ingagwiritsidwe ntchito pazinthu zina zofananira ndikungosintha ScriptBlock ndi magawo omwe adzaperekedwa kumtsinje. Gwiritsani ntchito!

Timayesa nthawi:

Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI

Masekondi 55. Ndi bwino, koma akhoza kukhala mofulumira. 

Tiyeni tipite ku liwiro lachiwiri: GetView

Tiyeni tione chomwe chalakwika.
Choyamba, Get-VM cmdlet imatenga nthawi yayitali kuti ichitike.
Chachiwiri, Get-AdvancedOptions cmdlet imatenga nthawi yayitali kuti ithe.
Tiyeni tithane ndi chachiwiri choyamba. 

Pezani-AdvancedOptions ndiyosavuta kuzinthu za VM, koma zimakhala zovutirapo mukamagwira ntchito ndi zinthu zambiri. Titha kudziwanso zomwezo kuchokera ku chinthu cha makina enieni (Get-VM). Zangoyikidwa bwino mu chinthu cha ExtensionData. Pokhala ndi zosefera, timafulumizitsa njira yopezera deta yofunikira.

Ndikuyenda pang'ono kwa dzanja izi:


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

Zimakhala izi:


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

Zotulutsa ndizofanana ndi Pezani-AdvancedOptions, koma zimagwira ntchito nthawi zambiri mwachangu. 

Tsopano kupeza-VM. Sichifulumira chifukwa chimakhudza zinthu zovuta. Funso lomveka limabuka: chifukwa chiyani timafunikira chidziwitso chowonjezera komanso chinthu chovuta kwambiri cha PSO pankhaniyi, pomwe tikungofunika dzina la VM, mkhalidwe wake komanso mtengo wachinyengo?  

Kuphatikiza apo, chopinga chomwe chili mu mawonekedwe a Get-AdvancedOptions chachotsedwa palemba. Kugwiritsa ntchito Maiwe a Runspace tsopano kukuwoneka ngati kuchulukirachulukira chifukwa sipakufunikanso kufananiza ntchito yapang'onopang'ono kudutsa ulusi wa squat popereka gawo. Chidacho ndi chabwino, koma osati pankhaniyi. 

Tiyeni tiwone zotsatira za ExtensionData: sichinthu choposa chinthu cha Get-View. 

Tiyeni tiyitane pa njira yakale ya PowerShell masters: mzere umodzi wogwiritsa ntchito zosefera, kusanja ndi magulu. Zowopsa zonse zam'mbuyomu zidagwa mumzere umodzi ndikuchitidwa gawo limodzi:


$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

Timayesa nthawi:

Momwe mungapangire chowonjezera cha roketi cha zolemba za PowerCLI

Masekondi a 9 pafupifupi zinthu 10k zosefa ndi momwe mukufunira. Zabwino!

M'malo mapeto

Chotsatira chovomerezeka mwachindunji chimadalira kusankha kwa chida. Nthawi zambiri zimakhala zovuta kunena motsimikiza zomwe ziyenera kusankhidwa kuti zitheke. Iliyonse mwa njira zomwe zalembedwa zofulumizitsa zolemba ndi zabwino mkati mwa malire ake. Ndikukhulupirira kuti nkhaniyi ikuthandizani pa ntchito yovuta yomvetsetsa zoyambira zamakina opangira makina komanso kukhathamiritsa mumapangidwe anu.

PS: Wolembayo akuthokoza anthu onse ammudzi chifukwa cha thandizo lawo komanso thandizo lawo pokonzekera nkhaniyi. Ngakhale ndi manja. Ndipo ngakhale omwe alibe miyendo, ngati boa constrictor.

Source: www.habr.com

Kuwonjezera ndemanga