Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI 

Luath nó mall, tagann aon riarthóir córais VMware chun gnáththascanna a uathoibriú. Tosaíonn sé ar fad leis an líne ordaithe, ansin tagann PowerShell nó VMware PowerCLI.

Ligean le rá go bhfuil máistreacht agat ar PowerShell beagán níos faide ná ISE a sheoladh agus cmdlets caighdeánach a úsáid as modúil a oibríonn mar gheall ar “draíocht de shaghas éigin”. Nuair a thosaíonn tú ag comhaireamh meaisíní fíorúla sna céadta, gheobhaidh tú amach go bhfuil scripteanna a chabhraíonn amach ar scála beag ag rith go suntasach níos moille ar scála mór. 

Sa chás seo, cabhróidh 2 uirlis amach:

  • Spásanna Rith PowerShell – cur chuige a ligeann duit cur i gcrích próiseas i snáitheanna ar leith a chomhthreomharú; 
  • Faigh-Féach – feidhm bhunúsach PowerCLI, analóg de Get-WMIObject i Windows. Ní tharraingíonn an cmdlet seo rudaí a ghabhann le haonáin, ach faigheann sé faisnéis i bhfoirm réad simplí le cineálacha sonraí simplí. I go leor cásanna tagann sé amach níos tapúla.

Ansin, labhróidh mé go hachomair faoi gach uirlis agus taispeánfaidh mé samplaí úsáide. Déanaimis anailís ar scripteanna sonracha agus féachfaimid nuair a oibríonn duine amháin níos fearr ná an ceann eile. Téigh!

Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI

An chéad chéim: Runspace

Mar sin, tá Runspace deartha le haghaidh próiseáil comhthreomhar tascanna lasmuigh den phríomh-mhodúl. Ar ndóigh, is féidir leat a sheoladh próiseas eile a ithe suas roinnt cuimhne, próiseálaí, etc Má ritheann do script i gceann cúpla nóiméad agus ídíonn gigabyte de chuimhne, is dócha ní bheidh ort Runspace gá. Ach le haghaidh scripteanna do na mílte réad tá sé ag teastáil.

Is féidir leat tosú ag foghlaim anseo: 
Tosaigh Úsáid Spásanna Rith PowerShell: Cuid 1

Cad a thugann úsáid Runspace:

  • luas trí liosta na n-orduithe feidhmithe a theorannú,
  • cur i gcrích comhthreomhar tascanna,
  • sábháilteacht.

Seo sampla ón Idirlíon nuair a chuidíonn Runspace le:

“Tá conspóid stórála ar cheann de na méadrachtaí is deacra a rianú in vSphere. Laistigh de vCenter, ní féidir leat dul díreach a fheiceáil cé acu VM atá ag caitheamh níos mó acmhainní stórála. Ar ámharaí an tsaoil, is féidir leat na sonraí seo a bhailiú i nóiméid a bhuíochas le PowerShell.
Roinnfidh mé script a ligfidh do riarthóirí córais VMware cuardach tapa a dhéanamh ar fud vCenter agus liosta VM a fháil le sonraí ar a n-ídiú meán.  
Úsáideann an script spásanna reatha PowerShell chun ligean do gach óstach ESXi faisnéis tomhaltais a bhailiú óna VManna féin i Runspace ar leith agus tuairisc a thabhairt láithreach ar chríochnú. Ligeann sé seo do PowerShell poist a dhúnadh láithreach, seachas atriall trí óstaigh agus fanacht le gach ceann acu a iarratas a chomhlánú."

Foinse: Conas Meaisín Fíorúil I/O a thaispeáint ar Phainéal ESXi

Sa chás thíos, níl Runspace úsáideach a thuilleadh:

“Táim ag iarraidh script a scríobh a bhailíonn go leor sonraí ó VM agus a scríobhann sonraí nua nuair is gá. Is í an fhadhb atá ann ná go bhfuil go leor VManna ann, agus go gcaitear 5-8 soicind ar mheaisín amháin.” 

Foinse: PowerCLI Multithreading le RunspacePool

Anseo beidh ort Get-View, a ligean ar bogadh ar aghaidh chuige. 

Dara céim: Faigh-View

Chun a thuiscint cén fáth a bhfuil Get-View úsáideach, is fiú cuimhneamh ar conas a oibríonn cmdlets i gcoitinne. 

