Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI 

Nas luaithe no nas fhaide air adhart, thig rianadair siostam VMware sam bith gus gnìomhan àbhaisteach a dhèanamh fèin-ghluasadach. Bidh e uile a’ tòiseachadh leis an loidhne-àithne, an uairsin thig PowerShell no VMware PowerCLI.

Canaidh sinn gu bheil thu air PowerShell a mhaighstireachd beagan nas fhaide na bhith a’ cur ISE air bhog agus a’ cleachdadh cmdlets àbhaisteach bho mhodalan a tha ag obair air sgàth “seòrsa de dhraoidheachd”. Nuair a thòisicheas tu a’ cunntadh innealan brìgheil anns na ceudan, gheibh thu a-mach gu bheil sgriobtaichean a chuidicheas a-mach air sgèile bheag a’ ruith gu math nas slaodaiche air sgèile mhòr. 

Anns an t-suidheachadh seo, cuidichidh innealan 2 a-mach:

  • Àiteachan ruith PowerShell - dòigh-obrach a leigeas leat a bhith co-shìnte ri coileanadh phròiseasan ann an snàithleanan fa leth; 
  • Faigh-Sealladh - gnìomh PowerCLI bunaiteach, analog de Get-WMIObject ann an Windows. Cha bhith an cmdlet seo a’ tarraing nithean a tha nan cois, ach a’ faighinn fiosrachadh ann an cruth nì sìmplidh le seòrsachan dàta sìmplidh. Ann an iomadh cùis thig e a-mach nas luaithe.

An ath rud, bruidhnidh mi goirid mu gach inneal agus seallaidh mi eisimpleirean de chleachdadh. Nach dèan sinn sgrùdadh air sgriobtaichean sònraichte agus faicinn cuin a bhios aon ag obair nas fheàrr na am fear eile. Rach!

Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI

A 'chiad ìre: Runspace

Mar sin, tha Runspace air a dhealbhadh airson giullachd co-shìnte de ghnìomhan taobh a-muigh a’ phrìomh mhodal. Gu dearbh, faodaidh tu pròiseas eile a chuir air bhog a dh ’itheas beagan cuimhne, pròiseasar, msaa. Ma bhios an sgriobt agad a’ ruith ann am mionaid no dhà agus ag ithe gigabyte de chuimhne, is coltaiche nach fheum thu Runspace. Ach airson sgriobtaichean airson deichean de mhìltean de nithean tha feum air.

Faodaidh tu tòiseachadh air ionnsachadh an seo: 
A’ tòiseachadh a’ cleachdadh raointean ruith PowerShell: Pàirt 1

Dè tha cleachdadh Runspace a’ toirt seachad:

  • astar le bhith a’ cuingealachadh liosta nan òrduighean a chaidh a chur an gnìomh,
  • coileanadh ghnìomhan co-shìnte,
  • sàbhailteachd.

Seo eisimpleir bhon eadar-lìn nuair a bhios Runspace a’ cuideachadh:

“Is e connspaid stòraidh aon de na meatrach as cruaidhe ri lorg ann an vSphere. Taobh a-staigh vCenter, chan urrainn dhut dìreach a dhol a dh'fhaicinn dè an VM a tha ag ithe barrachd ghoireasan stòraidh. Gu fortanach, faodaidh tu an dàta seo a chruinneachadh ann am mionaidean le taing do PowerShell.
Roinnidh mi sgriobt a leigeas le luchd-rianachd siostam VMware sgrùdadh a dhèanamh gu sgiobalta air feadh vCenter agus liosta de VMan fhaighinn le dàta mun chaitheamh cuibheasach aca.  
Bidh an sgriobt a’ cleachdadh raointean ruith PowerShell gus leigeil le gach aoigh ESXi fiosrachadh caitheamh a chruinneachadh bho na VMan aca fhèin ann an Runspace air leth agus aithris sa bhad air crìochnachadh. Leigidh seo le PowerShell obraichean a dhùnadh sa bhad, an àite a bhith ag ath-aithris tro luchd-aoigheachd agus a’ feitheamh ri gach fear an t-iarrtas aca a choileanadh.”

Source: Mar a sheallas tu Virtual Machine I/O air deas-bhòrd ESXi

Anns a 'chùis gu h-ìosal, chan eil Runspace feumail tuilleadh:

“Tha mi a’ feuchainn ri sgriobt a sgrìobhadh a chruinnicheas tòrr dàta bho VM agus a sgrìobhas dàta ùr nuair a bhios feum air. Is e an duilgheadas a th’ ann gu bheil tòrr VM ann, agus 5-8 diogan air an caitheamh air aon inneal. ” 

Source: PowerCLI ioma-threading le RunspacePool

An seo feumaidh tu Get-View, gluaisidh sinn air adhart thuige. 

