Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI 

Laipẹ tabi ya, eyikeyi oluṣakoso eto VMware wa lati ṣe adaṣe awọn iṣẹ ṣiṣe deede. Gbogbo rẹ bẹrẹ pẹlu laini aṣẹ, lẹhinna PowerShell wa tabi VMware PowerCLI.

Jẹ ki a sọ pe o ti ni oye PowerShell diẹ diẹ sii ju ifilọlẹ ISE ati lilo awọn cmdlets boṣewa lati awọn modulu ti o ṣiṣẹ nitori “iru idan kan”. Nigbati o ba bẹrẹ kika awọn ẹrọ foju ni awọn ọgọọgọrun, iwọ yoo rii pe awọn iwe afọwọkọ ti o ṣe iranlọwọ lori iwọn kekere nṣiṣẹ ni akiyesi ni akiyesi lori iwọn nla kan. 

Ni ipo yii, awọn irinṣẹ meji yoo ṣe iranlọwọ: +

  • PowerShell Runspaces - ọna ti o fun ọ laaye lati ṣe afiwe ipaniyan awọn ilana ni awọn okun lọtọ; 
  • Gba-Wo - iṣẹ ipilẹ PowerCLI, afọwọṣe ti Get-WMIObject ni Windows. cmdlet yii ko fa awọn nkan ti o tẹle awọn nkan, ṣugbọn gba alaye ni irisi ohun ti o rọrun pẹlu awọn iru data ti o rọrun. Ni ọpọlọpọ igba ti o ba wa jade yiyara.

Nigbamii, Emi yoo sọ ni ṣoki nipa ọpa kọọkan ati ṣafihan awọn apẹẹrẹ ti lilo. Jẹ ki a ṣe itupalẹ awọn iwe afọwọkọ kan pato ki o rii nigbati ọkan ba ṣiṣẹ daradara ju ekeji lọ. Lọ!

Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI

Ipele akọkọ: Runspace

Nitorinaa, Runspace jẹ apẹrẹ fun sisẹ deede ti awọn iṣẹ ṣiṣe ni ita module akọkọ. Nitoribẹẹ, o le ṣe ifilọlẹ ilana miiran ti yoo jẹ diẹ ninu iranti, ero isise, ati bẹbẹ lọ Ti iwe afọwọkọ rẹ ba ṣiṣẹ ni iṣẹju meji ti o gba gigabyte ti iranti, o ṣeese kii yoo nilo Runspace. Ṣugbọn fun awọn iwe afọwọkọ fun ẹgbẹẹgbẹrun awọn nkan ti o nilo.

O le bẹrẹ ẹkọ nibi: 
Ibẹrẹ Lilo Awọn aaye RunShell PowerShell: Apá 1

Kini lilo Runspace fun:

  • iyara nipa diwọn atokọ ti awọn pipaṣẹ ṣiṣe,
  • ṣiṣe ni afiwe ti awọn iṣẹ-ṣiṣe,
  • ailewu.

Eyi ni apẹẹrẹ lati Intanẹẹti nigbati Runspace ṣe iranlọwọ:

“Ajiyàn ibi ipamọ jẹ ọkan ninu awọn metiriki ti o nira julọ lati tọpa ni vSphere. Ninu vCenter, o ko le kan lọ wo iru VM ti n gba awọn orisun ibi ipamọ diẹ sii. Ni Oriire, o le gba data yii ni awọn iṣẹju ọpẹ si PowerShell.
Emi yoo pin iwe afọwọkọ kan ti yoo gba awọn alabojuto eto VMware laaye lati wa ni iyara jakejado vCenter ati gba atokọ ti awọn VM pẹlu data lori lilo apapọ wọn.  
Iwe afọwọkọ naa nlo awọn aaye ṣiṣe PowerShell lati gba alejo ESXi kọọkan lati gba alaye agbara lati awọn VM tirẹ ni Runspace lọtọ ati ijabọ ipari lẹsẹkẹsẹ. Eyi ngbanilaaye PowerShell lati pa awọn iṣẹ duro lẹsẹkẹsẹ, dipo kikojọpọ nipasẹ awọn ọmọ-ogun ati duro de ọkọọkan lati pari ibeere rẹ. ”

orisun: Bii o ṣe le ṣe afihan ẹrọ foju I/O lori Dasibodu ESXi

Ninu ọran ti o wa ni isalẹ, Runspace ko wulo mọ:

“Mo n gbiyanju lati kọ iwe afọwọkọ kan ti o gba data pupọ lati VM kan ati kọ data tuntun nigbati o jẹ dandan. Iṣoro naa ni pe ọpọlọpọ awọn VM lo wa, ati pe awọn aaya 5-8 lo lori ẹrọ kan. ” 

orisun: Multithreading PowerCLI pẹlu RunspacePool

