Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI 

Haufinyane, molaoli ofe kapa ofe oa sistimi ea VMware o tla ho etsa mesebetsi e tloaelehileng. Tsohle li qala ka mohala oa taelo, ebe ho tla PowerShell kapa VMware PowerCLI.

Ha re re u ithutile PowerShell hanyane ho feta ho qala ISE le ho sebelisa li-cmdlets tse tloaelehileng ho tsoa ho li-module tse sebetsang ka lebaka la "mofuta o mong oa boloi". Ha u qala ho bala mechini ea sebele ka makholo, u tla fumana hore mengolo e thusang ka tekanyo e nyane e tsamaea butle haholo ka tekanyo e kholo. 

Boemong bona, lisebelisoa tse 2 li tla thusa:

  • PowerShell Runspaces - mokhoa o u lumellang ho bapisa ts'ebetso ea lits'ebetso ka likhoele tse fapaneng; 
  • Fumana-Sheba - ts'ebetso ea mantlha ea PowerCLI, analogue ea Get-WMIObject ho Windows. cmdlet ena ha e hule lintho tse tsamaeang le mekhatlo, empa e fumana boitsebiso ka mokhoa oa ntho e bonolo e nang le mefuta e bonolo ea data. Maemong a mangata e tsoa kapele.

Ka mor'a moo, ke tla bua ka bokhutšoanyane ka sesebelisoa ka seng 'me ke bontše mehlala ea tšebeliso. A re sekasekeng mangolo a itseng 'me re bone ha e 'ngoe e sebetsa betere ho feta e 'ngoe. Tsamaea!

Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI

Mohato oa pele: Runspace

Kahoo, Runspace e etselitsoe ts'ebetso e ts'oanang ea mesebetsi kantle ho mojule oa mantlha. Ehlile, o ka qala ts'ebetso e 'ngoe e tla ja memori e itseng, processor, joalo-joalo. Haeba mongolo oa hau o sebetsa ka mor'a metsotso e seng mekae mme o sebelisa memori ea gigabyte, mohlomong u ke ke ua hloka Runspace. Empa bakeng sa mengolo bakeng sa lintho tse mashome a likete ho hlokahala.

U ka qala ho ithuta mona: 
Ho qala Tšebeliso ea PowerShell Runspaces: Karolo ea 1

Ho sebelisa Runspace ho fana ka eng:

  • lebelo ka ho fokotsa lenane la litaelo tse phethiloeng,
  • phethahatso ea mesebetsi e tšoanang,
  • polokeho.

Mohlala ke ona o tsoang Marang-rang ha Runspace e thusa:

"Khang ea polokelo ke e 'ngoe ea metrics e thata ka ho fetisisa ho e latela ho vSphere. Ka har'a vCenter, u ke ke ua ea feela ho bona hore na ke VM efe e jang lisebelisoa tse ngata tsa polokelo. Ka lehlohonolo, o ka bokella data ena ka metsotso e seng mekae ka lebaka la PowerShell.
Ke tla arolelana sengoloa se tla lumella batsamaisi ba sistimi ea VMware ho batla ka potlako ho pholletsa le vCenter mme ba fumane lethathamo la li-VM tse nang le data mabapi le tšebeliso ea bona e tloaelehileng.  
Sengoloa se sebelisa li-runspaces tsa PowerShell ho lumella moamoheli e mong le e mong oa ESXi ho bokella tlhahisoleseling ho tsoa ho li-VM tsa hae sebakeng se arohaneng sa Runspace mme hang-hang a tlalehe phetho. Sena se lumella PowerShell ho koala mesebetsi hang-hang, ho fapana le ho pheta-pheta ka baamoheli le ho emela hore e mong le e mong a phethe kopo ea hae. ”

Source: Mokhoa oa ho Bontša Virtual Machine I/O ho Dashboard ea ESXi

Boemong bo ka tlase, Runspace ha e sa na thuso:

"Ke leka ho ngola lengolo le bokellang lintlha tse ngata ho tsoa ho VM le ho ngola lintlha tse ncha ha ho hlokahala. Bothata ke hore ho na le li-VM tse ngata haholo, 'me metsotsoana e 5-8 e sebelisoa mochining o le mong. ” 

Source: Multithreading PowerCLI e nang le RunspacePool

Mona o tla hloka Get-View, ha re feteleng ho eona. 

