Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI 

Ise taimi mulimuli ane, soʻo se VMware system administrator e sau e faʻatometi galuega masani. E amata uma i le laina faʻatonu, ona sau ai lea o le PowerShell poʻo le VMware PowerCLI.

Fa'apea ua e iloa lelei le PowerShell nai lo le fa'alauiloaina o le ISE ma le fa'aogaina o cmdlets masani mai modules e aoga ona o "se ituaiga o togafiti". A amata ona e faitauina masini faakomepiuta i le fiaselau, o le a e iloa ai o tusitusiga e fesoasoani i se fua laʻititi e faʻasolosolo lemu i luga o se fua tele. 

I lenei tulaga, 2 meafaigaluega o le a fesoasoani:

  • PowerShell Runspaces - se auala e mafai ai e oe ona faʻatusatusa le faʻatinoina o faʻagasologa i filo eseese; 
  • Maua-Vaaiga - o se galuega faavae PowerCLI, o se faʻatusa o Get-WMIObject i Windows. O lenei cmdlet e le tosoina ni mea faʻatasi ma faʻalapotopotoga, ae maua faʻamatalaga i foliga o se mea faigofie ma faʻamatalaga faigofie. I le tele o tulaga e sau vave atu.

Le isi, o le a ou talanoa puupuu e uiga i meafaigaluega taʻitasi ma faʻaalia faʻataʻitaʻiga o le faʻaogaina. Se'i o tatou au'ili'ili fa'amatalaga patino ma va'ai pe a sili atu le lelei o le tasi nai lo le isi. Alu!

Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI

Laasaga muamua: Runspace

O lea la, Runspace ua mamanuina mo le faʻagasologa tutusa o galuega i fafo atu o le module autu. Ioe, e mafai ona e fa'alauiloa se isi fa'agasologa o le a 'ai ai sina manatua, fa'agaioiga, ma isi. Afai e alu lau fa'amaumauga i ni nai minute ma fa'aumatia le gigabyte o le manatua, e foliga mai e te le mana'omia le Runspace. Ae mo tusitusiga mo le fiasefulu afe o mea faitino e manaʻomia.

E mafai ona e amata aʻoaʻoina iinei: 
Amataina le Fa'aogaina o PowerShell Runspaces: Vaega 1

O le a le mea e maua e le faʻaaogaina o Runspace:

  • saoasaoa e ala i le faʻatapulaʻaina o le lisi o faʻatonuga faʻatinoina,
  • faiga tutusa o galuega,
  • saogalemu

O se faʻataʻitaʻiga mai le Initaneti pe a fesoasoani Runspace:

"O finauga o le teuina o se tasi lea o metotia sili ona faigata e siaki i vSphere. I totonu o le vCenter, e le mafai ona e alu e vaʻai po o le a le VM o loʻo faʻaaogaina le tele o mea e teu ai. O le mea e laki ai, e mafai ona e aoina nei faʻamatalaga i minute faʻafetai i le PowerShell.
O le a ou faʻasoaina se faʻamatalaga e mafai ai e le VMware system administrators ona vave suʻesuʻe i le vCenter ma maua se lisi o VM ma faʻamatalaga i luga o latou averesi taumafa.  
O lo'o fa'aogaina e le fa'amaumauga le PowerShell runspaces e fa'ataga ai e ta'ita'i ESXi ta'itasi e aoina fa'amatalaga fa'atau mai ana lava VM i se isi Runspace ma vave lipoti atu le mae'a. O le mea lea e mafai ai e le PowerShell ona tapunia vave galuega, nai lo le faʻasalalau i tagata talimalo ma faʻatali mo tagata taʻitoʻatasi e faʻamaeʻa lana talosaga.

puna: Faʻafefea ona faʻaalia le masini masini I/O i luga ole ESXi Dashboard

I le tulaga o loʻo i lalo, ua le toe aoga le Runspace:

"O loʻo ou taumafai e tusi se tusitusiga e aoina mai le tele o faʻamatalaga mai se VM ma tusia ni faʻamatalaga fou pe a manaʻomia. O le faʻafitauli o loʻo i ai le tele o VM, ma 5-8 sekone e faʻaalu i le masini e tasi. 

puna: Telethreading PowerCLI ma RunspacePool

O iinei e te manaʻomia Get-View, seʻi o tatou agai i ai. 

Laasaga lona lua: Get-View

