Yadda ake gina roka don rubutun PowerCLI 

Ba dade ko ba jima, kowane mai sarrafa tsarin VMware ya zo don sarrafa ayyukan yau da kullun. Duk yana farawa da layin umarni, sannan ya zo PowerShell ko VMware PowerCLI.

Bari mu ce kun ƙware PowerShell kaɗan fiye da ƙaddamar da ISE da yin amfani da daidaitattun cmdlets daga kayayyaki waɗanda ke aiki saboda “wani irin sihiri”. Lokacin da ka fara ƙidayar injunan kama-da-wane a cikin ɗaruruwa, za ku ga cewa rubutun da ke taimakawa kan ƙaramin sikelin suna tafiya a hankali a hankali akan babban sikeli. 

A wannan yanayin, 2 kayan aikin zasu taimaka:

  • PowerShell Runspaces - hanyar da ke ba ku damar daidaita aiwatar da matakai a cikin zaren daban-daban; 
  • Samun-Duba - ainihin aikin PowerCLI, analog na Get-WMIObject a cikin Windows. Wannan cmdlet baya jan abubuwan da ke tare da mahaɗan, amma yana karɓar bayanai ta hanyar abu mai sauƙi tare da nau'ikan bayanai masu sauƙi. A yawancin lokuta yana fitowa da sauri.

Na gaba, zan ɗan yi magana game da kowane kayan aiki kuma in nuna misalai na amfani. Bari mu bincika takamaiman rubutun mu ga lokacin da ɗaya yayi aiki fiye da ɗayan. Tafi!

Yadda ake gina roka don rubutun PowerCLI

Mataki na farko: Runspace

Don haka, an ƙirƙira Runspace don daidaita ayyukan ayyuka a waje da babban tsarin. Tabbas, zaku iya ƙaddamar da wani tsari wanda zai cinye wasu ƙwaƙwalwar ajiya, processor, da sauransu. Idan rubutunku ya gudana cikin 'yan mintuna kaɗan kuma yana cinye gigabyte na ƙwaƙwalwar ajiya, wataƙila ba za ku buƙaci Runspace ba. Amma ga rubutun ga dubun dubatar abubuwa ana buƙata.

Za ku iya fara koyo a nan: 
Fara Amfani da PowerShell Runspaces: Sashe na 1

Abin da ke ba da amfani da Runspace:

  • gudun ta hanyar iyakance jerin umarni da aka aiwatar,
  • a layi daya aiwatar da ayyuka,
  • aminci.

Ga misali daga Intanet lokacin da Runspace ke taimakawa:

"Ci gaba da adanawa yana ɗaya daga cikin ma'auni mafi wahala don bin diddigin vSphere. A cikin vCenter, ba za ku iya kawai je ku ga wane VM ke cin ƙarin albarkatun ajiya ba. Sa'ar al'amarin shine, zaku iya tattara wannan bayanan cikin mintuna godiya ga PowerShell.
Zan raba rubutun da zai ba masu kula da tsarin VMware damar bincika cikin sauri a cikin vCenter kuma su karɓi jerin VM tare da bayanai akan matsakaicin yawan amfanin su.  
Rubutun yana amfani da wuraren gudu na PowerShell don bawa kowane mai masaukin ESXi damar tattara bayanan amfani daga nasa VMs a cikin wani Runspace daban kuma nan da nan ya ba da rahoton kammalawa. Wannan yana ba da damar PowerShell don rufe ayyuka nan da nan, maimakon maimaitawa ta hanyar runduna da jira kowane ɗayan ya kammala buƙatarsa. "

source: Yadda ake Nuna Injin Virtual I/O akan Dashboard na ESXi

A cikin yanayin da ke ƙasa, Runspace ba ta da amfani:

"Ina ƙoƙarin rubuta rubutun da ke tattara bayanai da yawa daga VM kuma ya rubuta sababbin bayanai idan ya cancanta. Matsalar ita ce akwai VM da yawa, kuma ana kashe daƙiƙa 5-8 akan na'ura ɗaya. 

source: Multithreading PowerCLI tare da RunspacePool

Anan zaka buƙaci Get-View, mu ci gaba zuwa gare ta. 

