Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI 

Na ho ela na ho haingana, ny mpitantana ny rafitra VMware rehetra dia tonga amin'ny fanaovana automatique ny asa mahazatra. Izany rehetra izany dia manomboka amin'ny baiko baiko, avy eo dia tonga ny PowerShell na VMware PowerCLI.

Andeha hatao hoe efa nahafehy ny PowerShell lavitra kokoa noho ny fampandehanana ny ISE ianao ary mampiasa cmdlet mahazatra avy amin'ny maody izay miasa amin'ny alalan'ny "karazana majika." Rehefa manomboka manisa milina virtoaly an-jatony ianao dia ho hitanao fa miadana kokoa ny script nanampy tamin'ny ambaratonga kely. 

Amin'ity tranga ity, fitaovana 2 no hanampy:

  • PowerShell Runspaces - fomba iray ahafahanao mampifanaraka ny fanatanterahana ny dingana amin'ny kofehy samihafa; 
  • get-view - ny fiasa fototra amin'ny PowerCLI, analogue amin'ny Get-WMIObject amin'ny Windows. Ity cmdlet ity dia tsy misintona zavatra mifandraika amin'izany, fa mandray fampahalalana ho toy ny zavatra tsotra misy karazana angona tsotra. Amin'ny tranga maro dia mivoaka haingana kokoa.

Manaraka, hiresaka fohy momba ny fitaovana tsirairay aho ary hampiseho ohatra amin'ny fampiasana. Andeha hojerentsika ny script manokana ary hojerentsika hoe rahoviana no miasa tsara kokoa ny iray, raha ny faharoa. Mandehana!

Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI

Dingana voalohany: Runspace

Noho izany, ny Runspace dia natao ho an'ny fanodinana mirazotra amin'ny asa ivelan'ny maody lehibe. Mazava ho azy fa afaka manomboka dingana hafa ianao izay handany fahatsiarovana, processeur, sns. Raha mandeha ao anatin'ny minitra vitsy ny scripto ary mandany fahatsiarovana gigabytes, dia azo inoana fa tsy mila Runspace ianao. Fa ho an'ny script ho an'ny zavatra an'aliny dia ilaina izany.

Afaka manomboka mianatra avy eto ianao: 
Fanombohana ny fampiasana ny PowerShell Runspaces: Fizarana 1

Inona no manome ny fampiasana Runspace:

  • hafainganam-pandeha amin'ny famerana ny lisitry ny baiko azo tanterahina,
  • fanatanterahana ny asa parallΓ¨le,
  • fiarovana.

Ity misy ohatra iray avy amin'ny Internet izay manampy an'i Runspace:

"Ny fifandirana fitahirizana dia iray amin'ireo metrika sarotra indrindra harahina ao amin'ny vSphere. Ao anatin'ny vCenter, tsy afaka mandeha fotsiny ianao hijery hoe iza amin'ireo VM mandany loharano fitahirizana bebe kokoa. Soa ihany fa afaka manangona an'io data io ianao ao anatin'ny minitra miaraka amin'ny PowerShell.
Hizara script aho izay ahafahan'ny mpitantana ny rafitra VMware hikaroka haingana ny vCenter manontolo ary hahazo lisitry ny VM miaraka amin'ny angona momba ny fanjifana antonony.  
Ny script dia mampiasa ny PowerShell runspaces ka ny mpampiantrano ESXi tsirairay dia manangona vaovao momba ny fanjifana ny VM ao amin'ny Runspace manokana ary mitatitra avy hatrany ny fahavitan'izany. Izany dia ahafahan'ny PowerShell manidy asa avy hatrany, fa tsy mandeha amin'ny alΓ lan'ny mpampiantrano ary miandry ny tsirairay hamita ny fangatahany.

Source: Ahoana ny fampisehoana I/O milina virtoaly amin'ny Dashboard ESXi

Amin'ity tranga etsy ambany ity, tsy miasa ny Runspace:

β€œMiezaka manoratra script aho izay manangona angona betsaka avy amin'ny VM ary manoratra angona vaovao raha ilaina. Ny olana dia be dia be ny VM, ary mila 5-8 segondra ny milina iray. ” 

Source: Multithreading PowerCLI miaraka amin'ny RunspacePool

Ilaina eto ny Get-View, andao hiroso amin'izany. 

Dingana faharoa: Get-View