Tá gá le cmdlets faisnéis a fháil go áisiúil gan gá le staidéar a dhéanamh ar leabhair thagartha API agus an chéad roth eile a athchruthú. Cad a tharla sna sean-laethanta céad nó dhá líne de chód, ceadaíonn PowerShell duit a dhéanamh le ceann amháin ordú. Íocaimid as an áisiúlacht seo le luas. Níl aon draíocht taobh istigh de na cmdlets iad féin: an script chéanna, ach ar leibhéal níos ísle, scríofa ag lámha sciliúil máistir ón India Mostly.

Anois, chun comparáid a dhéanamh le Get-View, tógfaimid an cmdlet Get-VM: faigheann sé rochtain ar an meaisín fíorúil agus cuireann sé réad ilchodach ar ais, is é sin, ceanglaíonn sé rudaí gaolmhara eile leis: VMHost, Datastore, etc.  

Ní chuireann Get-View ina áit aon rud nach bhfuil gá leis leis an réad ar ais. Thairis sin, ligeann sé dúinn a shonrú go docht cén fhaisnéis a theastaíonn uainn, rud a fhágfaidh go mbeidh an réad aschuir níos éasca. I Windows Server go ginearálta agus i Hyper-V go háirithe, is analóg díreach é an cmdlet Get-WMIObject - tá an smaoineamh díreach mar an gcéanna.

Tá Get-View deacair le haghaidh gnáthoibríochtaí ar rudaí pointe. Ach nuair a thagann sé ar na mílte agus na mílte réad, níl aon phraghas air.

Is féidir leat tuilleadh a léamh ar bhlag VMware: Réamhrá le Get-View

Anois taispeánfaidh mé duit gach rud ag baint úsáide as cás fíor. 

Script a scríobh chun VM a dhíluchtú

Lá amháin d’iarr mo chomhghleacaí orm a script a bharrfheabhsú. Is gnáthamh coitianta é an tasc: faigh gach VM a bhfuil paraiméadar cloud.uuid dúblach aige (tá, is féidir é seo a dhéanamh nuair a dhéantar VM a chlónáil in Stiúrthóir vCloud). 

Is é an réiteach soiléir a thagann chun cuimhne:

  1. Faigh liosta de gach VM.
  2. Parsáil an liosta ar bhealach éigin.

Ba é an bunleagan an script shimplí seo:

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

Tá gach rud thar a bheith simplí agus soiléir. Is féidir é a scríobh i gceann cúpla nóiméad le sos caife. Scriú ar an scagachán agus tá sé déanta.

Ach déanaimis an t-am a thomhas:

Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI

Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI

2 nóiméad 47 soicind nuair a phróiseáiltear beagnach 10k VM. Is bónas é an easpa scagairí agus an gá na torthaí a shórtáil de láimh. Ar ndóigh, éilíonn an script leas iomlán a bhaint.

Is iad spásanna reatha na chéad daoine a thagann chun tarrthála nuair is gá duit méadracht óstach a fháil ag an am céanna ó vCenter nó nuair a bhíonn ort na mílte réad a phróiseáil. A ligean ar a fheiceáil cad a thugann an cur chuige seo.

Cas ar an gcéad luas: PowerShell Runspaces

Is é an chéad rud a thagann chun cuimhne don script seo ná an lúb a fhorghníomhú ní go seicheamhach, ach i snáitheanna comhthreomhara, na sonraí go léir a bhailiú in aon rud amháin agus é a scagadh. 

Ach tá fadhb ann: ní ligfidh PowerCLI dúinn go leor seisiúin neamhspleácha a oscailt do vCenter agus déanfaidh sé earráid greannmhar:

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.

Chun é seo a réiteach, ní mór duit faisnéis seisiúin a chur isteach sa sruth ar dtús. Cuimhnigh orainn go n-oibríonn PowerShell le rudaí ar féidir iad a chur ar aghaidh mar pharaiméadar chuig feidhm nó chuig ScriptBlock. Cuirimis an seisiún ar aghaidh i bhfoirm réad dá leithéid, ag seachaint $global:DefaultVIServers (Ceangail-VIServer leis an eochair -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 $_
           }
       }
   }

Anois cuirimis multithreading i bhfeidhm trí Runspace Pools.  