Mataki na biyu: Get-View

Don fahimtar dalilin da yasa Get-View ke da amfani, yana da kyau a tuna yadda cmdlets ke aiki gabaɗaya. 

Ana buƙatar Cmdlets don dacewa da samun bayanai ba tare da buƙatar nazarin littattafan tunani na API ba da sake ƙirƙira dabaran na gaba. Abin da a zamanin da ya ɗauki layin lamba ɗari ko biyu, PowerShell yana ba ku damar yin umarni ɗaya. Muna biyan wannan dacewa tare da sauri. Babu wani sihiri a cikin cmdlets da kansu: rubutun iri ɗaya, amma a ƙaramin matakin, waɗanda ƙwararrun ƙwararrun masters daga Indiya sun rubuta.

Yanzu, don kwatantawa da Get-View, bari mu ɗauki Get-VM cmdlet: yana shiga injin kama-da-wane kuma ya dawo da wani abu mai haɗe, wato, yana haɗa wasu abubuwa masu alaƙa da shi: VMHost, Datastore, da sauransu.  

Get-View a wurinsa baya ƙara wani abu mara amfani ga abin da aka dawo dashi. Bugu da ƙari, yana ba mu damar ƙayyade ainihin bayanan da muke buƙata, wanda zai sa abin da ake fitarwa ya fi sauƙi. A cikin Windows Server gabaɗaya kuma a cikin Hyper-V musamman, Get-WMIObject cmdlet analog ne kai tsaye - ra'ayin daidai yake.

Get-View ba shi da daɗi don ayyukan yau da kullun akan abubuwa masu nuni. Amma idan aka zo ga dubunnan dubunnan abubuwa, ba shi da farashi.

Kuna iya karanta ƙarin akan VMware blog: Gabatarwa zuwa Get-View

Yanzu zan nuna muku komai ta amfani da harka ta gaske. 

Rubuta rubutun don sauke VM

Wata rana abokin aikina ya nemi in inganta rubutunsa. Ayyukan na yau da kullun ne na yau da kullun: nemo duk VMs tare da kwafin sigar girgije.uuid (eh, wannan yana yiwuwa lokacin rufe VM a cikin vCloud Director). 

Mafita a fili da ke zuwa a zuciya ita ce:

  1. Samu jerin duk VMs.
  2. Yi lissafin ko ta yaya.

Sigar asali ita ce wannan rubutun mai sauƙi:

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

Komai yana da sauƙin gaske kuma bayyananne. Ana iya rubuta shi a cikin mintuna biyu tare da hutun kofi. Kulle kan tacewa kuma an gama.

Amma bari mu auna lokacin:

Yadda ake gina roka don rubutun PowerCLI

Yadda ake gina roka don rubutun PowerCLI

Minti 2 47 seconds lokacin sarrafa kusan VMs 10k. Kyautar ita ce rashin masu tacewa da kuma buƙatar tsara sakamakon da hannu. Babu shakka, rubutun yana buƙatar haɓakawa.

Runspaces sune farkon waɗanda zasu zo don ceto lokacin da kuke buƙatar samun ma'auni na runduna lokaci guda daga vCenter ko buƙatar sarrafa dubun dubatar abubuwa. Bari mu ga abin da wannan hanya ta kawo.

Kunna saurin farko: PowerShell Runspaces

Abu na farko da ke zuwa a zuciya ga wannan rubutun shine aiwatar da madauki ba a jere ba, amma a cikin layi daya, tattara duk bayanan cikin abu guda sannan a tace su. 

Amma akwai matsala: PowerCLI ba zai ƙyale mu mu buɗe yawancin zaman zaman kansu zuwa vCenter ba kuma zai jefa kuskure mai ban dariya:

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.

Don warware wannan, dole ne ka fara shigar da bayanan zaman cikin rafi. Mu tuna cewa PowerShell yana aiki da abubuwa waɗanda za a iya wuce su azaman siga ko dai zuwa aiki ko zuwa ScriptBlock. Bari mu wuce zaman ta hanyar irin wannan abu, ketare $global:DefaultVIServers (Haɗa-VIServer tare da maɓallin -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 $_
           }
       }
   }

