Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI 

Ake ake nei, ka tae mai tetahi kaiwhakahaere punaha VMware ki te whakaaunoa i nga mahi mahi. Ka tiimata katoa ki te raina whakahau, katahi ka puta mai a PowerShell, VMware PowerCLI ranei.

Me kii kua mohio koe i a PowerShell he iti noa atu i te whakarewatanga o te ISE me te whakamahi i nga cmdlet paerewa mai i nga waahanga e mahi ana na "tetahi momo makutu". Ka timata koe ki te tatau i nga miihini mariko i roto i nga rau, ka kitea e koe ko nga tuhinga e awhina ana i runga i te tauine iti ka tere haere i runga i te waahanga nui. 

I tenei ahuatanga, e rua nga taputapu ka awhina:

  • Nga Mokowāmahi PowerShell – he huarahi e taea ai e koe te whakarara i te mahinga o nga tukanga i roto i nga miro motuhake; 
  • Tikina-Tirohanga – he mahinga PowerCLI taketake, he tairitenga o Get-WMIObject i Windows. Karekau tenei cmdlet e kumea i nga mea e whai ana i nga hinonga, engari ka whiwhi korero i te ahua o te ahanoa ngawari me nga momo raraunga ngawari. I te nuinga o nga wa ka puta tere ake.

I muri mai, ka korero poto ahau mo ia taputapu me te whakaatu i nga tauira o te whakamahinga. Kia wetewetehia nga tuhinga motuhake ka kite i te wa e pai ake ai te mahi a tetahi i tera. Haere!

Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI

Wāhanga tuatahi: Runspace

Na, i hangaia a Runspace mo te tukatuka whakarara o nga mahi i waho o te waahanga matua. Ko te tikanga, ka taea e koe te whakarewa i tetahi atu mahi ka pau te mahara, te tukatuka, me etahi atu. Mena ka rere to tuhinga i roto i nga meneti e rua ka pau i te gigabyte o te mahara, kaore pea koe e hiahia ki te Runspace. Engari mo nga tuhinga mo nga mano tini o nga taonga e hiahiatia ana.

Ka taea e koe te timata ki te ako i konei: 
Te Whakamahinga o PowerShell Runspaces: Wāhanga 1

He aha ta te whakamahi Runspace e homai:

  • tere ma te whakaiti i te rarangi o nga whakahau kua mahia,
  • te mahi whakarara o nga mahi,
  • ahuru

Anei tetahi tauira mai i te Ipurangi i te wa e awhina ana a Runspace:

"Ko te tautohetohe rokiroki tetahi o nga waahanga uaua ki te whai i roto i te vSphere. I roto i te vCenter, kaore e taea e koe te haere noa ki te kite ko wai te VM e pau ana i nga rauemi rokiroki. Waimarie, ka taea e koe te kohikohi i enei raraunga i roto i nga meneti na te PowerShell.
Ka tohatoha ahau i tetahi tuhinga ka taea e nga kaiwhakahaere punaha VMware te rapu tere puta noa i te vCenter me te whiwhi rarangi o nga VM me nga raraunga mo o raatau kai toharite.  
Ka whakamahia e te tuhinga nga mokowāwaho PowerShell kia taea e ia kaihautu ESXi te kohi korero kai mai i ana ake VM i roto i te Runspace motuhake me te whakaatu tonu i te otinga. Ma tenei ka taea e PowerShell te kati tonu i nga mahi, kaua ki te tarai i nga kaihautu me te tatari kia oti tana tono."

Source: Me pehea te Whakaatu Miihini Mariko I/O i runga i te Papatohu ESXi

I roto i te keehi i raro nei, kua kore e whai hua a Runspace:

"Kei te ngana ahau ki te tuhi i tetahi tuhinga e kohikohi ana i te maha o nga raraunga mai i te VM me te tuhi raraunga hou ina tika ana. Ko te raru he maha nga VM, a 5-8 hēkona e pau ana ki te miihini kotahi. 

Source: Whakamaramatanga PowerCLI me te RunspacePool

I konei ka hiahia koe ki te Tiro-Tirohia, me haere ki runga. 

Wāhanga tuarua: Tiro-Tirohia