Nibi iwọ yoo nilo Gba-Wo, jẹ ki a lọ siwaju si. 

Ipele keji: Gba-Wo

Lati loye idi ti Get-View ṣe wulo, o tọ lati ranti bi cmdlets ṣe n ṣiṣẹ ni gbogbogbo. 

A nilo awọn Cmdlets lati gba alaye ni irọrun laisi iwulo lati ṣe iwadi awọn iwe itọkasi API ati tun ṣẹda kẹkẹ atẹle. Kini ni awọn ọjọ atijọ mu ọgọrun tabi awọn laini koodu meji, PowerShell gba ọ laaye lati ṣe pẹlu aṣẹ kan. A sanwo fun irọrun yii pẹlu iyara. Ko si idan inu cmdlets funrara wọn: iwe afọwọkọ kanna, ṣugbọn ni ipele kekere, ti a kọ nipasẹ awọn ọwọ oye ti oluwa lati India Sunny.

Ni bayi, fun lafiwe pẹlu Get-View, jẹ ki a mu Get-VM cmdlet: o wọle si ẹrọ foju kan ati da ohun kan pada, iyẹn ni, o so awọn nkan miiran ti o ni ibatan pọ si: VMHost, Datastore, ati bẹbẹ lọ.  

Gba-Wiwo ni aaye rẹ ko ṣafikun ohunkohun ti ko wulo si nkan ti o pada. Pẹlupẹlu, o gba wa laaye lati ṣe pato iru alaye ti a nilo, eyiti yoo jẹ ki ohun ti o wu jade rọrun. Ni Windows Server ni gbogbogbo ati ni Hyper-V ni pataki, Get-WMIObject cmdlet jẹ afọwọṣe taara - imọran jẹ kanna.

Gba-Wiwo jẹ airọrun fun awọn iṣẹ ṣiṣe deede lori awọn nkan aaye. Sugbon nigba ti o ba de si egbegberun ati mewa ti egbegberun ohun, o ni ko si owo.

O le ka diẹ sii lori bulọọgi VMware: Ifihan si Gba-Wo

Bayi Emi yoo fi ohun gbogbo han ọ nipa lilo ọran gidi kan. 

Kikọ iwe afọwọkọ kan lati gbejade VM kan

Ni ọjọ kan ẹlẹgbẹ mi beere lọwọ mi lati mu iwe afọwọkọ rẹ dara si. Iṣẹ naa jẹ ilana ṣiṣe ti o wọpọ: wa gbogbo awọn VM pẹlu paramita awọsanma.uuid pidánpidán (bẹẹni, eyi ṣee ṣe nigba ti cloning VM ni Oludari vCloud). 

Ojutu ti o han gbangba ti o wa si ọkan ni:

  1. Gba atokọ ti gbogbo awọn VM.
  2. Pa akojọ naa bakan.

Ẹya atilẹba jẹ iwe afọwọkọ ti o rọrun yii:

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

Ohun gbogbo ti jẹ lalailopinpin o rọrun ati ki o ko o. O le kọ ni iṣẹju diẹ pẹlu isinmi kofi kan. Dabaru lori sisẹ ati pe o ti ṣe.

Ṣugbọn jẹ ki a ṣe iwọn akoko naa:

Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI

Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI

2 iṣẹju 47 aaya nigbati processing fere 10k VM. Ajeseku jẹ isansa ti awọn asẹ ati iwulo lati lẹsẹsẹ awọn abajade pẹlu ọwọ. O han ni, iwe afọwọkọ nilo iṣapeye.

Runspaces jẹ akọkọ lati wa si igbala nigbakanna o nilo lati gba awọn metiriki agbalejo lati vCenter tabi nilo lati ṣe ilana ẹgbẹẹgbẹrun awọn nkan. Jẹ ká wo ohun ti yi ona mu.

Tan iyara akọkọ: PowerShell Runspaces

Ohun akọkọ ti o wa si ọkan fun iwe afọwọkọ yii ni lati ṣiṣẹ lupu kii ṣe lẹsẹsẹ, ṣugbọn ni awọn okun ti o jọra, gba gbogbo data sinu ohun kan ki o ṣe àlẹmọ. 

Ṣugbọn iṣoro kan wa: PowerCLI kii yoo gba wa laaye lati ṣii ọpọlọpọ awọn igba ominira si vCenter ati pe yoo jabọ aṣiṣe alarinrin kan:

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.

Lati yanju eyi, o gbọdọ kọkọ kọja alaye igba inu ṣiṣan naa. Jẹ ki a ranti pe PowerShell ṣiṣẹ pẹlu awọn nkan ti o le kọja bi paramita boya si iṣẹ kan tabi si ScriptBlock. Jẹ ki a kọja igba naa ni irisi iru ohun kan, nipatakoja $ agbaye:DefaultVIServers (Sopọ-VIServer pẹlu bọtini -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 $_
           }
       }
   }