Mokhahlelo oa bobeli: Get-View

Ho utloisisa hore na ke hobane'ng ha Get-View e le molemo, ho bohlokoa ho hopola kamoo cmdlets e sebetsang ka kakaretso. 

Li-Cmdlets lia hlokahala ho fumana tlhaiso-leseling ntle le tlhoko ea ho ithuta libuka tsa litšupiso tsa API le ho khutlisetsa lebili le latelang. Seo matsatsing a khale se neng se nka mela e lekholo kapa e 'meli ea khoutu, PowerShell e u lumella ho etsa ka taelo e le' ngoe. Re lefella boiketlo bona ka lebelo. Ha ho na boselamose ka hare ho cmdlets ka boeona: script e tšoanang, empa e le boemong bo tlaase, e ngotsoeng ke matsoho a nang le tsebo ea monghali ea tsoang India ea chesang.

Hona joale, ha re bapisa le Get-View, a re nke Get-VM cmdlet: e fihlella mochine oa sebele 'me e khutlisa ntho e nang le motsoako, ke hore, e kopanya lintho tse ling tse amanang le eona: VMHost, Datastore, joalo-joalo.  

Get-View sebakeng sa eona ha e kenye letho le sa hlokahaleng nthong e khutlisitsoeng. Ho feta moo, e re lumella ho hlalosa ka ho hlaka hore na re hloka boitsebiso bofe, bo tla etsa hore ntho e hlahisoang e be bonolo. Ho Windows Server ka kakaretso le ho Hyper-V haholo-holo, Get-WMIObject cmdlet ke analogue e tobileng - mohopolo o ts'oana hantle.

Get-View ha e na thuso bakeng sa ts'ebetso e tloaelehileng ea lintlha. Empa ha ho tluoa tabeng ea lintho tse likete le mashome a likete, ha e na theko.

U ka bala haholoanyane ho VMware blog: Selelekela sa Get-View

Joale ke tla u bontša ntho e 'ngoe le e' ngoe ke sebelisa nyeoe ea 'nete. 

Ho ngola script ho laolla VM

Ka letsatsi le leng mosebetsi-'moho le 'na o ile a nkōpa hore ke ntlafatse mongolo oa hae. Mosebetsi ke mokhoa o tloaelehileng: fumana li-VM tsohle tse nang le parameter ea cloud.uuid e kopitsoang (e, sena se ka khoneha ha u kopanya VM ho vCloud Director). 

Tharollo e hlakileng e tlang kelellong ke:

  1. Fumana lenane la li-VM tsohle.
  2. Hlalosa lenane ka tsela e itseng.

Mofuta oa pele e ne e le mongolo o bonolo ona:

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

Ntho e 'ngoe le e 'ngoe e bonolo haholo ebile e hlakile. E ka ngoloa ka metsotso e 'maloa ka khefu ea kofi. Hlakola ho tlhotla 'me e felile.

Empa ha re lekanye nako:

Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI

Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI

Metsotsoana ea 2 metsotsoana ea 47 ha o sebetsana le hoo e ka bang 10k VMs. Bonase ke ho ba sieo ha lihloela le tlhoko ea ho hlophisa liphetho ka bowena. Ho hlakile hore script e hloka ntlafatso.

Li-Runspaces ke tsona tsa pele tsa ho thusa ha o hloka ho fumana metrics ea moamoheli ka nako e le ngoe ho tsoa ho vCenter kapa o hloka ho sebetsana le lintho tse mashome a likete. A re bone hore na mokhoa ona o tlisa eng.

Bulela lebelo la pele: PowerShell Runspaces

Ntho ea pele e tlang kelellong bakeng sa mongolo ona ke ho etsa loop eseng ka tatellano, empa ka likhoele tse tšoanang, bokella lintlha tsohle nthong e le 'ngoe ebe u e sefa. 

Empa ho na le bothata: PowerCLI e ke ke ea re lumella ho bula mananeo a mangata a ikemetseng ho vCenter mme e tla etsa phoso e qabolang:

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.

Ho rarolla sena, o tlameha ho qala ka ho fetisa tlhahisoleseling ka har'a molatsoana. A re hopoleng hore PowerShell e sebetsa le lintho tse ka fetisetsoang e le paramethara ho ts'ebetso kapa ho ScriptBlock. Ha re fetise seboka ka sebopeho sa ntho e joalo, re feta $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 $_
           }
       }
   }