Yanzu bari mu aiwatar da multithreading ta hanyar Runspace Pools.  

Algorithm shine kamar haka:

  1. Muna samun jerin duk VMs.
  2. A cikin layi daya rafukan muna samun cloud.uuid.
  3. Muna tattara bayanai daga rafuffuka zuwa abu ɗaya.
  4. Muna tace abu ta hanyar haɗa shi ta hanyar ƙimar filin CloudUUID: waɗanda adadin keɓaɓɓen ƙimar ya fi 1 su ne VMs da muke nema.

A sakamakon haka, muna samun rubutun:


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
}

Kyakkyawan wannan rubutun shine ana iya amfani dashi a wasu lokuta masu kama da shi ta hanyar maye gurbin ScriptBlock kawai da sigogin da za a wuce zuwa rafi. Yi amfani da shi!

Muna auna lokaci:

Yadda ake gina roka don rubutun PowerCLI

55 seconds. Yana da kyau, amma har yanzu yana iya zama da sauri. 

Mu matsa zuwa gudu na biyu: GetView

Bari mu gano me ke faruwa.
Da farko dai, Get-VM cmdlet yana ɗaukar lokaci mai tsawo don aiwatarwa.
Na biyu, Get-AdvancedOptions cmdlet yana ɗaukar tsayin tsayi don kammalawa.
Bari mu fara magance na biyun. 

Get-AdvancedOptions ya dace da abubuwan VM guda ɗaya, amma sosai m lokacin aiki tare da abubuwa da yawa. Zamu iya samun bayanai iri ɗaya daga abin na'ura mai kama da ita (Get-VM). An binne shi da kyau a cikin abubuwan ExtensionData. Tare da yin tacewa, muna hanzarta aiwatar da hanyoyin samun bayanan da suka dace.

Tare da ɗan motsin hannu wannan shine:


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

Ya juya zuwa ga:


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

Fitowar iri ɗaya ce da Get-AdvancedOptions, amma yana aiki sau da yawa cikin sauri. 

Yanzu zuwa Get-VM. Ba shi da sauri saboda yana mu'amala da abubuwa masu rikitarwa. Tambaya mai ma'ana ta taso: me yasa muke buƙatar ƙarin bayani da babban PSObject a cikin wannan yanayin, lokacin da kawai muke buƙatar sunan VM, jiharsa da ƙimar sifa mai banƙyama?  

Bugu da ƙari, an cire cikas a cikin hanyar Get-AdvancedOptions daga rubutun. Amfani da Runspace Pools yanzu yana kama da kisa saboda babu buƙatar daidaita aikin jinkiri a cikin zaren squat lokacin ƙaddamar da zama. Kayan aiki yana da kyau, amma ba don wannan yanayin ba. 

Bari mu kalli fitar da ExtensionData: ba komai ba ne illa abu Get-View. 

Bari mu yi kira ga tsohuwar dabarar masanan PowerShell: layi ɗaya ta amfani da masu tacewa, rarrabawa da haɗawa. Duk abin tsoro da ya gabata an ruguje shi cikin ladabi cikin layi ɗaya kuma an aiwatar da shi cikin zama ɗaya:


$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

Muna auna lokaci:

Yadda ake gina roka don rubutun PowerCLI

Makonni na 9 don kusan abubuwa 10k tare da tacewa ta yanayin da ake so. Mai girma!

Maimakon a ƙarshe

Sakamakon karɓa kai tsaye ya dogara da zaɓin kayan aiki. Yawancin lokaci yana da wuya a faɗi ainihin abin da ya kamata a zaɓa don cimma shi. Kowace hanyoyin da aka jera don hanzarta rubutun suna da kyau a cikin iyakokin iyawar sa. Ina fatan wannan labarin zai taimaka muku a cikin aiki mai wahala na fahimtar tushen tsarin aiki da kai da ingantawa a cikin kayan aikin ku.

PS: Marubucin ya gode wa dukkan ’yan uwa saboda taimako da goyon bayansu wajen shirya labarin. Hatta masu hannu da shuni. Kuma ma wadanda ba su da kafafu, kamar magudanar ruwa.

source: www.habr.com

Add a comment