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!
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.
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."
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.
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.
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:
Tikina he rarangi o nga VM katoa.
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:
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:
Ka whiwhi matou i te rarangi o nga VM katoa.
I roto i nga awa whakarara ka whiwhi tatou cloud.uuid.
Ka kohia e matou nga raraunga mai i nga awa ki tetahi mea.
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:
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}}
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:
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.