Mba hahatakarana ny fomba mahasoa ny Get-View dia ilaina ny mitadidy ny fomba fiasan'ny cmdlet amin'ny ankapobeny. 

Ilaina ny Cmdlet mba hahazoana vaovao tsy mila mianatra ny references API ary mamorona indray ny kodiarana manaraka. Inona no nosoratana tamin'ny andalana zato na roa tamin'ny andro taloha, PowerShell dia mamela anao hanao izany amin'ny baiko iray. Mandoa vola amin'ny hafainganam-pandeha izahay. Tsy misy ody ao anatin'ny cmdlet mihitsy: soratra iray ihany, fa amin'ny ambaratonga ambany, nosoratan'ny tanana mahay avy amin'ny tompo avy any India masoandro.

Ankehitriny, raha ampitahaina amin'ny Get-View, andeha horaisina ny Get-VM cmdlet: miditra amin'ny milina virtoaly izy ary mamerina zavatra mitambatra, izany hoe mametaka zavatra hafa mifandraika aminy: VMHost, Datastore, sns.  

Ny Get-View eo amin'ny toerany dia tsy manisy zavatra fanampiny amin'ilay zavatra naverina. Ankoatra izany, mamela anao hardcode izay fampahalalana ilaintsika, izay hanamora ny famoahana zavatra iray. Ao amin'ny Windows Server amin'ny ankapobeny ary amin'ny Hyper-V manokana, ny Get-WMIObject cmdlet dia analogue mivantana - ny hevitra dia mitovy tanteraka.

Ny Get-View dia tsy mety amin'ny asa mahazatra amin'ny zavatra point. Fa raha zavatra an'aliny sy an'aliny no resahina dia tsy misy vidiny.

Vakio bebe kokoa ao amin'ny bilaogy VMware: Fampidirana ny Get-View

Ankehitriny dia hasehoko ny zava-drehetra amin'ny tranga tena izy. 

Manoratra script mba hamoahana VM

Indray andro dia nangataka ahy ny mpiara-miasa amiko mba hanatsara ny script-ny. Ny asa dia ny mahazatra mahazatra: tadiavo ny VM rehetra miaraka amina paramΓ¨tre cloud.uuid duplicate (eny, azo atao izany rehefa manao clone VM ao amin'ny vCloud Director). 

Ny vahaolana mazava tonga ao an-tsaina dia:

  1. Mahazoa lisitry ny VM rehetra.
  2. Safidio ny lisitra.

Ny dikan-teny tany am-boalohany dia script tsotra:

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

Tsotra sy mazava ny zava-drehetra. Voasoratra ao anatin'ny minitra vitsy miaraka amin'ny fiatoana kafe. Hamafiso ny sivana dia vita izany.

Fa andeha hojerentsika ny fotoana:

Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI

Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI

2 minitra 47 segondra eo am-pikarakarana VM efa ho 10k. Ny tombony dia ny tsy fisian'ny sivana sy ny filana ny fandrindrana ny vokatra. Mazava ho azy fa mila fanatsarana ny script.

Runspaces no voalohany tonga hamonjy rehefa mila mahazo metrika mpampiantrano avy amin'ny vCenter amin'ny fotoana iray ianao na mila manodina zavatra an'aliny. Andeha hojerentsika izay omen'io fomba fiasa io.

Mandeha ny hafainganam-pandeha voalohany: PowerShell Runspaces

Ny zavatra voalohany tonga ao an-tsaina amin'ity script ity dia ny manatanteraka ny loop tsy misesy, fa amin'ny stream parallΓ¨le, manangona ny angona rehetra ho zavatra iray ary sivana. 

Saingy misy olana: PowerCLI dia tsy hamela anay hanokatra fivoriana mahaleo tena maro amin'ny vCenter ary hanipy fahadisoana mampihomehy:

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.

Mba hamahana izany dia tsy maintsy mampita vaovao momba ny fivoriana ao anaty kofehy aloha isika. Tsaroantsika fa ny PowerShell dia miasa amin'ny zavatra azo ampitaina ho mari-pamantarana na dia amin'ny fiasa iray, na dia amin'ny ScriptBlock aza. Andeha hojerentsika ny session ho toy ny zavatra toy izany, handalo ny $ global:DefaultVIServers (Connect-VIServer amin'ny -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 $_
           }
       }
   }

Ankehitriny dia mampihatra multithreading amin'ny alΓ lan'ny Runspace Pools izahay.  