Ina ia malamalama pe aisea e aoga ai le Get-View, e taua le manatua pe faʻafefea ona galue cmdlets lautele. 

E manaʻomia Cmdlets e maua ai faʻamatalaga faigofie e aunoa ma le manaʻomia e suʻesuʻe tusi faʻamatalaga API ma toe faʻaleleia le isi uili. O le a le mea i aso tuai na ave ai le selau pe lua laina o tulafono, PowerShell e mafai ai ona e faia i le tasi poloaiga. Matou te totogia lenei faʻafaigofie ma le saoasaoa. E leai se togafiti i totonu o le cmdlets lava ia: o le tusitusiga lava e tasi, ae i se tulaga maualalo, na tusia e lima atamamai o se matai mai le la o Initia.

I le taimi nei, mo le faʻatusatusaina o le Get-View, seʻi o tatou ave le Get-VM cmdlet: e maua ai le masini masini ma toe faʻafoʻi mai se mea tuʻufaʻatasia, o lona uiga, faʻapipiʻi isi mea faʻatatau i ai: VMHost, Datastore, ma isi.  

Get-View i lona tulaga e le faʻaopoopoina se mea e le manaʻomia i le mea na faʻafoʻi mai. E le gata i lea, e mafai ai ona matou faʻamaonia faʻamaonia mea matou te manaʻomia, lea o le a faafaigofieina ai le mea e gaosia. I le Windows Server i le lautele ma i Hyper-V aemaise lava, o le Get-WMIObject cmdlet o se faʻataʻitaʻiga tuusaʻo - o le manatu e tutusa lelei.

Get-View e le faigofie mo gaioiga masani i luga o mea faitino. Ae a oo i le afe ma le fiasefulu afe o mea faitino, e leai se tau.

E mafai ona e faitau atili ile VMware blog: Folasaga ile Get-View

O lenei o le a ou faʻaali atu ia te oe mea uma e faʻaaoga ai se faʻamatalaga moni. 

Tusia o se tusitusiga e la'u ai se VM

I se tasi aso na fai mai ai la'u uo e faaleleia lana tusitusiga. O le galuega o se masani masani: suʻe uma VM ma se kopi faʻapipiʻi cloud.uuid (ioe, e mafai lenei pe a faʻapipiʻi se VM i vCloud Director). 

O le tali manino e sau i lou mafaufau o le:

  1. Maua se lisi o VM uma.
  2. Su'e le lisi i se isi itu.

O le uluai lomiga o le tusitusiga faigofie lenei:

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

O mea uma e matua faigofie ma manino. E mafai ona tusia i ni nai minute ma se malologa kofe. Fa'amau le su'ega ma ua mae'a.

Ae tatou fua le taimi:

Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI

Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI

2 minute 47 sekone pe a fa'agaoioia toetoe 10k VMs. O le ponesi o le leai lea o ni filiga ma le mana'oga e fa'avasega ma le lima i'uga. E manino lava, o le tusitusiga e manaʻomia le faʻaleleia atili.

O Runspaces e muamua e sau e laveai pe a e manaʻomia le mauaina i le taimi e tasi metric metrics mai le vCenter pe manaʻomia le faʻaogaina o le fiasefulu afe o mea. Se'i vaai po o le a le mea e aumaia e lenei faiga.

Fa'aola le saoasaoa muamua: PowerShell Runspaces

O le mea muamua e sau i lou mafaufau mo lenei tusitusiga o le faʻatinoina o le matasele e le faʻasolosolo, ae i filo tutusa, aoina uma faʻamatalaga i se mea e tasi ma faamama. 

Ae o loʻo i ai se faʻafitauli: PowerCLI o le a le faʻatagaina i matou e tatalaina le tele o sauniga tutoʻatasi i le vCenter ma o le a lafoina se mea malie malie:

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.

Ina ia foia lenei mea, e tatau ona e pasi muamua faʻamatalaga o le sauniga i totonu o le vaitafe. Ia tatou manatua o le PowerShell e galue i mea faitino e mafai ona pasi e fai ma parakalafa pe i se galuega poʻo se ScriptBlock. Sei o tatou pasi le sauniga i le tulaga o sea mea, e ala i le $ global: DefaultVIServers (Connect-VIServer ma le -NotDefault ki):

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

Se'i o tatou fa'atinoina le multithreading e ala i Runspace Pools.  

