ለPowerCLI ስክሪፕቶች የሮኬት መጨመሪያ እንዴት እንደሚገነባ 

ፈጥኖም ይሁን ዘግይቶ ማንኛውም የVMware ስርዓት አስተዳዳሪ መደበኛ ስራዎችን ወደ አውቶማቲክ ይመጣል። ሁሉም የሚጀምረው በትእዛዝ መስመር ነው፣ ከዚያ PowerShell ወይም VMware PowerCLI ይመጣል።

ISE ን ከማሄድ እና መደበኛ cmdlets ከሞጁሎች በ"በአንዳንድ አስማት" ከሚሰሩ ሞጁሎች ከመጠቀም ትንሽ ራቅ ብለህ PowerShellን ተማርክ እንበል። በመቶዎች የሚቆጠሩ ቨርቹዋል ማሽኖችን መቁጠር ሲጀምሩ በትንሽ መጠን የረዱት ስክሪፕቶች በትልቁ ላይ ቀስ ብለው እንደሚሮጡ ታገኛላችሁ። 

በዚህ ሁኔታ 2 መሳሪያዎች ይረዳሉ-

  • PowerShell Runspaces - በተለየ ክሮች ውስጥ የሂደቶችን አፈፃፀም ለማዛመድ የሚያስችል አቀራረብ; 
  • እይታ - የPowerCLI መሰረታዊ ተግባር፣ በዊንዶውስ ውስጥ የ Get-WMIObject አናሎግ። ይህ cmdlet ተዛማጅ ነገሮችን አይጎትትም፣ ነገር ግን መረጃውን የሚያገኘው በቀላል ነገር መልክ በቀላል የመረጃ አይነቶች ነው። በብዙ አጋጣሚዎች በፍጥነት ይወጣል.

በመቀጠል, ስለ እያንዳንዱ መሳሪያ በአጭሩ እናገራለሁ እና የአጠቃቀም ምሳሌዎችን አሳይ. የተወሰኑ ስክሪፕቶችን እንመርምር እና አንዱ መቼ የተሻለ እንደሚሰራ፣ ሁለተኛው መቼ እንደሆነ እንይ። ሂድ!

ለPowerCLI ስክሪፕቶች የሮኬት መጨመሪያ እንዴት እንደሚገነባ

የመጀመሪያ ደረጃ፡ Runspace

ስለዚህ Runspace ከዋናው ሞጁል ውጭ ለሆኑ ተግባራት በትይዩ ሂደት የተነደፈ ነው። እርግጥ ነው፣ አንዳንድ ሚሞሪ፣ ፕሮሰሰር ወዘተ የሚበላ ሌላ ሂደት መጀመር ትችላለህ። ስክሪፕትህ በሁለት ደቂቃ ውስጥ ቢሰራ እና ጊጋባይት ማህደረ ትውስታን ካጠፋ ምናልባት Runspace ላያስፈልግህ ይችላል። ግን ለአስር ሺዎች ለሚቆጠሩ ነገሮች ስክሪፕቶች ያስፈልጋል።

ከዚህ መማር መጀመር ትችላለህ፡- 
የPowerShell Runspaces አጠቃቀም መጀመሪያ፡ ክፍል 1

የ Runspace አጠቃቀም ምን ይሰጣል:

  • ሊተገበሩ የሚችሉ ትዕዛዞችን ዝርዝር በመገደብ ፍጥነት ፣
  • ትይዩ ተግባራትን ማከናወን ፣
  • ደህንነት

Runspace የሚረዳበት ከበይነመረቡ ምሳሌ ይኸውና፡

“የማከማቻ ሙግት በvSphere ውስጥ ለመከታተል በጣም ከባድ ከሆኑት መለኪያዎች ውስጥ አንዱ ነው። በvCenter ውስጥ፣ የትኛው ቪኤም ተጨማሪ የማከማቻ ግብዓቶችን እንደሚበላ ብቻ ሄዶ ማየት አይችሉም። እንደ እድል ሆኖ፣ ይህን ውሂብ በPowerShell በደቂቃዎች ውስጥ መሰብሰብ ይችላሉ።
የቪኤምዌር ሲስተም አስተዳዳሪዎች መላውን vCenter በፍጥነት እንዲፈልጉ እና በአማካይ ፍጆታቸው ላይ ያለውን መረጃ የያዘ የVM ዝርዝር እንዲያገኙ የሚያስችል ስክሪፕት አጋራለሁ።  
ስክሪፕቱ እያንዳንዱ የESXi አስተናጋጅ የራሱን ቪኤምኤስ ፍጆታ በተለየ Runspace ውስጥ እንዲሰበስብ እና ወዲያውኑ መጠናቀቁን እንዲገልጽ የPowerShell runspaces ይጠቀማል። ይህ PowerShell በአስተናጋጆች በኩል ከመድገም እና እያንዳንዱ ጥያቄውን እንዲያጠናቅቅ ከመጠበቅ ይልቅ ወዲያውኑ ስራዎችን እንዲዘጋ ያስችለዋል።

