Otu esi ewulite roket maka scripts PowerCLI 

N'oge na-adịghị anya, onye nchịkwa sistemụ VMware ọ bụla na-abịa na-arụ ọrụ oge niile. Ihe niile na-amalite na ahịrị iwu, wee bịa PowerShell ma ọ bụ VMware PowerCLI.

Ka anyị kwuo na ị nwetala PowerShell ntakịrị karịa ịmalite ISE na iji cmdlets ọkọlọtọ sitere na modul na-arụ ọrụ n'ihi "ụdị anwansi". Mgbe ịmalitere ịgbakọ igwe mebere na narị otu narị, ị ga-ahụ na scripts ndị na-enyere aka n'obere ọnụ ọgụgụ na-eji nwayọ nwayọ n'ọ̀tụ̀tụ̀ buru ibu. 

N'ọnọdụ a, 2 ngwaọrụ ga-enyere aka:

  • PowerShell Runspaces - usoro nke na-enye gị ohere ịmekọrịta mmezu nke usoro na eriri dị iche iche; 
  • Nweta-Lee - ọrụ PowerCLI bụ isi, ihe analọgụ Get-WMIObject na Windows. cmdlet a anaghị adọta ihe ndị na-eso ya, kama ọ na-enweta ozi n'ụdị ihe dị mfe nwere ụdị data dị mfe. N'ọtụtụ ọnọdụ ọ na-apụta ngwa ngwa.

Na-esote, m ga-ekwu okwu nkenke banyere ngwá ọrụ ọ bụla ma gosi ihe atụ nke ojiji. Ka anyị nyochaa ụfọdụ scripts wee hụ mgbe otu na-arụ ọrụ nke ọma karịa nke ọzọ. Gaba!

Otu esi ewulite roket maka scripts PowerCLI

Nkeji mbụ: Runspace

Ya mere, e mere Runspace maka nhazi nhazi nke ọrụ na-abụghị isi modul. N'ezie, ị nwere ike malite usoro ọzọ nke ga-eri ụfọdụ ebe nchekwa, processor, wdg Ọ bụrụ na gị script na-agba ọsọ na a di na nwunye nke nkeji na-erepịakwa a gigabyte nke ebe nchekwa, dịcha na ị ga-adịghị mkpa Runspace. Mana maka scripts maka iri puku kwuru iri puku ihe ọ chọrọ.

Ị nwere ike ịmalite ịmụta ebe a: 
Mmalite iji PowerShell Runspaces: Akụkụ 1

Kedu ihe iji Runspace na-enye:

  • ọsọ site na ịmachi ndepụta nke iwu egburu,
  • arụ ọrụ n'otu oge,
  • nche.

Nke a bụ ọmụmaatụ site na ịntanetị mgbe Runspace na-enyere aka:

"Egwuregwu nchekwa bụ otu n'ime metrik kacha sie ike ịchọta na vSphere. N'ime vCenter, ị nweghị ike ịga hụ nke VM na-eri ihe nchekwa karịa. Daalụ, ị nwere ike ịnakọta data a n'ime nkeji ekele PowerShell.
M ga-ekekọrịta edemede nke ga-enye ndị na-ahụ maka sistemụ VMware ohere ịchọ ngwa ngwa na vCenter niile wee nata ndepụta VM nwere data na nkezi oriri ha.  
Edemede a na-eji PowerShell runspaces nye onye ọ bụla ESXi onye ọbịa ohere ịnakọta ozi oriri site na VM nke ya na Runspace dị iche wee kọọ mkpesa ozugbo. Nke a na-enye PowerShell ohere imechi ọrụ ozugbo, kama ịmegharị site na ndị ọbịa wee chere ka onye ọ bụla mezue arịrịọ ya. "

isi: Otu esi egosi Virtual Machine I/O na ESXi Dashboard

N'okwu dị n'okpuru, Runspace adịghịzi aba uru:

"Ana m agbalị ide edemede na-anakọta ọtụtụ data na VM wee dee data ọhụrụ mgbe ọ dị mkpa. Nsogbu bụ na enwere ọtụtụ VM, yana 5-8 sekọnd na-eji otu igwe. 

isi: Multithreading PowerCLI nwere RunspacePool

Ebe ị ga-achọ Get-View, ka anyị gaa n'ihu na ya. 

Nkeji nke abụọ: Get-View

Iji ghọta ihe kpatara Get-View ji baa uru, ọ bara uru icheta ka cmdlets si arụ ọrụ n'ozuzu ya. 

