د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی 

ژر یا وروسته، د VMware سیسټم هر مدیر د معمول کارونو اتومات کولو لپاره راځي. دا ټول د کمانډ لاین سره پیل کیږي، بیا د PowerShell یا VMware PowerCLI راځي.

راځئ چې ووایو تاسو د ISE په لاره اچولو او د ماډلونو څخه د معیاري cmdlets کارولو څخه لږ څه نور په PowerShell کې مهارت ترلاسه کړی چې د "یو ډول جادو" له امله کار کوي. کله چې تاسو په سلګونو کې د مجازی ماشینونو شمیرل پیل کړئ، تاسو به ومومئ چې هغه سکریپټونه چې په کوچنۍ پیمانه کې مرسته کوي په لویه پیمانه د پام وړ ورو پرمخ ځي. 

په دې حالت کې، دوه وسیلې به مرسته وکړي:

  • PowerShell Runspaces - یوه تګلاره چې تاسو ته اجازه درکوي په جلا تارونو کې د پروسو اجرا کول موازي کړئ؛ 
  • ترلاسه کول - د پاورCLI بنسټیز فعالیت، په وینډوز کې د Get-WMIObject یو انلاګ. دا cmdlet د اجناسو سره یوځای توکي نه راوباسي، مګر د ساده معلوماتو ډولونو سره د ساده څیز په بڼه معلومات ترلاسه کوي. په ډیرو مواردو کې، دا په چټکۍ سره راځي.

بل، زه به په لنډه توګه د هرې وسیلې په اړه وغږیږم او د کارولو مثالونه به وښیم. راځئ چې ځانګړي سکریپټونه تحلیل کړو او وګورو چې کله یو له بل څخه ښه کار کوي. لاړ شه!

د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی

لومړی پړاو: Runspace

نو، Runspace د اصلي ماډل څخه بهر د دندو موازي پروسس کولو لپاره ډیزاین شوی. البته، تاسو کولی شئ بله پروسه پیل کړئ چې یو څه حافظه، پروسیسر، او نور به وخوري. که ستاسو سکریپټ په څو دقیقو کې چلیږي او یو ګیګابایټ حافظه مصرف کړي، ډیری احتمال به تاسو Runspace ته اړتیا ونلري. مګر د لسګونو زرو شیانو لپاره سکریپټونو ته اړتیا ده.

تاسو کولی شئ دلته زده کړه پیل کړئ: 
د PowerShell Runspaces کارولو پیل: برخه 1

د Runspace کارول څه ورکوي:

  • د اجرا شوي امرونو لیست محدودولو سره سرعت،
  • د دندو موازي اجرا کول
  • خوندیتوب

دلته د انټرنیټ څخه یو مثال دی کله چې Runspace مرسته کوي:

"د ذخیره کولو شخړه په vSphere کې د تعقیب لپاره یو له خورا سخت میټریکونو څخه دی. د vCenter دننه، تاسو نشئ کولی یوازې لاړ شئ او وګورئ چې کوم VM د ذخیره کولو ډیرې سرچینې مصرفوي. خوشبختانه، تاسو کولی شئ دا ډاټا په څو دقیقو کې راټول کړئ د PowerShell څخه مننه.
زه به یو سکریپټ شریک کړم چې د VMware سیسټم مدیرانو ته به اجازه ورکړي چې په چټکۍ سره د vCenter په اوږدو کې لټون وکړي او د VMs لیست د دوی اوسط مصرف کې ډیټا ترلاسه کړي.  
سکریپټ د PowerShell منډو ځایونه کاروي ترڅو هر ESXi کوربه ته اجازه ورکړي چې د خپل VMs څخه په جلا Runspace کې د مصرف معلومات راټول کړي او سمدلاسه بشپړیدو راپور ورکړي. دا پاور شیل ته اجازه ورکوي چې سمدستي دندې وتړي، د دې پر ځای چې د کوربه له لارې تکرار شي او هر یو ته د خپلې غوښتنې بشپړولو انتظار وکړي.

سرچینه: په ESXi ډشبورډ کې د مجازی ماشین I/O ښودلو څرنګوالی

په لاندې حالت کې، Runspace نور ګټور نه دی:

"زه هڅه کوم چې یو سکریپټ ولیکم چې د VM څخه ډیری ډیټا راټولوي او د اړتیا په وخت کې نوي معلومات لیکي. ستونزه دا ده چې ډیری VMs شتون لري، او په یوه ماشین کې 5-8 ثانیې مصرف کیږي. 

سرچینه: د RunspacePool سره Multithreading PowerCLI

دلته به تاسو ته اړتیا ولرئ Get-View، راځئ چې هغې ته لاړ شو. 

دوهم پړاو: لید لید

د دې لپاره چې پوه شي چې ولې ګیټ ویو ګټور دی، دا د یادولو وړ ده چې څنګه cmdlets په عمومي توګه کار کوي. 