Bayi jẹ ki a ṣe multithreading nipasẹ Runspace Pools.  

Algorithm jẹ bi atẹle:

  1. A gba atokọ ti gbogbo awọn VM.
  2. Ni awọn ṣiṣan ti o jọra a gba cloud.uuid.
  3. A gba data lati awọn ṣiṣan sinu ohun kan.
  4. A ṣe àlẹmọ ohun naa nipa ṣiṣe akojọpọ nipasẹ iye aaye CloudUUID: awọn nibiti nọmba awọn iye alailẹgbẹ ti tobi ju 1 ni awọn VM ti a n wa.

Bi abajade, a gba iwe afọwọkọ naa:


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
}

Ẹwa ti iwe afọwọkọ yii ni pe o le ṣee lo ni awọn ọran miiran ti o jọra nipa rirọpo ScriptBlock nirọrun ati awọn aye ti yoo kọja si ṣiṣan naa. Lo nilokulo rẹ!

A ṣe iwọn akoko:

Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI

55 aaya. O dara julọ, ṣugbọn o tun le yarayara. 

Jẹ ki a lọ si iyara keji: GetView

Jẹ ki a wa ohun ti ko tọ.
Ni akọkọ ati ṣaaju, Get-VM cmdlet gba akoko pipẹ lati ṣiṣẹ.
Ẹlẹẹkeji, Get-AdvancedOptions cmdlet gba to gun paapaa lati pari.
Jẹ ká wo pẹlu awọn keji ọkan akọkọ. 

Gba-AdvancedOptions jẹ irọrun fun awọn ohun VM kọọkan, ṣugbọn o ṣaṣeyọri pupọ nigbati o n ṣiṣẹ pẹlu ọpọlọpọ awọn nkan. A le gba alaye kanna lati inu ohun elo ẹrọ foju (Gba-VM). O kan sin daradara ni nkan ExtensionData. Ni ihamọra pẹlu sisẹ, a yara ilana ti gbigba data pataki.

Pẹlu iṣipopada ọwọ diẹ eyi ni:


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

Yipada si eyi:


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

Ijade jẹ kanna bi Gba-AdvancedOptions, ṣugbọn o ṣiṣẹ ni ọpọlọpọ igba yiyara. 

Bayi lati Gba-VM. Ko yara nitori pe o ṣe pẹlu awọn nkan idiju. A mogbonwa ibeere Daju: idi ti a nilo afikun alaye ati ki o kan ibanilẹru PSObject ninu apere yi, nigba ti a kan nilo awọn orukọ ti VM, awọn oniwe-ipinle ati awọn iye ti a ti ẹtan ro pe?  

Ni afikun, idiwo ni irisi Get-AdvancedOptions ti yọkuro kuro ninu iwe afọwọkọ naa. Lilo Awọn adagun omi Runspace ni bayi dabi ẹni pe o pọju nitori ko si iwulo lati ṣe afiwe iṣẹ-ṣiṣe ti o lọra kọja awọn okun squat nigba fifun igba kan. Ọpa naa dara, ṣugbọn kii ṣe fun ọran yii. 

Jẹ ki a wo abajade ExtensionData: kii ṣe nkan diẹ sii ju nkan Gba-Wo lọ. 

Jẹ ki a pe ilana atijọ ti awọn ọga PowerShell: laini kan nipa lilo awọn asẹ, tito lẹsẹsẹ ati akojọpọ. Gbogbo ibanilẹru iṣaaju ti ṣubu lulẹ daradara si laini kan ati ṣiṣe ni igba kan:


$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

A ṣe iwọn akoko:

Bii o ṣe le kọ igbega rocket fun awọn iwe afọwọkọ PowerCLI

9 aaya fun fere 10k awọn nkan pẹlu sisẹ nipasẹ ipo ti o fẹ. Nla!

Dipo ti pinnu

Abajade itẹwọgba taara da lori yiyan ọpa. Nigbagbogbo o ṣoro lati sọ ni idaniloju kini pato yẹ ki o yan lati ṣaṣeyọri rẹ. Ọkọọkan awọn ọna ti a ṣe akojọ fun iyara awọn iwe afọwọkọ dara laarin awọn opin ti iwulo rẹ. Mo nireti pe nkan yii yoo ṣe iranlọwọ fun ọ ni iṣẹ ti o nira ti oye awọn ipilẹ ti adaṣe ilana ati iṣapeye ninu awọn amayederun rẹ.

PS: Onkọwe naa dupẹ lọwọ gbogbo awọn ọmọ ẹgbẹ agbegbe fun iranlọwọ ati atilẹyin wọn ni mimuradi nkan naa. Paapaa awọn ti o ni owo. Ati paapaa awọn ti ko ni awọn ẹsẹ, bi boa constrictor.

orisun: www.habr.com

Fi ọrọìwòye kun