Kia mohio ai koe he aha te whai hua o Tiro-Tirohia, he mea tika kia maumahara ki te mahi a nga cmdlet i te nuinga. 

E hiahiatia ana nga Cmdlet kia pai ai te tiki korero me te kore e hiahia ki te ako i nga pukapuka tohutoro API me te hanga ano i te wira e whai ake nei. He aha i nga ra o mua i tango i nga rarangi waehere kotahi rau, e rua ranei, ka taea e PowerShell te mahi me te whakahau kotahi. Ka utua e matou tenei waatea me te tere. Karekau he makutu kei roto i nga cmdlet ake: he rite tonu te tuhinga, engari kei te taumata iti, he mea tuhi na nga ringa mohio o te rangatira o Inia paki.

Na, mo te whakataurite ki te Tiro-Tirohia, me tango te Get-VM cmdlet: ka uru atu ki te miihini mariko ka whakahoki mai i tetahi mea whakahiato, ara, ka hono atu i etahi atu mea e pa ana ki a ia: VMHost, Datastore, etc.  

Ko te Tirohanga-Tirohanga i tona waahi kaore e taapiri i tetahi mea koretake ki te mea kua whakahokia mai. I tua atu, ka taea e maatau te whakaatu he aha nga korero e hiahiatia ana e maatau, ka ngawari ake te ahanoa whakaputa. I roto i te Windows Server i roto i te whanui me te Hyper-V ina koa, ko te Get-WMIObject cmdlet he riterite tika - he rite tonu te whakaaro.

Tikina-Tirohia he raruraru mo nga mahi mahinga i runga i nga taonga tohu. Engari ka tae ki nga mano me nga tekau mano o nga taonga, kaore he utu.

Ka taea e koe te panui atu i runga i te blog VMware: He kupu whakataki ki te Tiro-Tirohanga

Inaianei ka whakaatu ahau ki a koe i nga mea katoa ma te whakamahi i te keehi pono. 

Te tuhi i tetahi tuhinga hei tango i te VM

I tetahi ra ka tono mai taku hoa mahi ki te arotau i tana tuhinga. He mahinga noa te mahi: kimihia nga VM katoa me te tawhā cloud.uuid taarua (ae, ka taea tenei i te wa e kati ana i te VM ki te Kaiwhakahaere vCloud). 

Ko te otinga marama e puta mai ana ki te hinengaro ko:

  1. Tikina he rarangi o nga VM katoa.
  2. Porohia te rarangi.

Ko te putanga taketake ko tenei tuhinga ngawari:

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

Ko nga mea katoa he tino maamaa me te maamaa. Ka taea te tuhi i roto i nga meneti e rua me te waahi kawhe. Tikina te tātari ka oti.

Engari me ine i te wa:

Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI

Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI

2 meneti 47 hēkona ka tukatuka tata 10k VMs. Ko te bonus ko te kore o nga whiriwhiringa me te hiahia ki te whakariterite a ringa i nga hua. Ko te tikanga, me arotau te tuhinga.

Ko Runspaces te tuatahi ki te whakaora ina hiahia koe ki te tiki i nga inenga kaihautu mai i te vCenter me te tukatuka ranei i nga mano tini mea. Kia kite tatou he aha tenei huarahi ka kawea mai.

Whakakāhia te tere tuatahi: PowerShell Runspaces

Ko te mea tuatahi ka puta ki te hinengaro mo tenei tuhinga ko te mahi i te kapiti kaore i te raupapa, engari i roto i nga miro whakarara, kohia nga raraunga katoa ki te mea kotahi ka tātari. 

Engari he raru: Kaore a PowerCLI e tuku kia whakatuwherahia e maatau nga huihuinga motuhake ki te vCenter ka tukuna he hapa rorirori:

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.

Hei whakaoti i tenei, me tuku tuatahi koe i nga korero mo te waahi ki roto i te awa. Kia maumahara tatou kei te mahi a PowerShell me nga mea ka taea te tuku hei tawhā ki tetahi mahi, ki tetahi ScriptBlock ranei. Tukua te waahi ki te ahua o taua ahanoa, ma te whakawhiti i te $global:DefaultVIServers (Hono-VIServer me te kī -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 $_
           }
       }
   }