Cmdlets ته اړتیا ده چې په اسانۍ سره د معلوماتو ترلاسه کولو لپاره پرته له دې چې د API حوالې کتابونه مطالعه کړي او راتلونکی څرخ بیا ایجاد کړي. هغه څه چې په پخوانیو ورځو کې د کوډ سل یا دوه لینونه اخیستي، پاور شیل تاسو ته اجازه درکوي د یوې کمانډ سره ترسره کړئ. موږ د دې اسانتیا لپاره په سرعت سره پیسې ورکوو. پخپله د cmdlets دننه هیڅ جادو شتون نلري: ورته سکریپټ، مګر په ټیټه کچه، د لمر هند څخه د ماسټر د مهارت لرونکو لاسونو لخوا لیکل شوی.

اوس، د Get-View سره پرتله کولو لپاره، راځئ چې د Get-VM cmdlet واخلو: دا مجازی ماشین ته لاسرسی لري او یو جامع څیز بیرته راګرځوي، دا دا دی چې دا نور اړوند توکي ورسره نښلوي: VMHost، Datastore، او نور.  

Get-View په خپل ځای کې بیرته راستانه شوي اعتراض ته غیر ضروري څه نه اضافه کوي. سربیره پردې ، دا موږ ته اجازه راکوي په کلکه مشخص کړو چې کوم معلومات ته اړتیا لرو ، کوم چې به د محصول محصول اسانه کړي. په عمومي توګه په وینډوز سرور کې او په ځانګړي توګه په هایپر-V کې، د Get-WMIObject cmdlet یو مستقیم انلاګ دی - نظر بالکل ورته دی.

Get-View په نقطه شیانو کې د معمول عملیاتو لپاره ناشونی دی. مګر کله چې دا په زرګونو او لسګونو زرو شیانو ته راځي، دا هیڅ قیمت نلري.

تاسو کولی شئ په VMware بلاګ کې نور ولولئ: د Get-View پیژندنه

اوس زه به تاسو ته د ریښتیني قضیې په کارولو سره هرڅه وښیم. 

د VM خلاصولو لپاره سکریپټ لیکل

یوه ورځ زما همکار له ما څخه وغوښتل چې د هغه سکریپټ اصلاح کړم. دنده یو عام معمول دی: ټول VMs د نقل کلاوډ.uuid پیرامیټر سره ومومئ (هو ، دا ممکنه ده کله چې په vCloud ډایرکټر کې VM کلون کړئ). 

واضح حل چې ذهن ته راځي دا دي:

  1. د ټولو VMs لیست ترلاسه کړئ.
  2. لیست په یو ډول تحلیل کړئ.

اصلي نسخه دا ساده سکریپټ وه:

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

هرڅه خورا ساده او روښانه دي. دا د کافي وقفې سره په څو دقیقو کې لیکل کیدی شي. په فلټر کولو باندې پیچ کړئ او دا ترسره شوی.

مګر راځئ چې وخت اندازه کړو:

د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی

د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی

۳ دقیقې ۷ ثانیې کله چې نږدې 10k VMs پروسس کوي. بونس د فلټرونو نشتوالی او په لاسي ډول د پایلو ترتیب کولو اړتیا ده. په ښکاره ډول، سکریپټ اصلاح ته اړتیا لري.

Runspaces لومړی هغه دی چې ژغورنې ته راځي کله چې تاسو اړتیا لرئ په ورته وخت کې د vCenter څخه کوربه میټریک ترلاسه کړئ یا د لسګونو زره توکو پروسس کولو ته اړتیا ولرئ. راځئ وګورو چې دا طریقه څه راوړي.

لومړی سرعت فعال کړئ: PowerShell Runspaces

لومړی شی چې د دې سکریپټ لپاره ذهن ته راځي د لوپ اجرا کول دي نه په ترتیب سره ، مګر په موازي تارونو کې ، ټول معلومات په یوه څیز کې راټول کړئ او فلټر یې کړئ. 

مګر یوه ستونزه شتون لري: PowerCLI به موږ ته اجازه ورنکړي چې vCenter ته ډیری خپلواکې ناستې خلاصې کړو او یوه مسخره تېروتنه به وغورځوو:

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.

د دې حل کولو لپاره ، تاسو باید لومړی د جریان دننه د ناستې معلومات تیر کړئ. راځئ چې په یاد ولرو چې PowerShell د شیانو سره کار کوي چې د پیرامیټر په توګه یا یو فنکشن یا سکریپټ بلاک ته لیږدول کیدی شي. راځئ چې غونډه د داسې څیز په بڼه تیر کړو، د $global:DefaultVIServers (د -NotDefault کیلي سره نښلول-VIServer) له پاسه:

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

اوس راځئ چې د Runspace Pools له لارې ملټي ریډینګ پلي کړو.  