An dàrna ìre: Get-View

Gus tuigsinn carson a tha Get-View feumail, is fhiach cuimhneachadh mar a tha cmdlets ag obair san fharsaingeachd. 

Tha feum air cmdlets gus fiosrachadh fhaighinn gu goireasach gun fheum air leabhraichean fiosrachaidh API a sgrùdadh agus an ath chuibhle ath-thòiseachadh. Dè anns na seann làithean a thug ceud no dhà de chòd, leigidh PowerShell leat a dhèanamh le aon àithne. Bidh sinn a 'pàigheadh ​​​​airson a' ghoireas seo le luaths. Chan eil draoidheachd taobh a-staigh nan cmdlets fhèin: an aon sgriobt, ach aig ìre nas ìsle, air a sgrìobhadh le làmhan sgileil maighstir bho na h-Innseachan grianach.

A-nis, airson coimeas a dhèanamh ri Get-View, bheir sinn an Get-VM cmdlet: bidh e a’ faighinn cothrom air an inneal mas-fhìor agus a’ tilleadh stuth co-dhèanta, is e sin, bidh e a’ ceangal nithean co-cheangailte eile ris: VMHost, Datastore, msaa.  

Cha chuir Get-View na àite dad neo-riatanach ris an nì a chaidh a thilleadh. A bharrachd air an sin, leigidh e leinn am fiosrachadh a tha a dhìth oirnn a shònrachadh gu mionaideach, a nì an toradh toraidh nas fhasa. Ann an Windows Server san fharsaingeachd agus ann an Hyper-V gu sònraichte, tha an Get-WMIObject cmdlet na analog dìreach - tha am beachd dìreach mar an ceudna.

Tha Get-View mì-ghoireasach airson obair àbhaisteach air nithean puing. Ach nuair a thig e gu mìltean is deichean de mhìltean de nithean, chan eil prìs aige.

Faodaidh tu barrachd a leughadh air blog VMware: Ro-ràdh airson Get-View

A-nis seallaidh mi dhut a h-uile dad a ’cleachdadh fìor chùis. 

A 'sgrìobhadh sgriobt gus VM a luchdachadh

Aon latha dh’ iarr mo cho-obraiche orm an sgriobt aige a bharrachadh. Tha an gnìomh na chleachdadh cumanta: lorg a h-uile VM le paramadair cloud.uuid dùblaichte (tha, tha seo comasach nuair a bhios tu a’ clonadh VM ann an vCloud Director). 

Is e am fuasgladh follaiseach a thig gu inntinn:

  1. Faigh liosta de na VMs gu lèir.
  2. Parsaich an liosta dòigh air choireigin.

B’ e an sgriobt sìmplidh seo an dreach tùsail:

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

Tha a h-uile dad gu math sìmplidh agus soilleir. Faodar a sgrìobhadh ann am mionaid no dhà le fois cofaidh. Dèan sgriubha air an fhileadh agus tha e deiseil.

Ach tomhaisidh sinn an ùine:

Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI

Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI

2 mionaidean 47 diogan nuair a bhios tu a’ giullachd faisg air 10k VM. Is e buannachd a th’ ann nach eil sìoltachain ann agus an fheum air na toraidhean a sheòrsachadh le làimh. Gu dearbh, feumaidh an sgriobt optimization.

Is e Runspaces a’ chiad fheadhainn a thig gu teasairginn nuair a dh’ fheumas tu aig an aon àm metrics aoigheachd fhaighinn bho vCenter no feumaidh tu deichean de mhìltean de stuthan a phròiseasadh. Feuch sinn a-mach dè a bheir an dòigh-obrach seo.

Tionndaidh air a 'chiad astar: PowerShell Runspaces

Is e a’ chiad rud a thig gu inntinn airson an sgriobt seo an lùb a chuir an gnìomh chan ann ann an sreath, ach ann an snàithleanan co-shìnte, cruinnich an dàta gu lèir ann an aon nì agus sìoladh e. 

Ach tha duilgheadas ann: cha leig PowerCLI leinn mòran sheiseanan neo-eisimeileach fhosgladh gu vCenter agus tilgidh e mearachd èibhinn:

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.

Gus seo fhuasgladh, feumaidh tu an toiseach a dhol seachad air fiosrachadh seisean taobh a-staigh an t-sruth. Cuimhnichidh sinn gu bheil PowerShell ag obair le nithean a dh'fhaodar a thoirt seachad mar pharamadair gu gnìomh no gu ScriptBlock. Rachamaid seachad air an t-seisean ann an cruth nì mar sin, a’ dol seachad air $global:DefaultVIServers (Connect-VIServer leis an iuchair -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 $_
           }
       }
   }