Inaianei me whakatinana te miro maha ma roto i nga Runspace Pools.  

Ko te algorithm e whai ake nei:

  1. Ka whiwhi matou i te rarangi o nga VM katoa.
  2. I roto i nga awa whakarara ka whiwhi tatou cloud.uuid.
  3. Ka kohia e matou nga raraunga mai i nga awa ki tetahi mea.
  4. Ka tātarihia e matou te ahanoa ma te whakarōpū ma te uara o te mara CloudUUID: ko nga mea he nui ake te maha o nga uara ahurei i te 1 ko nga VM e rapu ana matou.

Ko te mutunga, ka whiwhi tatou i te tuhinga:


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
}

Ko te ataahua o tenei tuhinga ka taea te whakamahi i etahi atu keehi penei ma te whakakapi noa i te ScriptBlock me nga tawhā ka tukuna ki te awa. Whakamahia!

Ine tatou i te wa:

Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI

55 hēkona. He pai ake, engari ka tere ake. 

Me neke ki te tere tuarua: GetView

Kia kite tatou he aha te he.
Ko te mea tuatahi, he roa te mahi a te Get-VM cmdlet.
Tuarua, ko te cmdlet Get-AdvancedOptions he roa ake te whakaoti.
Me mahi tuatahi ki te tuarua. 

He watea a Get-AdvancedOptions mo nga taonga VM takitahi, engari he tino poauau ina mahi ana me nga taonga maha. Ka taea e tatou te tiki i nga korero ano mai i te ahanoa miihini mariko tonu (Get-VM). He pai te nehu ki roto i te ahanoa ExtensionData. Ka mau ki te tātari, ka tere taatau ki te tiki i nga raraunga e tika ana.

Ma te paku neke o te ringa ko tenei:


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

Ka huri ki tenei:


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

He rite tonu te putanga ki te Get-AdvancedOptions, engari he maha nga wa tere ake. 

Inaianei ki te Tiki-VM. Ehara i te tere na te mea e pa ana ki nga mea uaua. Ka puta ake he patai arorau: he aha tatou e hiahia ai ki etahi atu korero me tetahi PSObject nui i tenei keehi, ina hiahia noa tatou ki te ingoa o te VM, tona ahuatanga me te uara o tetahi huanga uaua?  

I tua atu, ko te arai i te ahua o Get-AdvancedOptions kua tangohia mai i te tuhinga. Ko te whakamahi i nga Runspace Pools inaianei he ahua nui rawa atu na te mea kua kore he hiahia ki te whakarara i tetahi mahi puhoi puta noa i nga miro squat ka tukuna he waahi. He pai te taputapu, engari kaore mo tenei keehi. 

Me titiro ki te putanga o ExtensionData: he ahanoa Tiro-Tirohia. 

Me karanga tatou ki te tikanga tawhito o nga rangatira PowerShell: kotahi raina ma te whakamahi i nga whiriwhiringa, te tohatoha me te whakarōpū. Ko nga mea whakamataku katoa o mua ka taka ki roto i te raina kotahi ka mahia i roto i te waahi kotahi:


$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

Ine tatou i te wa:

Me pehea te hanga i te toka toka mo nga tuhinga PowerCLI

9 hēkona mo te tata ki te 10k nga taonga me te tātari ma te ahua e hiahiatia ana. Rawe!

Engari o te mutunga

Ko te hua e tika ana ka whakawhirinaki ki te whiringa taputapu. He uaua tonu te kii he aha nga mea e tika ana kia kowhiria hei whakatutuki. Ko ia o nga tikanga kua whakarārangihia mo te tere ake i nga tuhinga he pai i roto i nga rohe o tona whakamahinga. Kei te tumanako ahau ka awhina tenei tuhinga ki a koe i roto i nga mahi uaua ki te mohio ki nga kaupapa o te mahi aunoatanga me te arotautanga i roto i to hanganga.

PS: Ka mihi te kaituhi ki nga mema o te hapori mo to raatau awhina me te tautoko ki te whakarite i te tuhinga. Ahakoa te hunga whai maihao. A tae noa ki te hunga karekau he waewae, he rite ki te kaipahua.

Source: will.com

Tāpiri i te kōrero