ምንጭ: በ ESXi ዳሽቦርድ ላይ ምናባዊ ማሽን I/Oን እንዴት ማሳየት እንደሚቻል

ከዚህ በታች ባለው ሁኔታ Runspace ከንግድ ውጪ ነው፡

"ከቪኤም ብዙ መረጃዎችን የሚሰበስብ እና አስፈላጊ ከሆነ አዲስ መረጃ የሚጽፍ ስክሪፕት ለመጻፍ እየሞከርኩ ነው። ችግሩ በጣም ብዙ ቪኤምዎች መኖራቸው ነው፣ እና ለአንድ ማሽን ከ5-8 ሰከንድ ይወስዳል። 

ምንጭ: Multithreading PowerCLI ከ RunspacePool ጋር

Get-View እዚህ ያስፈልጋል፣ ወደ እሱ እንሂድ። 

ሁለተኛ ደረጃ፡-Get-View

Get-View እንዴት ጠቃሚ እንደሆነ ለመረዳት cmdlets በአጠቃላይ እንዴት እንደሚሠሩ ማስታወስ ጠቃሚ ነው. 

የኤፒአይ ማጣቀሻዎችን ሳያጠና እና የሚቀጥለውን ጎማ እንደገና ለመፍጠር ሳያስፈልግ መረጃ ለማግኘት Cmdlets ያስፈልጋሉ። በድሮው ዘመን መቶ ወይም ሁለት የኮድ መስመሮች ውስጥ የተጻፈው ነገር, PowerShell በአንድ ትዕዛዝ እንዲያደርጉ ይፈቅድልዎታል. ለዚህ ምቾት በፍጥነት እንከፍላለን. እራሳቸው cmdlets ውስጥ ምንም አስማት የለም: ተመሳሳይ ስክሪፕት, ነገር ግን ዝቅተኛ ደረጃ, ፀሐያማ ሕንድ በመጣ ጌታው ችሎታ ያላቸው እጆች የተጻፈው.

አሁን ከ Get-View ጋር ለማነፃፀር፣ Get-VM cmdlet እንውሰድ፡ ወደ ቨርቹዋል ማሽኑ ይደርሳል እና የተቀናበረ ነገርን ይመልሳል ማለትም ሌሎች ተያያዥ ነገሮችን ከእሱ ጋር ያያይዘዋል፡ VMHost፣ Datastore፣ ወዘተ።  

Get-View በእሱ ቦታ ምንም ተጨማሪ ነገር በተመለሰው ነገር ላይ አይጨናነቅም። ከዚህም በላይ የምንፈልገውን መረጃ ሃርድ ኮድ እንድታደርጉ ይፈቅድልሃል፣ ይህም አንድን ነገር ለማውጣት ቀላል ያደርገዋል። በአጠቃላይ በዊንዶውስ አገልጋይ እና በሃይፐር-ቪ ውስጥ Get-WMIObject cmdlet ቀጥተኛ አናሎግ ነው - ሀሳቡ ፍጹም ተመሳሳይ ነው.

Get-View በነጥብ ነገሮች ላይ በተለመዱት እንቅስቃሴዎች ውስጥ ምቹ አይደለም። ነገር ግን በሺህ እና በአስር ሺዎች የሚቆጠሩ እቃዎች ሲመጣ ዋጋ የለውም.

በVMware ብሎግ ላይ የበለጠ ያንብቡ፡- የ Get-View መግቢያ

አሁን ሁሉንም ነገር በእውነተኛ ጉዳይ ላይ አሳይሻለሁ. 

ቪኤም ለማውረድ ስክሪፕት በመጻፍ ላይ

አንድ ቀን የሥራ ባልደረባዬ ስክሪፕቱን እንዳሻሽል ጠየቀኝ። ስራው የተለመደው የዕለት ተዕለት ተግባር ነው፡ ሁሉንም ቪኤምዎች በተባዛ የCloud.uuid መለኪያ ያግኙ (አዎ፣ ይህ በvCloud ዳይሬክተር ውስጥ ቪኤም ሲዘጉ ነው)። 