A-nis leig dhuinn multithreading a chuir an gnìomh tro Runspace Pools.  

Tha an algorithm mar a leanas:

  1. Gheibh sinn liosta de na VMan uile.
  2. Ann an sruthan co-shìnte gheibh sinn cloud.uuid.
  3. Bidh sinn a’ cruinneachadh dàta bho shruthan gu aon nì.
  4. Bidh sinn a’ sìoladh an nì le bhith ga chur ann am buidheann a rèir luach an raoin CloudUUID: is e an fheadhainn far a bheil an àireamh de luachan sònraichte nas àirde na 1 na VMan a tha sinn a’ sireadh.

Mar thoradh air an sin, gheibh sinn an sgriobt:


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
}

Is e bòidhchead an sgriobt seo gum faodar a chleachdadh ann an cùisean eile den aon seòrsa le bhith dìreach a’ cur an àite an ScriptBlock agus na crìochan a thèid a thoirt don t-sruth. Gabh brath air!

Bidh sinn a’ tomhas ùine:

Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI

55 diogan. Tha e nas fheàrr, ach faodaidh e a bhith nas luaithe fhathast. 

Gluaisidh sinn chun dàrna astar: GetView

Feuch sinn a-mach dè a tha ceàrr.
An toiseach agus gu cudromach, bheir cmdlet Get-VM ùine mhòr airson a chuir gu bàs.
San dàrna h-àite, bheir an cmdlet Get-AdvancedOptions eadhon nas fhaide ri chrìochnachadh.
Bruidhnidh sinn ris an dàrna fear an toiseach. 

Tha Get-AdvancedOptions goireasach airson nithean VM fa-leth, ach gu math cliobach nuair a bhios tu ag obair le mòran nithean. Gheibh sinn an aon fhiosrachadh bhon nì inneal mas-fhìor fhèin (Get-VM). Tha e dìreach air a thiodhlacadh gu math anns an nì ExtensionData. Armaichte le sìoladh, bidh sinn a’ luathachadh a’ phròiseas airson an dàta riatanach fhaighinn.

Le gluasad beag de làmh tha seo:


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

Tionndaidh gu seo:


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

Tha an toradh an aon rud ri Get-AdvancedOptions, ach bidh e ag obair iomadh uair nas luaithe. 

A-nis gu Get-VM. Chan eil e luath oir tha e a’ dèiligeadh ri nithean iom-fhillte. Tha ceist loidsigeach ag èirigh: carson a tha feum againn air fiosrachadh a bharrachd agus cuspair PSO monstrous sa chùis seo, nuair nach fheum sinn ach ainm an VM, a staid agus luach feart duilich?  

A bharrachd air an sin, chaidh an cnap-starra ann an cruth Get-AdvancedOptions a thoirt air falbh bhon sgriobt. Tha e coltach gu bheil cleachdadh Runspace Pools a-nis cus oir chan eil feum tuilleadh air gnìomh slaodach a cho-thaobhadh thairis air snàithleanan squat nuair a bheir thu seachad seisean. Tha an inneal math, ach chan ann airson a 'chùis seo. 

Bheir sinn sùil air toradh ExtensionData: chan eil ann ach rud Get-View. 

Nach gairm sinn air an t-seann dòigh-obrach de mhaighstirean PowerShell: aon loidhne a’ cleachdadh sìoltachain, òrdachadh agus cruinneachadh. Tha an uabhas a bh’ ann roimhe air a leagail gu grinn ann an aon loidhne agus air a chuir gu bàs ann an aon seisean:


$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

Bidh sinn a’ tomhas ùine:

Mar a thogas tu àrdachadh rocaid airson sgriobtaichean PowerCLI

9 diogan airson faisg air 10k nithean le sìoladh a rèir an t-suidheachaidh a tha thu ag iarraidh. Sgoinneil!

An àite a bhith co-dhùnadh

Tha toradh iomchaidh gu dìreach an urra ris an roghainn inneal. Gu tric tha e duilich a ràdh le cinnt dè dìreach a bu chòir a thaghadh airson a choileanadh. Tha gach aon de na dòighean clàraichte airson sgriobtaichean a luathachadh math taobh a-staigh crìochan iomchaidheachd. Tha mi an dòchas gun cuidich an artaigil seo thu leis an obair dhoirbh a bhith a’ tuigsinn bunaitean fèin-ghluasad pròiseas agus optimization sa bhun-structar agad.

PS: Tha an t-ùghdar a’ toirt taing do gach ball den choimhearsnachd airson an cuid cuideachaidh agus taic ann a bhith ag ullachadh an artaigil. Fiù 's an fheadhainn le spògan. Agus eadhon an fheadhainn aig nach eil casan, mar boa constrictor.

Source: www.habr.com

Cuir beachd ann