O le algorithm e faʻapea:

  1. Matou te maua se lisi o VM uma.
  2. I vaitafe tutusa tatou te maua cloud.uuid.
  3. Matou te aoina faʻamatalaga mai vaitafe i se mea e tasi.
  4. Matou te faʻamama le mea e ala i le faʻavasegaina i le tau o le CloudUUID field: oi latou e sili atu le numera o tulaga faʻapitoa nai lo le 1 o VM o loʻo matou sailia.

O se taunuuga, matou te maua le faʻamatalaga:


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
}

O le matagofie o lenei tusitusiga e mafai ona faʻaaogaina i isi tulaga faʻapena i le na o le suia o le ScriptBlock ma faʻamaufaʻailoga o le a pasia i le vaitafe. Fa'aaoga tatau!

Matou te fuaina le taimi:

Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI

55 sekone. E sili atu, ae e mafai lava ona vave. 

Tatou see i le saoasaoa lona lua: GetView

Se'i tatou su'e po o le a le mea ua tupu.
Muamua ma le sili, o le Get-VM cmdlet e umi se taimi e faʻatino ai.
Lona lua, o le Get-AdvancedOptions cmdlet e umi se taimi e faʻamaeʻa ai.
Sei o tatou feagai muamua ma le lona lua. 

Get-AdvancedOptions e faigofie mo mea taʻitasi VM, ae faʻavalevalea pe a galue i le tele o mea. E mafai ona matou maua faʻamatalaga tutusa mai le masini masini masini (Get-VM). Fa'atoa tanumia lelei i le mea ExtensionData. Fa'aauupegaina i le fa'amamaina, matou te fa'avavevaveina le fa'agasologa o le mauaina o fa'amaumauga talafeagai.

Faatasi ai ma sina gaioiga o le lima o le:


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

Liliu i lenei:


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

Ole fa'aulufale e tutusa ma Get-AdvancedOptions, ae e tele taimi e sili atu le saoasaoa. 

Ole taimi nei e maua-VM. E le vave ona e feagai ma mea faigata. O se fesili talafeagai e tulaʻi mai: aisea tatou te manaʻomia ai faʻamatalaga faaopoopo ma se PSObject mataʻutia i lenei tulaga, pe a tatou manaʻomia le igoa o le VM, lona tulaga ma le taua o se uiga taufaasese?  

E le gata i lea, o le faʻalavelave i le tulaga o Get-AdvancedOptions ua aveesea mai le tusitusiga. O le fa'aogaina o Runspace Pools ua foliga mai ua sili atu ona le toe mana'omia le fa'atusaina o se galuega fa'agesegese i luga o filo squat pe a tu'uina atu se vasega. E lelei le meafaigaluega, ae le mo lenei tulaga. 

Se'i o tatou va'ai i le fa'aulufalega o ExtensionData: e leai se mea e sili atu nai lo se mea e maua-Vaai. 

Se'i o tatou vala'au i le faiga tuai a le PowerShell masters: tasi le laina e fa'aoga ai filiga, fa'avasega ma fa'avasega. O mea mataʻutia uma na muamua atu ua paʻu'ū lelei i le laina e tasi ma faʻatinoina i le tasi vasega:


$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

Matou te fuaina le taimi:

Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI

9 sekone mo le toetoe lava 10k meafaitino faʻatasi ma le faʻamamaina e le tulaga manaʻomia. Matagofie!

Nai lo o se faaiuga

O se taunuuga talia sa'o e faalagolago i le filifiliga o meafaigaluega. E masani ona faigata ona fai atu ma le mautinoa le mea tonu e tatau ona filifilia e ausia ai. O auala taʻitasi o loʻo lisiina mo le faʻavaveina o tusitusiga e lelei i totonu o tapulaʻa o lona faʻaogaina. Ou te faʻamoemoe o lenei tusiga o le a fesoasoani ia te oe i le galuega faigata o le malamalama i faʻavae o le faʻagasologa o masini ma faʻalelei i au atinaʻe.

SALA: E faafetaia e le tusitala tagata uma o le afioaga mo la latou fesoasoani ma le lagolago i le sauniaina o le tusiga. E oo lava ia i latou e iai vae. Ma e oo lava ia i latou e leai ni vae, e pei o se boa constrictor.

puna: www.habr.com

Faaopoopo i ai se faamatalaga