الګوریتم په لاندې ډول دی:

  1. موږ د ټولو VMs لیست ترلاسه کوو.
  2. په موازي جریانونو کې موږ cloud.uuid ترلاسه کوو.
  3. موږ د جریانونو څخه په یوه څیز کې معلومات راټولوو.
  4. موږ اعتراض د CloudUUID ساحې د ارزښت په واسطه ګروپ کولو سره فلټر کوو: هغه چیرې چې د ځانګړي ارزښتونو شمیر له 1 څخه ډیر وي هغه VMs دي چې موږ یې په لټه کې یو.

د پایلې په توګه، موږ سکریپټ ترلاسه کوو:


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
}

د دې سکریپټ ښکلا دا ده چې دا په نورو ورته قضیو کې په ساده ډول د سکریپټ بلاک او هغه پیرامیټونو بدلولو سره کارول کیدی شي چې جریان ته به لیږدول کیږي. ګټه پورته کړئ!

موږ وخت اندازه کوو:

د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی

55 ثانیې. دا غوره ده، مګر دا لاهم ګړندی کیدی شي. 

راځئ چې دویم سرعت ته لاړ شو: GetView

راځئ چې معلومه کړو چې څه غلط دي.
لومړی او تر ټولو مهم، د Get-VM cmdlet اجرا کولو لپاره ډیر وخت نیسي.
دوهم، د Get-AdvancedOptions cmdlet بشپړولو لپاره حتی ډیر وخت نیسي.
راځئ چې لومړی د دویم سره معامله وکړو. 

Get-AdvancedOptions د انفرادي VM شیانو لپاره مناسب دی، مګر ډیر بې نظمه کله چې د ډیری شیانو سره کار کوي. موږ کولی شو ورته معلومات پخپله د مجازی ماشین څیز (Get-VM) څخه ترلاسه کړو. دا یوازې د ExtensionData څیز کې ښه ښخ شوی. د فلټر کولو سره مسلح، موږ د اړینو معلوماتو ترلاسه کولو پروسه ګړندۍ کوو.

د لاس د لږ حرکت سره دا دی:


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

په دې بدلیږي:


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

محصول د Get-AdvancedOptions په څیر دی، مګر دا څو ځله ګړندی کار کوي. 

اوس ترلاسه کړئ-VM ته. دا چټک ندی ځکه چې دا د پیچلو شیانو سره معامله کوي. یوه منطقي پوښتنه راپورته کیږي: موږ ولې پدې قضیه کې اضافي معلوماتو او یو شیطاني PSObject ته اړتیا لرو ، کله چې موږ یوازې د VM نوم ، د هغې حالت او د یو پیچلي صفت ارزښت ته اړتیا لرو؟  

برسېره پردې، د Get-AdvancedOptions په بڼه کې خنډ د سکریپټ څخه لیرې شوی. د رن اسپیس حوضونو کارول اوس د ډیر کیل په څیر بریښي ځکه چې نور اړتیا نشته چې د سیشن د سپارلو په وخت کې د سکواټ تارونو په اوږدو کې یو ورو کار موازي کولو ته اړتیا ولري. وسیله ښه ده، مګر د دې قضیې لپاره نه. 

راځئ چې د ExtensionData محصول وګورو: دا د ګیټ لید څیز څخه نور څه ندي. 

راځئ چې د PowerShell ماسټرانو لرغوني تخنیک ته زنګ ووهو: د فلټرونو په کارولو سره یو کرښه، ترتیب کول او ګروپ کول. ټول پخوانی وحشت په ښه توګه په یوه لیکه کې سقوط شوی او په یوه ناسته کې اعدام شوی:


$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

موږ وخت اندازه کوو:

د PowerCLI سکریپټونو لپاره د راکټ بوسټر جوړولو څرنګوالی

د 9 ثانوي د مطلوب حالت لخوا د فلټر کولو سره نږدې 10k شیانو لپاره. غوره!

پر ځای د يو پایلې

د منلو وړ پایله په مستقیم ډول د وسیلې په انتخاب پورې اړه لري. دا اکثرا ستونزمن وي چې د ډاډ لپاره ووایو چې د دې ترلاسه کولو لپاره باید څه شی غوره شي. د سکریپټونو ګړندي کولو لپاره هر یو لیست شوي میتودونه د هغې د پلي کیدو حدونو کې ښه دي. زه امید لرم چې دا مقاله به تاسو سره ستاسو په زیربنا کې د پروسې اتومات کولو او اصلاح کولو اساساتو پوهیدو کې ستاسو سره مرسته وکړي.

PS: لیکوال د ټولنې له ټولو غړو مننه کوي چې د مقالې په چمتو کولو کې د دوی د مرستې او ملاتړ لپاره. حتی هغه څوک چې پښې لري. او حتی هغه څوک چې پښې نلري، لکه د بوا کنسرټر.

سرچینه: www.habr.com

Add a comment