ProHoster > Blog > Pulega > Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI
Fa'afefea ona fausia se fa'aola roketi mo fa'amaumauga a le PowerCLI
Ise taimi mulimuli ane, soʻo se VMware system administrator e sau e faʻatometi galuega masani. E amata uma i le laina faʻatonu, ona sau ai lea o le PowerShell poʻo le VMware PowerCLI.
Fa'apea ua e iloa lelei le PowerShell nai lo le fa'alauiloaina o le ISE ma le fa'aogaina o cmdlets masani mai modules e aoga ona o "se ituaiga o togafiti". A amata ona e faitauina masini faakomepiuta i le fiaselau, o le a e iloa ai o tusitusiga e fesoasoani i se fua laʻititi e faʻasolosolo lemu i luga o se fua tele.
I lenei tulaga, 2 meafaigaluega o le a fesoasoani:
PowerShell Runspaces - se auala e mafai ai e oe ona faʻatusatusa le faʻatinoina o faʻagasologa i filo eseese;
Maua-Vaaiga - o se galuega faavae PowerCLI, o se faʻatusa o Get-WMIObject i Windows. O lenei cmdlet e le tosoina ni mea faʻatasi ma faʻalapotopotoga, ae maua faʻamatalaga i foliga o se mea faigofie ma faʻamatalaga faigofie. I le tele o tulaga e sau vave atu.
Le isi, o le a ou talanoa puupuu e uiga i meafaigaluega taʻitasi ma faʻaalia faʻataʻitaʻiga o le faʻaogaina. Se'i o tatou au'ili'ili fa'amatalaga patino ma va'ai pe a sili atu le lelei o le tasi nai lo le isi. Alu!
Laasaga muamua: Runspace
O lea la, Runspace ua mamanuina mo le faʻagasologa tutusa o galuega i fafo atu o le module autu. Ioe, e mafai ona e fa'alauiloa se isi fa'agasologa o le a 'ai ai sina manatua, fa'agaioiga, ma isi. Afai e alu lau fa'amaumauga i ni nai minute ma fa'aumatia le gigabyte o le manatua, e foliga mai e te le mana'omia le Runspace. Ae mo tusitusiga mo le fiasefulu afe o mea faitino e manaʻomia.
saoasaoa e ala i le faʻatapulaʻaina o le lisi o faʻatonuga faʻatinoina,
faiga tutusa o galuega,
saogalemu
O se faʻataʻitaʻiga mai le Initaneti pe a fesoasoani Runspace:
"O finauga o le teuina o se tasi lea o metotia sili ona faigata e siaki i vSphere. I totonu o le vCenter, e le mafai ona e alu e vaʻai po o le a le VM o loʻo faʻaaogaina le tele o mea e teu ai. O le mea e laki ai, e mafai ona e aoina nei faʻamatalaga i minute faʻafetai i le PowerShell.
O le a ou faʻasoaina se faʻamatalaga e mafai ai e le VMware system administrators ona vave suʻesuʻe i le vCenter ma maua se lisi o VM ma faʻamatalaga i luga o latou averesi taumafa.
O lo'o fa'aogaina e le fa'amaumauga le PowerShell runspaces e fa'ataga ai e ta'ita'i ESXi ta'itasi e aoina fa'amatalaga fa'atau mai ana lava VM i se isi Runspace ma vave lipoti atu le mae'a. O le mea lea e mafai ai e le PowerShell ona tapunia vave galuega, nai lo le faʻasalalau i tagata talimalo ma faʻatali mo tagata taʻitoʻatasi e faʻamaeʻa lana talosaga.
I le tulaga o loʻo i lalo, ua le toe aoga le Runspace:
"O loʻo ou taumafai e tusi se tusitusiga e aoina mai le tele o faʻamatalaga mai se VM ma tusia ni faʻamatalaga fou pe a manaʻomia. O le faʻafitauli o loʻo i ai le tele o VM, ma 5-8 sekone e faʻaalu i le masini e tasi.
O iinei e te manaʻomia Get-View, seʻi o tatou agai i ai.
Laasaga lona lua: Get-View
Ina ia malamalama pe aisea e aoga ai le Get-View, e taua le manatua pe faʻafefea ona galue cmdlets lautele.
E manaʻomia Cmdlets e maua ai faʻamatalaga faigofie e aunoa ma le manaʻomia e suʻesuʻe tusi faʻamatalaga API ma toe faʻaleleia le isi uili. O le a le mea i aso tuai na ave ai le selau pe lua laina o tulafono, PowerShell e mafai ai ona e faia i le tasi poloaiga. Matou te totogia lenei faʻafaigofie ma le saoasaoa. E leai se togafiti i totonu o le cmdlets lava ia: o le tusitusiga lava e tasi, ae i se tulaga maualalo, na tusia e lima atamamai o se matai mai le la o Initia.
I le taimi nei, mo le faʻatusatusaina o le Get-View, seʻi o tatou ave le Get-VM cmdlet: e maua ai le masini masini ma toe faʻafoʻi mai se mea tuʻufaʻatasia, o lona uiga, faʻapipiʻi isi mea faʻatatau i ai: VMHost, Datastore, ma isi.
Get-View i lona tulaga e le faʻaopoopoina se mea e le manaʻomia i le mea na faʻafoʻi mai. E le gata i lea, e mafai ai ona matou faʻamaonia faʻamaonia mea matou te manaʻomia, lea o le a faafaigofieina ai le mea e gaosia. I le Windows Server i le lautele ma i Hyper-V aemaise lava, o le Get-WMIObject cmdlet o se faʻataʻitaʻiga tuusaʻo - o le manatu e tutusa lelei.
Get-View e le faigofie mo gaioiga masani i luga o mea faitino. Ae a oo i le afe ma le fiasefulu afe o mea faitino, e leai se tau.
O lenei o le a ou faʻaali atu ia te oe mea uma e faʻaaoga ai se faʻamatalaga moni.
Tusia o se tusitusiga e la'u ai se VM
I se tasi aso na fai mai ai la'u uo e faaleleia lana tusitusiga. O le galuega o se masani masani: suʻe uma VM ma se kopi faʻapipiʻi cloud.uuid (ioe, e mafai lenei pe a faʻapipiʻi se VM i vCloud Director).
O le tali manino e sau i lou mafaufau o le:
Maua se lisi o VM uma.
Su'e le lisi i se isi itu.
O le uluai lomiga o le tusitusiga faigofie lenei:
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
}
# Далее РУКАМИ парсим полученный результат
O mea uma e matua faigofie ma manino. E mafai ona tusia i ni nai minute ma se malologa kofe. Fa'amau le su'ega ma ua mae'a.
Ae tatou fua le taimi:
2 minute 47 sekone pe a fa'agaoioia toetoe 10k VMs. O le ponesi o le leai lea o ni filiga ma le mana'oga e fa'avasega ma le lima i'uga. E manino lava, o le tusitusiga e manaʻomia le faʻaleleia atili.
O Runspaces e muamua e sau e laveai pe a e manaʻomia le mauaina i le taimi e tasi metric metrics mai le vCenter pe manaʻomia le faʻaogaina o le fiasefulu afe o mea. Se'i vaai po o le a le mea e aumaia e lenei faiga.
Fa'aola le saoasaoa muamua: PowerShell Runspaces
O le mea muamua e sau i lou mafaufau mo lenei tusitusiga o le faʻatinoina o le matasele e le faʻasolosolo, ae i filo tutusa, aoina uma faʻamatalaga i se mea e tasi ma faamama.
Ae o loʻo i ai se faʻafitauli: PowerCLI o le a le faʻatagaina i matou e tatalaina le tele o sauniga tutoʻatasi i le vCenter ma o le a lafoina se mea malie malie:
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.
Ina ia foia lenei mea, e tatau ona e pasi muamua faʻamatalaga o le sauniga i totonu o le vaitafe. Ia tatou manatua o le PowerShell e galue i mea faitino e mafai ona pasi e fai ma parakalafa pe i se galuega poʻo se ScriptBlock. Sei o tatou pasi le sauniga i le tulaga o sea mea, e ala i le $ global: DefaultVIServers (Connect-VIServer ma le -NotDefault ki):
$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 $_
}
}
}
Se'i o tatou fa'atinoina le multithreading e ala i Runspace Pools.
O le algorithm e faʻapea:
Matou te maua se lisi o VM uma.
I vaitafe tutusa tatou te maua cloud.uuid.
Matou te aoina faʻamatalaga mai vaitafe i se mea e tasi.
Matou te faʻamama le mea e ala i le faʻavasegaina i le tau o le CloudUUID field: oi latou e sili atu le numera o tulaga faʻapitoa nai lo le 1 o VM o loʻo matou sailia.
O se taunuuga, matou te maua le faʻamatalaga:
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
}
O le matagofie o lenei tusitusiga e mafai ona faʻaaogaina i isi tulaga faʻapena i le na o le suia o le ScriptBlock ma faʻamaufaʻailoga o le a pasia i le vaitafe. Fa'aaoga tatau!
Matou te fuaina le taimi:
55 sekone. E sili atu, ae e mafai lava ona vave.
Tatou see i le saoasaoa lona lua: GetView
Se'i tatou su'e po o le a le mea ua tupu.
Muamua ma le sili, o le Get-VM cmdlet e umi se taimi e faʻatino ai.
Lona lua, o le Get-AdvancedOptions cmdlet e umi se taimi e faʻamaeʻa ai.
Sei o tatou feagai muamua ma le lona lua.
Get-AdvancedOptions e faigofie mo mea taʻitasi VM, ae faʻavalevalea pe a galue i le tele o mea. E mafai ona matou maua faʻamatalaga tutusa mai le masini masini masini (Get-VM). Fa'atoa tanumia lelei i le mea ExtensionData. Fa'aauupegaina i le fa'amamaina, matou te fa'avavevaveina le fa'agasologa o le mauaina o fa'amaumauga talafeagai.
Faatasi ai ma sina gaioiga o le lima o le:
VM | Get-AdvancedSetting -Name Cloud.uuid -Server $ConnectionString | Select-Object @{N="VMName";E={$_.Entity.Name}},@{N="CloudUUID";E={$_.Value}},@{N="PowerState";E={$_.Entity.PowerState}}
Ole fa'aulufale e tutusa ma Get-AdvancedOptions, ae e tele taimi e sili atu le saoasaoa.
Ole taimi nei e maua-VM. E le vave ona e feagai ma mea faigata. O se fesili talafeagai e tulaʻi mai: aisea tatou te manaʻomia ai faʻamatalaga faaopoopo ma se PSObject mataʻutia i lenei tulaga, pe a tatou manaʻomia le igoa o le VM, lona tulaga ma le taua o se uiga taufaasese?
E le gata i lea, o le faʻalavelave i le tulaga o Get-AdvancedOptions ua aveesea mai le tusitusiga. O le fa'aogaina o Runspace Pools ua foliga mai ua sili atu ona le toe mana'omia le fa'atusaina o se galuega fa'agesegese i luga o filo squat pe a tu'uina atu se vasega. E lelei le meafaigaluega, ae le mo lenei tulaga.
Se'i o tatou va'ai i le fa'aulufalega o ExtensionData: e leai se mea e sili atu nai lo se mea e maua-Vaai.
Se'i o tatou vala'au i le faiga tuai a le PowerShell masters: tasi le laina e fa'aoga ai filiga, fa'avasega ma fa'avasega. O mea mataʻutia uma na muamua atu ua paʻu'ū lelei i le laina e tasi ma faʻatinoina i le tasi vasega:
9 sekone mo le toetoe lava 10k meafaitino faʻatasi ma le faʻamamaina e le tulaga manaʻomia. Matagofie!
Nai lo o se faaiuga
O se taunuuga talia sa'o e faalagolago i le filifiliga o meafaigaluega. E masani ona faigata ona fai atu ma le mautinoa le mea tonu e tatau ona filifilia e ausia ai. O auala taʻitasi o loʻo lisiina mo le faʻavaveina o tusitusiga e lelei i totonu o tapulaʻa o lona faʻaogaina. Ou te faʻamoemoe o lenei tusiga o le a fesoasoani ia te oe i le galuega faigata o le malamalama i faʻavae o le faʻagasologa o masini ma faʻalelei i au atinaʻe.
SALA: E faafetaia e le tusitala tagata uma o le afioaga mo la latou fesoasoani ma le lagolago i le sauniaina o le tusiga. E oo lava ia i latou e iai vae. Ma e oo lava ia i latou e leai ni vae, e pei o se boa constrictor.