Joale ha re kenye tšebetsong multithreading ka Runspace Pools.  

Algorithm e tjena:

  1. Re fumana lethathamo la li-VM tsohle.
  2. Melatsoaneng e bapileng re fumana leru.uuid.
  3. Re bokella data ho tsoa melapong ho ea nthong e le 'ngoe.
  4. Re sefa ntho ka ho e hlophisa ka boleng ba sebaka sa CloudUUID: moo palo ea boleng bo ikhethang e fetang 1 ke li-VM tseo re li batlang.

Ka lebaka leo, re fumana 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
}

Botle ba script ena ke hore e ka sebelisoa maemong a mang a tšoanang ka ho fetola ScriptBlock le li-parameter tse tla fetisetsoa molapong. E sebelise hampe!

Re lekanya nako:

Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI

Metsotsoana e 55. Ho molemo, empa e ntse e ka ba kapele. 

Ha re feteleng lebelong la bobeli: GetView

Ha re fumane hore na phoso ke efe.
Pele ho tsohle, Get-VM cmdlet e nka nako e telele ho e phetha.
Ea bobeli, Get-AdvancedOptions cmdlet e nka nako e telele ho qeta.
Ha re sebetsaneng le ea bobeli pele. 

Get-AdvancedOptions e loketse lintho tsa VM ka bomong, empa e thata haholo ha o sebetsa ka lintho tse ngata. Re ka fumana tlhahisoleseling e ts'oanang ho tsoa ho ntho ea mochini ka boeona (Get-VM). E sa tsoa patoa hantle nthong ea ExtensionData. Re hlometse ka ho sefa, re potlakisa ts'ebetso ea ho fumana lintlha tse hlokahalang.

Ka ho sisinyeha hanyenyane ha letsoho sena ke:


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

E fetoha sena:


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

Sephetho se tšoana le Get-AdvancedOptions, empa se sebetsa ka makhetlo a mangata ka potlako. 

Joale ho Fumana-VM. Ha e potlake hobane e sebetsana le dintho tse rarahaneng. Ho hlaha potso e utloahalang: ke hobane'ng ha re hloka boitsebiso bo eketsehileng le PSObject e nyarosang tabeng ee, ha re hloka feela lebitso la VM, boemo ba eona le boleng ba tšobotsi e qhekellang?  

Ho feta moo, tšitiso ka mokhoa oa Get-AdvancedOptions e tlositsoe ho script. Ho sebelisa Matamo a Runspace hona joale ho bonahala eka ke ntho e feteletseng kaha ha ho sa na tlhokahalo ea ho bapisa mosebetsi o liehang ho pholletsa le likhoele tsa squat ha u fana ka seboka. Sesebelisoa se setle, empa eseng bakeng sa nyeoe ena. 

Ha re shebeng tlhahiso ea ExtensionData: ha se letho haese ntho ea Get-View. 

Ha re ipiletse ho mokhoa oa khale oa masterShell masters: mola o le mong o sebelisa li-filters, ho hlophisa le ho hlophisa. Tšabo eohle e fetileng e oele ka bokhabane moleng o le mong mme e phethoa ka nako e le 'ngoe:


$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

Re lekanya nako:

Mokhoa oa ho aha "rocket booster" bakeng sa mangolo a PowerCLI

Metsotsoana ea 9 bakeng sa lintho tse ka bang 10k tse nang le sefa ka boemo bo lakatsehang. E kholo!

Ho e-na phetheha

Sephetho se amohelehang ka ho toba se itšetlehile ka khetho ea sesebelisoa. Hangata ho thata ho bolela ka tieo hore na ke eng e lokelang ho khethoa ho e finyella. E 'ngoe le e' ngoe ea mekhoa e thathamisitsoeng ea ho potlakisa lingoloa e ntle ka har'a meeli ea ho sebetsa ha eona. Ke tšepa hore sengoloa sena se tla u thusa mosebetsing o boima oa ho utloisisa metheo ea ts'ebetso ea boiketsetso le ho ntlafatsa lits'ebetsong tsa hau.

PS: Mongoli o leboha litho tsohle tsa sechaba ka thuso le tšehetso ea bona ho lokiseng sengoloa. Esita le ba nang le marokho. Le ba se nang maoto, joalo ka boa constrictor.

Source: www.habr.com

Eketsa ka tlhaloso