ወደ አእምሯችን የሚመጣው ግልጽ መፍትሔ፡-

  1. ሁሉንም ቪኤምዎች ዝርዝር ያግኙ።
  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 ስክሪፕቶች የሮኬት መጨመሪያ እንዴት እንደሚገነባ

2 ደቂቃ ከ47 ሰከንድ ወደ 10k የሚጠጉ ቪኤምዎችን በማስኬድ ላይ እያለ። ጉርሻው የማጣሪያዎች እጥረት እና ውጤቱን በእጅ የመደርደር አስፈላጊነት ነው. ስክሪፕቱ ማመቻቸት እንደሚያስፈልገው ግልጽ ነው።

በአንድ ጊዜ የአስተናጋጅ መለኪያዎችን ከvCenter ማግኘት ሲፈልጉ ወይም በአስር ሺዎች የሚቆጠሩ ነገሮችን ማካሄድ ሲፈልጉ ለማዳን Runspaces የመጀመሪያው ናቸው። ይህ አቀራረብ ምን እንደሚሰጥ እንመልከት.

የመጀመሪያውን ፍጥነት በማብራት ላይ፡ 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.

እሱን ለመፍታት በመጀመሪያ በክር ውስጥ ስላለው ክፍለ ጊዜ መረጃ ማስተላለፍ አለብን። ፓወር ሼል እንደ መለኪያ ወደ ተግባር እንኳን ወደ ስክሪፕት ብሎክ ሊተላለፉ ከሚችሉ ነገሮች ጋር እንደሚሰራ እናስታውሳለን። $global:DefaultVIServers (የማገናኘት-VIServer ከ -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 $_
           }
       }
   }

አሁን በ Runspace ገንዳዎች በኩል ባለብዙ-ክር ንባብን እንተገብራለን።  

ስልተ ቀመር እንደሚከተለው ነው

  1. የሁሉም ቪኤምዎች ዝርዝር እናገኛለን።
  2. በትይዩ ዥረቶች ውስጥ, cloud.uuid እናገኛለን.
  3. መረጃን ከጅረቶች ወደ አንድ ነገር እንሰበስባለን.
  4. እቃውን በ CloudUUID መስክ ዋጋ በቡድን እናጣራለን-የልዩ እሴቶች ብዛት ከ 1 በላይ የሆኑ የሚፈለጉት ቪኤምዎች ናቸው።

በውጤቱም, ስክሪፕቱን እናገኛለን:


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 በግለሰብ ቪኤም ነገሮች ላይ ምቹ ነው፣ ነገር ግን ከብዙ ነገሮች ጋር ሲገናኝ በጣም ጎበዝ ነው። ከቨርቹዋል ማሽን ነገር (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 ጋር ተመሳሳይ ነው፣ ግን በጣም ፈጣን ነው። 

አሁን ወደ Get-VM። ውስብስብ ነገሮችን ስለሚይዝ ፈጣን አይደለም. ምክንያታዊ ጥያቄ የሚነሳው-የቪኤም ስም ፣ የግዛቱ እና የተንኮል ባህሪው ዋጋ ስንፈልግ በዚህ ጉዳይ ላይ ለምን ተጨማሪ መረጃ እና አስፈሪ PSObject ያስፈልገናል?  

በተጨማሪም በ Get-AdvancedOptions ፊት ያለው ብሬክ ከስክሪፕቱ ጠፍቷል። በክፍለ-ጊዜ ማስተላለፊያ ስኩዊቶች ውስጥ ቀርፋፋ ተግባርን ማመሳሰል ስለሌለ የ Runspace ገንዳዎችን መጠቀም አሁን ከመጠን በላይ የበዛ ይመስላል። መሣሪያው ጥሩ ነው, ግን ለዚህ ጉዳይ አይደለም. 

የ ExtensionData ውፅዓትን እንመለከታለን፡ ይህ ከ Get-View ነገር ያለፈ ነገር አይደለም። 

የ 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: ጸሃፊው ጽሑፉን በማዘጋጀት ረገድ ላደረጉት እገዛ እና ድጋፍ ሁሉንም የኮምዩን አባላት አመሰግናለሁ። መዳፍ ያላቸው እንኳን። እና መዳፍ የሌላቸው እንኳን እንደ ቦአ ኮንስትራክተር።

ምንጭ: hab.com

አስተያየት ያክሉ