Cmdlets dị mkpa iji nweta ozi nke ọma na-enweghị mkpa ịmụ akwụkwọ ntụaka API wee chegharịa wiil ọzọ. Kedu ihe n'oge ochie were otu narị ahịrị koodu ma ọ bụ abụọ, PowerShell na-enye gị ohere iji otu iwu mee. Anyị na-akwụ maka ịdị mma a na ọsọ. Enweghị anwansi n'ime cmdlets n'onwe ha: otu edemede ahụ, mana n'ogo dị ala, nke ejiri aka nka nke nna ukwu si India dere.

Ugbu a, iji tụnyere Get-View, ka anyị were Get-VM cmdlet: ọ na-abanye na igwe mebere ma weghachi ihe mejupụtara ya, ya bụ, ọ na-etinye ihe ndị ọzọ metụtara ya: VMHost, Datastore, wdg.  

Get-View n'ọnọdụ ya anaghị etinye ihe ọ bụla na-adịghị mkpa na ihe eweghachiri. Ọzọkwa, ọ na-enye anyị ohere ịkọwapụta nke ọma ozi anyị chọrọ, nke ga-eme ka ihe nrụpụta dị mfe. Na Windows Server n'ozuzu yana na Hyper-V karịsịa, Get-WMIObject cmdlet bụ ihe analọgụ kpọmkwem - echiche bụ otu ihe ahụ.

Get-View adịghị mma maka ịrụ ọrụ oge niile na ihe ihe. Ma a bịa na puku kwuru iri puku ihe, ọ nweghị ọnụ ahịa.

Ị nwere ike ịgụkwuo na blọọgụ VMware: Okwu mmalite nke Get-View

Ugbu a, m ga-egosi gị ihe niile site na iji ezigbo ikpe. 

Na-ede edemede ka ibudata VM

Otu ụbọchị onye ọrụ ibe m gwara m ka m kwalite edemede ya. Ọrụ a bụ ihe a na-emekarị: chọta VM niile nwere paramita cloud.uuid oyiri (ee, nke a ga-ekwe omume mgbe ị na-emechi VM na vCloud Director). 

Ihe ngwọta doro anya na-abata n'uche bụ:

  1. Nweta ndepụta VM niile.
  2. Tụgharịa ndepụta ahụ n'ụzọ ụfọdụ.

Ụdị izizi ahụ bụ edemede a dị mfe:

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

Ihe niile dị oke mfe ma doo anya. Enwere ike dee ya n'ime nkeji ole na ole na nkwụsị kọfị. Tụgharịa na filtration wee mee ya.

Mana ka anyị tụọ oge:

Otu esi ewulite roket maka scripts PowerCLI

Otu esi ewulite roket maka scripts PowerCLI

Nkeji 2 na nkeji 47 mgbe ị na-ahazi ihe fọrọ nke nta ka ọ bụrụ 10k VM. Ego ego bụ enweghị ihe nzacha na mkpa iji aka hazie nsonaazụ ya. N'ụzọ doro anya, edemede ahụ chọrọ njikarịcha.

Ọgba ọsọ bụ ndị mbụ na-abịa napụta mgbe ịchọrọ ịnweta metrik ndị ọbịa n'otu oge site na vCenter ma ọ bụ mkpa ịhazi iri puku kwuru iri puku ihe. Ka anyị hụ ihe ụzọ a na-eweta.

Gbanwuo ọsọ nke mbụ: PowerShell Runspaces

Ihe mbụ na-abata n'uche maka edemede a bụ ịmegharị loop ọ bụghị n'usoro, mana na eriri ndị yiri ya, kpokọta data niile n'ime otu ihe wee nyochaa ya. 

Mana enwere nsogbu: PowerCLI agaghị ekwe ka anyị mepee ọtụtụ nnọkọ nọọrọ onwe ha na vCenter ma tufuo njehie na-atọ ọchị:

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.

Iji dozie nke a, ị ga-ebu ụzọ nyefee ozi nnọkọ n'ime iyi ahụ. Ka anyị cheta na PowerShell na-arụ ọrụ na ihe enwere ike ibufe dị ka oke ma ọ bụ ọrụ ma ọ bụ na ScriptBlock. Ka anyị gafere nnọkọ ahụ n'ụdị ihe dị otú ahụ, na-agafe $global:DefaultVIServers (Jikọọ-VIServer na igodo -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 $_
           }
       }
   }

Ugbu a, ka anyị mejuputa multithreading site na Runspace Pools.  