Ireto ny algorithm:

  1. Mahazo lisitry ny VM rehetra izahay.
  2. Amin'ny renirano mifanitsy dia mahazo cloud.uuid isika.
  3. Manangona angona avy amin'ny renirano izahay ho zavatra iray.
  4. Sivana ny zavatra amin'ny alΓ lan'ny fanakambanana amin'ny sandan'ny saha CloudUUID: ireo izay mihoatra ny 1 ny isan'ny soatoavina tokana dia ny VM tadiavina.

Vokatr'izany dia mahazo ny script isika:


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
}

Ny hatsaran'ity script ity dia azo ampiasaina amin'ny tranga hafa mitovy amin'izany amin'ny fanoloana fotsiny ny ScriptBlock sy ny mari-pamantarana izay halefa amin'ny renirano. Ampiasao izany!

Mandrefy ny fotoana izahay:

Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI

55 segondra. Efa tsara kokoa, fa mbola haingana kokoa. 

Mivadika amin'ny hafainganam-pandeha faharoa: GetView

Andeha hojerentsika hoe inona no tsy mety.
Voalohany sy miharihary, ny Get-VM cmdlet dia mila fotoana ela vao vita.
Faharoa, ny cmdlet Get-AdvancedOptions dia mila fotoana lava kokoa vao vita.
Andeha hojerentsika aloha ilay faharoa. 

Ny Get-AdvancedOptions dia mora ampiasaina amin'ny zavatra VM tsirairay, saingy tena kivy rehefa mifandray amin'ny zavatra maro. Afaka mahazo fampahalalana mitovy amin'izany isika avy amin'ny zavatra milina virtoaly (Get-VM) mihitsy. Nalevina tsara fotsiny tao amin'ny zavatra ExtensionData. Miaraka amin'ny sivana, manafaingana ny dingana hahazoana ny angona ilaina.

Miaraka amin'ny fikitihana ny hato-tanana dia izao:


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

Mivadika ho izao:


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

Ny vokatra dia mitovy amin'ny Get-AdvancedOptions, saingy haingana kokoa. 

Ampidiro izao ny Get-VM. Tsy haingana izy io, satria mifandray amin'ny zavatra sarotra. Mipoitra ny fanontaniana lojika: nahoana isika no mila fampahalalana fanampiny sy PSObject goavambe amin'ity tranga ity, raha mila ny anaran'ny VM, ny toetrany ary ny sandan'ny toetra sarotra?  

Ho fanampin'izany, ny frein manoloana ny Get-AdvancedOptions dia tsy ao amin'ny script. Ny fampiasana Runspace Pools izao dia toa be loatra, satria tsy ilaina intsony ny mampitovy ny asa miadana amin'ny kofehy misy squats famindrana session. Ny fitaovana dia tsara, fa tsy amin'ity tranga ity. 

Mijery ny fivoahan'ny ExtensionData izahay: tsy inona fa zavatra Get-View ity. 

Andeha hojerentsika ny teknika taloha an'ny PowerShell wizards: andalana iray mampiasa sivana, fanasokajiana ary vondrona. Ny horohoro rehetra teo aloha dia nirodana tsara ho andalana iray ary tanterahina ao anatin'ny fivoriana iray:


$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

Mandrefy ny fotoana izahay:

Ahoana ny fomba hananganana rocket booster ho an'ny script PowerCLI

9 segondra ho an'ny zavatra efa ho 10k miaraka amin'ny sivana amin'ny fepetra tadiavina. Mahafinaritra!

Raha tokony ny famaranana

Ny vokatra azo ekena mivantana dia miankina amin'ny safidy fitaovana. Sarotra matetika ny milaza marina hoe inona marina no tokony hofidiana hanatrarana izany. Ny tsirairay amin'ireo fomba fanafainganana ny script etsy ambony dia tsara ao anatin'ny fetran'ny fampiharana azy. Manantena aho fa ity lahatsoratra ity dia hanampy anao amin'ny asa sarotra amin'ny fahatakarana ny fototry ny automatique dingana sy ny fanatsarana azy ireo amin'ny fotodrafitrasao.

Sal: Ny mpanoratra dia misaotra ny mpikambana rehetra ao amin'ny kaominina tamin'ny fanampiana sy fanohanana tamin'ny fanomanana ny lahatsoratra. Na ireo manana tongotra aza. Ary na dia ireo tsy manan-tongotra aza, toy ny boay.

Source: www.habr.com

Add a comment