Seo a leanas an algartam:

  1. Faighimid liosta de na VManna go léir.
  2. I sruthanna comhthreomhara faigheann muid cloud.uuid.
  3. Bailímid sonraí ó shruthanna isteach i réad amháin.
  4. Déanaimid an réad a scagadh trína ghrúpáil de réir luach an réimse CloudUUID: is iad siúd ina bhfuil líon na luachanna uathúla níos mó ná 1 na VManna atá á lorg againn.

Mar thoradh air sin, faigheann muid an 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
}

Is í áilleacht an script seo gur féidir é a úsáid i gcásanna eile dá leithéid ach an ScriptBlock a athsholáthar agus na paraiméadair a chuirfear ar aghaidh chuig an sruth. Bain leas as!

Tomhaisimid am:

Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI

Soicind 55. Tá sé níos fearr, ach is féidir é a bheith níos tapúla fós. 

Bogfaimid chuig an dara luas: GetView

A ligean ar a fháil amach cad atá mícheart.
Ar an gcéad dul síos, tógann sé tamall fada an cmdlet Get-VM a fhorghníomhú.
Ar an dara dul síos, tógann sé níos faide fós an cmdlet Get-AdvancedOptions a chríochnú.
Déanaimis déileáil leis an dara ceann ar dtús. 

Tá Get-AdvancedOptions áisiúil do rudaí VM aonair, ach tá sé an-clumsy nuair a bhíonn tú ag obair le go leor rudaí. Is féidir linn an fhaisnéis chéanna a fháil ón réad meaisín fíorúil féin (Get-VM). Tá sé curtha go maith sa réad ExtensionData. Agus an scagadh á dhéanamh againn, cuirimid dlús leis an bpróiseas chun na sonraí riachtanacha a fháil.

Le gluaiseacht beag láimhe is é 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}}

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

Tá an t-aschur mar an gcéanna le Get-AdvancedOptions, ach oibríonn sé go leor uaireanta níos tapúla. 

Anois chun Get-VM. Níl sé tapa toisc go ndéileálann sé le rudaí casta. Éiríonn ceist loighciúil: cén fáth a bhfuil faisnéis bhreise agus ábhar PSO monstrous de dhíth orainn sa chás seo, nuair nach bhfuil uainn ach ainm an VM, a staid agus luach tréith fánach?  

Ina theannta sin, tá an chonstaic i bhfoirm Get-AdvancedOptions bainte den script. Is cosúil go bhfuil rómharú ag baint le húsáid Runspace Pools anois mar ní gá a thuilleadh tasc mall a chomhthreomharú trasna snáitheanna scuaise agus seisiún á thabhairt ar láimh. Tá an uirlis go maith, ach ní sa chás seo. 

Breathnaímid ar aschur ExtensionData: ní rud ar bith níos mó é ná réad Get-View. 

A ligean ar glaoch ar an teicníc ársa na máistrí PowerShell: líne amháin ag baint úsáide as scagairí, sórtáil agus grúpáil. Titeann an t-uafás roimhe seo go léir in aon líne amháin agus cuirtear chun feidhme é in aon seisiún amháin:


$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

Tomhaisimid am:

Conas teanndáileog roicéad a thógáil le haghaidh scripteanna PowerCLI

9 soicind le haghaidh rudaí beagnach 10k le scagadh de réir an choinníll inmhianaithe. Go hiontach!

In ionad a thabhairt i gcrích

Braitheann toradh inghlactha go díreach ar an rogha uirlis. Is minic a bhíonn sé deacair a rá go cinnte cad go díreach ba cheart a roghnú chun é a bhaint amach. Tá gach ceann de na modhanna liostaithe chun scripteanna a bhrostú go maith laistigh de theorainneacha a infheidhmeachta. Tá súil agam go gcabhróidh an t-alt seo leat sa tasc deacair tuiscint a fháil ar bhunghnéithe uathoibrithe próisis agus optamú i do bhonneagar.

PS: Gabhann an t-údar buíochas le gach ball den phobal as a gcabhair agus a dtacaíocht agus an t-alt á ullmhú. Fiú amháin iad siúd a bhfuil lapaí orthu. Agus fiú iad siúd nach bhfuil cosa acu, cosúil le boa constrictor.

Foinse: will.com

Add a comment