The algọridim bụ dị ka ndị:

  1. Anyị na-enweta ndepụta VM niile.
  2. Na iyi iyi, anyị na-enweta cloud.uuid.
  3. Anyị na-anakọta data sitere na iyi n'ime otu ihe.
  4. Anyị na-enyocha ihe ahụ site na ijikọta ya site na uru nke ubi CloudUUID: ndị ebe ọnụ ọgụgụ nke ụkpụrụ pụrụ iche karịrị 1 bụ VM anyị na-achọ.

N'ihi ya, anyị na-enweta 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
}

Mma nke edemede a bụ na enwere ike iji ya n'ọnọdụ ndị ọzọ yiri ya site na dochie naanị ScriptBlock na paramita nke a ga-agafe na iyi. Na-erigbu ya!

Anyị na-echekwa oge:

Otu esi ewulite roket maka scripts PowerCLI

55 sekọnd. Ọ ka mma, mana ọ ka nwere ike ịdị ngwa ngwa. 

Ka anyị gaa n'ọsọ nke abụọ: GetView

Ka anyị chọpụta ihe na-adịghị mma.
Nke mbụ, Get-VM cmdlet na-ewe ogologo oge iji mebie ya.
Nke abụọ, Get-AdvancedOptions cmdlet na-ewe ogologo oge iji wuchaa.
Ka anyị buru ụzọ leba anya na nke abụọ. 

Get-AdvancedOptions dị mma maka ihe VM nke ọ bụla, mana ọ na-atọ ụtọ mgbe ị na-eji ọtụtụ ihe arụ ọrụ. Anyị nwere ike nweta otu ozi ahụ site na ihe igwe mebere n'onwe ya (Get-VM). E liri ya nke ọma na ihe ExtensionData. N'iji nzacha, anyị na-eme ngwa ngwa nke ịnweta data dị mkpa.

N'iji ntakịrị mmegharị aka nke a bụ:


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

Tụgharịa na nke a:


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

Ihe mmepụta ahụ bụ Get-AdvancedOptions, mana ọ na-arụ ọrụ ọtụtụ ugboro ngwa ngwa. 

Ugbu a nweta-VM. Ọ naghị adị ngwa ngwa n'ihi na ọ na-emekọ ihe dị mgbagwoju anya. Ajụjụ ezi uche dị na ya na-ebilite: gịnị kpatara anyị ji chọọ ozi ndị ọzọ na PSObject dị egwu na nke a, mgbe anyị chọrọ aha VM, steeti ya na uru nke àgwà aghụghọ?  

Na mgbakwunye, ewepụla ihe mgbochi n'ụdị Get-AdvancedOptions na edemede ahụ. Iji Runspace Pools ugbu a dị ka ihe karịrị akarị n'ihi na ọ dịghịzi mkpa ijikọ ọrụ dị nwayọ n'ofe squat eri mgbe ị na-enyefe nnọkọ. Ngwá ọrụ dị mma, ma ọ bụghị maka ikpe a. 

Ka anyị leba anya na mmepụta ExtensionData: ọ bụghị ihe karịrị ihe Get-View. 

Ka anyị kpọọ usoro ochie nke ndị nna ukwu PowerShell: otu ahịrị na-eji nzacha, nhazi na nhazi. A na-akụtu egwu niile gara aga nke ọma n'otu ahịrị wee gbuo ya n'otu oge:


$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

Anyị na-echekwa oge:

Otu esi ewulite roket maka scripts PowerCLI

9 sekọnd maka ihe fọrọ nke nta ka ọ bụrụ 10k ihe nwere nzacha site na ọnọdụ achọrọ. Nnukwu!

Kama nkwubi okwu

Nsonaazụ anabatara ozugbo dabere na nhọrọ ngwaọrụ. Ọ na-esikarị ike ikwu kpọmkwem ihe a ga-ahọrọ iji nweta ya. Ụzọ nke ọ bụla edepụtara maka ịgbalite edemede dị mma n'ime oke nke itinye ya. Enwere m olileanya na isiokwu a ga-enyere gị aka n'ọrụ siri ike nke ịghọta isi nke usoro akpaaka na njikarịcha na akụrụngwa gị.

PS: Onye ode akwụkwọ na-ekele ndị otu obodo niile maka enyemaka na nkwado ha n'ịkwadebe akụkọ ahụ. Ọbụna ndị nwere paws. Na ọbụna ndị na-enweghị ụkwụ, dị ka boa constrictor.

isi: www.habr.com

Tinye a comment