VMware
Automatizacija vSphere okruženja nije zamena za administratorsko rasuđivanje, već način da se odobrena odluka izvrši ponovljivo, ograničeno i dokazivo. Ručno izvedena promena može biti tehnički ispravna, ali teško ponovljiva na stotinama objekata; loše projektovana skripta istu grešku može proširiti na celo okruženje za nekoliko sekundi. Zbog toga je produkcioni cilj više od „skripta je završila bez crvenog teksta”: potrebno je dokazati početno stanje, identitet izvršioca, obim promene, rezultat svake operacije i završno stanje.
Lekcije 39, 42 i 43 već su postavile inventar, tagove, RBAC, sertifikate i audit kao oslonce upravljanja. Ova lekcija ih pretvara u izvršni tok. Lekcije 45 i 46 potom koriste iste obrasce za planiranje kapaciteta i kontrolisano održavanje. Primeri su namenjeni prvenstveno vCenter Server okruženju; konkretna dostupnost cmdleta, parametra ili API operacije zavisi od verzije VCF PowerCLI-ja, vCenter Servera, API-ja, licence i privilegija dodeljenih nalogu.
44.1. Od administrativne skripte do kontrolisanog sistema automatizacije
Produkciona automatizacija ima najmanje šest slojeva: deklarisano željeno stanje, autentikaciju i autorizaciju, pronalaženje tačnog cilja, izračunavanje razlike, ograničenu promenu i nezavisnu validaciju. Ako skripta samo pozove Set-VM nad rezultatom širokog upita, ona nema ugrađenu zaštitu od pogrešnog obima. Ako proveri jedinstveni identitet objekta, očekivano trenutno stanje, odobreni prozor promene i rezultat zadatka, ona postaje deo upravljanog procesa.
| Svojstvo | Slaba skripta | Produkcioni obrazac |
|---|---|---|
| Ulaz | Vrednosti ugrađene u kod | Validirana konfiguracija, verzionisana uz šemu i vlasnika |
| Cilj | Ime ili širok wildcard | Jedinstveni MoRef/API ID, uz potvrdu imena, vCenter-a i foldera |
| Promena | Bez poređenja stanja | Menja samo utvrđenu razliku; podržava -WhatIf gde cmdlet to omogućava |
| Greška | Nastavlja ili skriva izuzetak | Prekida odgovarajući obim, čuva kontekst i razdvaja retryable od trajnih grešaka |
| Dokaz | Poruka „Done” | Pre/post stanje, task/event identifikator, strukturisan log i izlazni kod |
| Ponovljeno izvršavanje | Može duplirati ili ponovo menjati | Drugo izvršavanje daje Compliant/NoChange |
44.2. VCF PowerCLI: distribucija, moduli i verzijski okvir
Aktuelna distribucija naziva se VCF PowerCLI i instalira se iz PowerShell Gallery-ja metapaketom VCF.PowerCLI. Mnogi učitani moduli i cmdleti i dalje nose istorijska imena VMware.VimAutomation.*; to nije znak da je instalirana pogrešna generacija. Stariji priručnici navode metapaket VMware.PowerCLI. U novom radu treba dokumentovati tačnu instaliranu verziju i proveriti referencu koja odgovara toj verziji, a postojeće skripte migrirati tek nakon testa, ne prostom zamenom naziva.
# Izvršava se u PowerShell 7 sesiji; ove komande menjaju lokalno stanje modula.
Install-Module -Name VCF.PowerCLI -Scope CurrentUser
# Read-only inventar instalacije.
Get-Module -Name VCF.PowerCLI -ListAvailable |
Select-Object Name, Version, Path
Get-Module -ListAvailable VMware.VimAutomation.* |
Sort-Object Name, Version |
Select-Object Name, Version, Path
U zaključanom ili odvojenom okruženju paket se preuzima na kontrolisanoj stanici, proverava, skenira i prenosi kroz interni repozitorijum. Ne treba dozvoliti da svaki automation runner samostalno preuzima „latest” pri svakom pokretanju. Verziju treba pinovati, zavisnosti evidentirati i nadogradnju provesti kao zasebnu promenu sa regresionim testom. Update-Module nije neutralna operacija: može promeniti ponašanje tipova, parametara i zavisnosti, pa ne pripada početku produkcione skripte.
Izbor nivoa apstrakcije
| Interfejs | Kada ga biramo | Glavni rizik | Dokaz |
|---|---|---|---|
| PowerCLI cmdlet | Podržana česta administrativna radnja, čitljiv tok i PowerShell pipeline | Podrazumevani server ili implicitni izbor prošire obim | Vraćeni objekat, task, ponovni Get-* |
Get-View / Web Services API | Potrebna svojstva ili metode nisu izloženi cmdletom; efikasno čitanje velikog inventara | Niskonivojski tipovi i verzijska vezanost | MoRef, TaskInfo, ponovni property read |
| vSphere Automation API | Integracija iz više jezika, REST/JSON, tagging, content library, appliance i noviji servisi | Mešanje endpointa, ID-jeva, sesija ili ugovora različitih verzija | HTTP status, response body, task i naknadni GET |
| GUI | Istraživanje, mala izuzetna promena i nezavisna vizuelna provera | Teška ponovljivost i ljudska greška | Recent Tasks, Events i stanje objekta |
Cmdlet nije uvek „sigurniji”, niti je REST automatski „moderniji”. Pravilan izbor je najviši podržani nivo koji potpuno izražava nameru, vraća dovoljan dokaz i ima stabilan ugovor za ciljnu verziju. Niskonivojski poziv treba izolovati u malu, testiranu funkciju, jer tako smanjujemo deo koda zavisan od internog modela objekata.
44.3. Veza, identitet, sertifikati i zaštita tajni
Automation nalog mora imati najmanji skup privilegija nad najnižim potrebnim objektom inventara. Poseban servisni identitet, odvojen od ličnog administratorskog naloga, olakšava audit i opoziv. Jedan nalog za sve skripte ruši atribuciju i povećava blast radius. Za svaki posao dokumentuju se vlasnik, namena, ciljni vCenter, uloga, propagacija privilegija, rok važenja i postupak rotacije tajne.
# Session-scope sprečava trajnu promenu profila na deljenom runneru.
Set-PowerCLIConfiguration -Scope Session `
-InvalidCertificateAction Fail `
-ParticipateInCEIP:$false `
-Confirm:$false
$credential = Get-Credential -Message 'Automation nalog za vcsa01.example.test'
$vi = Connect-VIServer -Server 'vcsa01.example.test' `
-Credential $credential -ErrorAction Stop
# Eksplicitni -Server sprečava slučajno izvršavanje nad drugom aktivnom vezom.
Get-Datacenter -Server $vi | Select-Object Name, Id
Disconnect-VIServer -Server $vi -Confirm:$false
InvalidCertificateAction Ignore ne sme biti produkcioni „lek” za TLS problem: njime se gubi pouzdana autentikacija servera i otvara mogućnost presretanja veze. Ispravan tok je proveriti FQDN, vreme, lanac poverenja, SAN i thumbprint, uvesti odgovarajući CA sertifikat u trust store runnera i zadržati validaciju. Prompt može pomoći pri kontrolisanom prvom laboratorijskom povezivanju, ali je nepogodan za unattended posao. Ako se sertifikat neočekivano promenio, automatizacija treba da stane i incident se istraži.
Lozinka se ne upisuje u skriptu, CSV, komandnu liniju, transcript niti git. Produkciono rešenje koristi odobreni secrets vault ili mehanizam identiteta koji podržava konkretna platforma i runner. Export-Clixml sa PSCredential može biti ograničena lokalna pomoć na Windows-u jer je sadržaj vezan za korisnika i računar, ali nije prenosivi enterprise vault; na drugim platformama zaštita nije ekvivalentna. Tajna se učitava neposredno pred povezivanje, ne ispisuje i uklanja iz dugovečne sesije kada više nije potrebna.
Sesije vSphere Automation API-ja
Za REST tok klijent uspostavlja autentifikovanu sesiju, a dobijeni session ID šalje u zaglavlju vmware-api-session-id. To je bearer vrednost: ko je poseduje može delovati u okviru sesije i privilegija naloga. Ne beleži se u log, ne prosleđuje nepoverljivom procesu i sesija se briše na kraju čak i kada posao padne. Primer koristi PowerShell promenljive i pravi TLS trust; placeholderi se ne izvršavaju doslovno u produkciji.
$baseUri = 'https://vcsa01.example.test'
$pair = '{0}:{1}' -f $env:VC_USER, $env:VC_PASSWORD
$basic = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($pair))
try {
$session = Invoke-RestMethod -Method Post `
-Uri "$baseUri/api/session" `
-Headers @{ Authorization = "Basic $basic" } `
-ErrorAction Stop
$headers = @{ 'vmware-api-session-id' = $session }
$vms = Invoke-RestMethod -Method Get `
-Uri "$baseUri/api/vcenter/vm" -Headers $headers -ErrorAction Stop
$vms | Select-Object vm, name, power_state
}
finally {
if ($session) {
Invoke-RestMethod -Method Delete -Uri "$baseUri/api/session" `
-Headers $headers -ErrorAction SilentlyContinue
}
$basic = $null
}
U stvarnom pipeline-u korisničko ime i lozinka dolaze iz maskiranog secret provider-a, a ne iz trajno definisanih običnih environment promenljivih. HTTP 401 znači da identitet ili sesija nisu prihvaćeni; 403 da je identitet poznat, ali nema ovlašćenje; 404 može značiti pogrešan endpoint, verziju ili ID; 409 konflikt sa trenutnim stanjem; 429 potrebu za kontrolisanim backoff-om; 5xx problem servisa koji nije dozvola za beskonačno ponavljanje state-changing zahteva.
44.4. Inventar, stabilni identifikatori i ograničavanje obima
Ime vSphere objekta nije univerzalno jedinstveno i može se promeniti. PowerCLI objekti imaju Id, Web Services API koristi Managed Object Reference (MoRef), dok Automation API vraća svoje identifikatore poput vm-123. Ti identifikatori nisu proizvoljno zamenljivi između različitih vCenter instanci i API porodica. CMDB zato uz ime čuva vCenter identitet, tip objekta, odgovarajući stabilni ID i poslednje vreme potvrde.
$target = Get-VM -Server $vi -Name 'app01' -ErrorAction Stop
if (@($target).Count -ne 1) {
throw "Očekivan je tačno jedan VM 'app01'; pronađeno: $(@($target).Count)."
}
$evidence = [pscustomobject]@{
TimestampUtc = (Get-Date).ToUniversalTime().ToString('o')
VCenter = $vi.Name
Name = $target.Name
Id = $target.Id
Folder = $target.Folder.Name
PowerState = [string]$target.PowerState
NumCpu = $target.NumCpu
MemoryGB = $target.MemoryGB
}
$evidence | ConvertTo-Json -Depth 4
Pre mutacije primenjuju se guard rails: dozvoljena lista vCenter-a, eksplicitni datacenter/cluster/folder, obavezni tag za upravljanje, maksimalan broj objekata po izvršavanju, maintenance/change prozor i ShouldProcess. „Prazan rezultat” nije automatski uspeh, a „više rezultata” nije poziv da skripta izabere prvi. Oba su kontrolisani prekid koji zahteva proveru inventara.
44.5. Idempotentnost: željeno stanje, diff i konvergencija
Idempotentna automatizacija dovodi sistem u deklarisano željeno stanje, a ponovno izvršavanje nad već usklađenim sistemom ne proizvodi novu promenu. To ne znači da svaka pojedinačna API operacija ima matematičko idempotentno svojstvo. POST koji kreira objekat uglavnom nije bezbedno slepo ponavljati; klijent mora pre kreiranja pronaći postojeći objekat po pouzdanom ključu ili koristiti podržani token/idempotency mehanizam ako ga konkretan API dokumentuje.
function Set-VmAnnotationDesiredState {
[CmdletBinding(SupportsShouldProcess, ConfirmImpact='Medium')]
param(
[Parameter(Mandatory)] [VMware.VimAutomation.ViCore.Types.V1.Inventory.VirtualMachine] $VM,
[Parameter(Mandatory)] [string] $Name,
[Parameter(Mandatory)] [string] $Value
)
$field = Get-CustomAttribute -Name $Name -TargetType VirtualMachine `
-Server $VM.VIServer -ErrorAction Stop
$current = Get-Annotation -Entity $VM -CustomAttribute $field `
-Server $VM.VIServer -ErrorAction Stop
if ([string]$current.Value -ceq $Value) {
return [pscustomobject]@{ VM=$VM.Name; Attribute=$Name; Status='Compliant'; Changed=$false }
}
if ($PSCmdlet.ShouldProcess($VM.Name, "Set annotation $Name='$Value'")) {
Set-Annotation -Entity $VM -CustomAttribute $field -Value $Value `
-Server $VM.VIServer -ErrorAction Stop | Out-Null
$after = Get-Annotation -Entity $VM -CustomAttribute $field `
-Server $VM.VIServer -ErrorAction Stop
if ([string]$after.Value -cne $Value) { throw 'Post-check nije potvrdio željenu vrednost.' }
return [pscustomobject]@{ VM=$VM.Name; Attribute=$Name; Status='Changed'; Changed=$true }
}
}
Set-VmAnnotationDesiredState -VM $target -Name 'Owner' -Value 'Platform-Team' -WhatIf
Funkcija prvo čita, zatim poredi, menja samo razliku i ponovo čita. -WhatIf je koristan pregled namere, ali nije transakcioni dry-run niti garancija da će stvarna operacija uspeti. Između pre-checka i promene drugi administrator može promeniti objekat; kod kritičnih tokova zato treba ponovo potvrditi precondition neposredno pre mutacije i koristiti API mehanizam za optimistic concurrency kada postoji.
Granice rollback-a
vSphere nije jedna ACID transakcija preko svih cmdleta. Ako treća od pet promena padne, automatsko vraćanje prve dve može biti opasnije od zaustavljanja, naročito kada se stanje u međuvremenu promenilo. Skripta unapred klasifikuje korake kao reverzibilne, kompenzacione ili nepovratne. Rollback koristi sačuvanu, validiranu početnu vrednost i sprovodi se samo ako precondition i dalje važi. Snapshot nije univerzalni rollback automatizacije konfiguracije i ne štiti vCenter inventar, mrežne ili RBAC promene.
44.6. Greške, zadaci, retry i kontrola paralelizma
PowerShell non-terminating greške mogu ostaviti utisak da je try/catch uhvatio sve, iako naredba nastavlja. Za kritične pozive koristi se -ErrorAction Stop ili pažljivo postavljen $ErrorActionPreference = 'Stop' u ograničenom opsegu. Izuzetak se ne svodi na jednu poruku: beleže se cilj, operacija, vreme, correlation/change ID, kategorija i bezbedno očišćen odgovor bez tajni.
$runId = [guid]::NewGuid().ToString()
try {
$task = Start-VM -VM $target -Server $vi -RunAsync -ErrorAction Stop
$done = Wait-Task -Task $task -ErrorAction Stop
[pscustomobject]@{
RunId=$runId; TargetId=$target.Id; TaskId=$task.Id
State=[string]$done.State; FinishedUtc=(Get-Date).ToUniversalTime().ToString('o')
} | ConvertTo-Json -Compress
}
catch {
[pscustomobject]@{
RunId=$runId; TargetId=$target.Id; Operation='Start-VM'
ErrorType=$_.Exception.GetType().FullName
Message=$_.Exception.Message
} | ConvertTo-Json -Compress | Write-Error
throw
}
Retry se primenjuje samo kada je greška prolazna i kada je bezbedno utvrditi da prethodni pokušaj nije već izvršio promenu. Kod timeout-a odgovor može izostati iako je server prihvatio zadatak; pre ponavljanja proveravaju se Recent Tasks, stanje objekta i poznati task/correlation ID. Exponential backoff sa jitter-om štiti servis, ali ne rešava nevažeću privilegiju, pogrešan ID ili konflikt željenog stanja.
Paralelizam se ograničava. Masovni ForEach-Object -Parallel može preopteretiti vCenter, datastore ili mrežu i otežati atribuciju greške. Za promene se uvodi batch veličina, maksimalan broj istovremenih zadataka i failure threshold. PowerCLI konekcioni kontekst se ne podrazumeva u novom runspace-u; aktuelni VCF PowerCLI nudi Get-PowerCLIContext i Use-PowerCLIContext, ali deljenje konteksta i dalje zahteva kontrolu životnog ciklusa i testiranje.
44.7. vSphere Automation API i Web Services API u praksi
vSphere Automation API je REST/JSON površina grupisana po servisima. Web Services API je stariji, veoma obiman managed-object model na kome počiva veliki deo administracije i PowerCLI-ja. Nisu sve funkcije simetrično dostupne kroz oba interfejsa. Pre razvoja se u API changelog-u i referenci ciljne verzije proveravaju endpoint, minimalna verzija, privilegije, struktura zahteva, asinhroni odgovor i deprecation status.
{
"spec": {
"name": "app01",
"guest_OS": "RHEL_9_64",
"placement": {
"folder": "group-v123",
"resource_pool": "resgroup-45",
"datastore": "datastore-67"
}
}
}
Ovo je didaktički prikaz strukture, ne prenosivi produkcioni payload: tačna polja i enum vrednosti proveravaju se u referenci servera. Klijent ne sme pretpostaviti da HTTP 200 jedini označava uspeh; kreiranje može vratiti 201 ili 202, brisanje 204, a asinhrona operacija identifikator zadatka. Uspešan transport još ne dokazuje operativni ishod, zato sledi GET ili task polling i provera relevantnih svojstava.
Efikasno čitanje pomoću Get-View
# Read-only: server vraća samo tražena svojstva umesto punih objekata.
$views = Get-View -Server $vi -ViewType VirtualMachine `
-Property Name,Runtime.PowerState,Config.Hardware.NumCPU,Config.Hardware.MemoryMB
$views | ForEach-Object {
[pscustomobject]@{
MoRef = $_.MoRef.Value
Name = $_.Name
Power = [string]$_.Runtime.PowerState
NumCpu = $_.Config.Hardware.NumCPU
MemoryGB = [math]::Round($_.Config.Hardware.MemoryMB / 1024, 2)
}
}
Get-View može biti znatno efikasniji za veliki inventar kada se navede -Property. Pozivanje metode kao što je ReconfigVM_Task() jeste state-changing niskonivojska operacija: zahteva pažljivo konstruisan spec, verzijsku proveru, nadzor taska i post-check. Ako postoji podržan, jasan cmdlet, on je obično održiviji izbor.
44.8. Audit, logovi i dokaz usklađenosti
Dokaz se gradi na najmanje tri mesta. Automation runner čuva strukturisan zapis namere i rezultata; vCenter beleži Tasks and Events povezane sa korisnikom i objektom; konfiguracioni ili bezbednosni sistem čuva odobrenje, verziju koda i artefakte izvršavanja. Nijedan sloj sam nije dovoljan: lokalni log može tvrditi uspeh bez serverskog taska, a vCenter event ne objašnjava odobreni poslovni razlog.
| Dokaz | Šta obavezno sadrži | Šta ne sme sadržati |
|---|---|---|
| Run manifest | Run/change ID, commit/verziju, modul, runner, cilj, vreme UTC | Lozinku, session ID, private key |
| Pre/post stanje | Stabilni ID, relevantna svojstva, hash/normalizovani diff | Nepotreban kompletan inventar i lične podatke |
| Task/event | Task ID, korisnika, objekat, status, server timestamp | Nekontrolisani masovni export bez retencije |
| Pipeline rezultat | Testove, approval, izlazni kod, artefakt i retention | Nemaskirane tajne iz debug izlaza |
$since = (Get-Date).AddMinutes(-15)
Get-VIEvent -Server $vi -Entity $target -Start $since -MaxSamples 200 |
Select-Object CreatedTime, UserName, FullFormattedMessage |
Sort-Object CreatedTime
Za dublju korelaciju koriste se vSphere Client Recent Tasks/Events i vCenter logovi. /var/log/vmware/vpxd/vpxd.log na VCSA beleži vCenter servisne operacije; /var/log/vmware/vapi/endpoint/endpoint.log pomaže kod vAPI endpoint problema. Pristup appliance shell-u je privilegovan i ne treba ga koristiti kao prvi korak. Najpre se sužava UTC vremenski prozor, korisnik, objekat, task/op ID i greška, pa tek onda pregleda odgovarajući log ili support bundle. Retencija lokalnih logova i centralnog syslog/SIEM sistema mora biti usklađena sa politikom i kapacitetom.
44.9. Projektovanje pipeline-a: test, approval i promotion
Kod, konfiguracija i tajne imaju odvojene životne cikluse. Pull request proverava sintaksu, PSScriptAnalyzer pravila, Pester testove i bezbednosne kontrole; test okruženje potvrđuje ugovor sa stvarnim API-jem; produkcioni stage zahteva odobrenje i koristi produkcioni identitet tek u tom stage-u. Isti verifikovani artefakt se promoviše, ne gradi ponovo. Runner mora biti zakrpljen, vremenski sinhronizovan, mrežno ograničen i dovoljno prolazan da ne akumulira kredencijale.
# Primer ugovornog Pester testa: drugo izvršavanje ne poziva mutaciju.
Describe 'Set-VmAnnotationDesiredState' {
It 'ne menja već usklađenu anotaciju' {
Mock Get-CustomAttribute { [pscustomobject]@{ Name='Owner' } }
Mock Get-Annotation { [pscustomobject]@{ Value='Platform-Team' } }
Mock Set-Annotation {}
$result = Set-VmAnnotationDesiredState -VM $script:FakeVm `
-Name 'Owner' -Value 'Platform-Team'
$result.Changed | Should -BeFalse
Should -Invoke Set-Annotation -Times 0
}
}
Mock test dokazuje odluku funkcije, ali ne kompatibilnost sa konkretnim vCenterom. Potrebni su i integration testovi u laboratoriji: dovoljne i nedovoljne privilegije, nevažeći sertifikat, duplirano ime, nestala meta, timeout posle prihvaćenog taska i već usklađeno stanje. Test podaci ne smeju koristiti produkcione tajne.
44.10. Praktikum – bezbedna i dokaziva automatizacija metapodataka VM-a
Vežba 1: priprema laboratorije i read-only baseline
Cilj i topologija. Sa PowerShell 7 administratorske stanice povezuje se jedan laboratorijski vCenter vcsa01.example.test sa VM-om app01. Cilj je evidentirati alat, vezu i jedinstveni cilj bez promene infrastrukture.
Preduslovi. DNS i vreme su ispravni; TLS lanac je poverljiv; VCF PowerCLI je instaliran iz kontrolisanog izvora; laboratorijski nalog ima read-only pristup ciljnom folderu. Rizik je nizak jer su inventarni pozivi read-only, ali izlaz može sadržati osetljivu topologiju i čuva se kontrolisano.
$ErrorActionPreference = 'Stop'
$vcFqdn = 'vcsa01.example.test'
Get-Module -Name VCF.PowerCLI -ListAvailable |
Select-Object Name, Version, Path
Set-PowerCLIConfiguration -Scope Session -InvalidCertificateAction Fail `
-DefaultVIServerMode Single -ParticipateInCEIP:$false -Confirm:$false
$cred = Get-Credential
$vi = Connect-VIServer -Server $vcFqdn -Credential $cred
$vm = @(Get-VM -Server $vi -Name 'app01')
if ($vm.Count -ne 1) { throw "Očekivan jedan app01; pronađeno $($vm.Count)." }
$baseline = [pscustomobject]@{
TimestampUtc=(Get-Date).ToUniversalTime().ToString('o')
VCenter=$vi.Name; Name=$vm[0].Name; Id=$vm[0].Id
Folder=$vm[0].Folder.Name; PowerState=[string]$vm[0].PowerState
}
$baseline | ConvertTo-Json -Depth 4
Očekivani rezultat i validacija. Tačno jedan objekat je pronađen, vCenter FQDN i VM ID su zabeleženi, a u Recent Tasks nema konfiguracione promene od ove vežbe. Ako je rezultat nula, proveriti vCenter, scope i privilegiju; ako je veći od jedan, ne birati prvi već dopuniti folder/cluster filter. TLS grešku ne zaobilaziti sa Ignore, već ispraviti trust.
Vežba 2: idempotentna promena sa preview-om i post-checkom
Cilj. Postaviti postojeći custom attribute Owner na Platform-Team. Kreiranje same definicije atributa izostavljeno je jer menja globalniji konfiguracioni obim; administrator ga prethodno kreira kroz odobrenu promenu. Nalog dobija samo potrebne privilegije za čitanje i izmenu custom atributa nad laboratorijskim opsegom.
- Sačuvati početnu vrednost:
$before = Get-Annotation -Entity $vm[0] -CustomAttribute 'Owner'. - Pokrenuti funkciju iz odeljka 44.5 sa
-WhatIf; potvrditi da nije nastao task/event promene. - Pokrenuti bez
-WhatIfu laboratorijskom change prozoru. - Ponovo pročitati anotaciju i sačuvati rezultat zajedno sa UTC vremenom i VM ID-jem.
- Pokrenuti funkciju drugi put. Očekuje se
Status=CompliantiChanged=false.
$before = Get-Annotation -Entity $vm[0] -CustomAttribute 'Owner' -Server $vi
$preview = Set-VmAnnotationDesiredState -VM $vm[0] -Name 'Owner' `
-Value 'Platform-Team' -WhatIf
$first = Set-VmAnnotationDesiredState -VM $vm[0] -Name 'Owner' `
-Value 'Platform-Team'
$second = Set-VmAnnotationDesiredState -VM $vm[0] -Name 'Owner' `
-Value 'Platform-Team'
$after = Get-Annotation -Entity $vm[0] -CustomAttribute 'Owner' -Server $vi
[pscustomobject]@{
Before=$before.Value; After=$after.Value
FirstChanged=$first.Changed; SecondChanged=$second.Changed
} | Format-List
Kriterijum završetka. Završna vrednost je tačna; prvo izvršavanje menja samo ako je bilo potrebno; drugo ne poziva state-changing cmdlet; vCenter event prikazuje odgovarajući automation identitet. Ako post-check nije tačan, prekida se dalji batch, čuvaju dokazi i ne ponavlja se slepo.
Rollback. Samo u laboratoriji i samo ako se potvrdi da vrednost od vežbe nije naknadno promenio drugi proces, vratiti sačuvanu vrednost:
$current = Get-Annotation -Entity $vm[0] -CustomAttribute 'Owner' -Server $vi
if ($current.Value -ceq 'Platform-Team') {
Set-Annotation -Entity $vm[0] -CustomAttribute 'Owner' `
-Value ([string]$before.Value) -Server $vi -Confirm:$false
} else {
throw 'Rollback precondition nije ispunjen; stanje je promenjeno nakon vežbe.'
}
Vežba 3: REST read-only inventar, sesija i negativni test
Cilj. Potvrditi REST autentikaciju, eksplicitno zatvaranje sesije i tumačenje grešaka bez promene VM-a. Koristiti vault ili privremeno unete laboratorijske kredencijale; nikada ne snimati session header.
- Izvršiti REST primer iz 44.3 i pronaći
app01u rezultatu. - Sačuvati samo bezbedna polja: UTC vreme, vCenter, VM ID, ime, power state i HTTP ishod.
- Obrisati sesiju u
finallybloku. - Pokušati read-only GET sa obrisanim session ID-jem; očekuje se kontrolisana autentikaciona greška.
Troubleshooting grane. Kod 401 proveriti životni vek i formiranje sesije; kod 403 Required Privileges u API referenci i scope uloge; kod 404 putanju i verziju; kod TLS greške CA/FQDN/vreme. Ne uključivati SkipCertificateCheck kao trajnu korekciju. Kriterijum završetka je uspešan read, zatvorena sesija i negativni test koji ne otkriva tajnu.
Vežba 4: simulirani incident – timeout ne znači neuspeh
Scenario. State-changing posao prijavljuje timeout posle slanja zahteva. Posledica je nepoznat ishod, ne automatski neuspeh. Slepo ponavljanje može duplirati kreiranje ili proizvesti drugu promenu.
- Zaustaviti batch i zabeležiti UTC vreme, cilj, run ID i poslednji poznati odgovor.
- Read-only proverom utvrditi trenutno stanje cilja.
- U Recent Tasks/Events filtrirati automation korisnika, objekat i vremenski prozor; zatim, samo ako je potrebno, korelisati
vpxd.logili vAPI endpoint log. - Ako je željeno stanje već ostvareno, označiti oporavak kao
VerifiedAfterTimeouti ne ponavljati mutaciju. - Ako task nije prihvaćen i stanje je staro, tek nakon potvrde ponoviti jedan kontrolisan pokušaj.
- Ako je task aktivan ili ishod dvosmislen, eskalirati i nadzirati; ne pokretati konkurentsku promenu.
RCA razdvajanje. Simptom je timeout klijenta; obim je jedan run i konkretan cilj; neposredni uzrok može biti prekid veze ili istekao klijentski timeout; osnovni uzrok može biti zagušenje runnera, vCenter-a ili mreže. Privremeni workaround je serijska obrada/manji batch, a trajna mera odgovarajući timeout, task polling, backoff, observability i kapacitet. Završetak zahteva dokazano stanje i dokumentovanu odluku o retry-ju.
Povratak laboratorije u početno stanje
Vratiti anotaciju samo uz rollback precondition iz vežbe 2, zatvoriti sve VI i REST sesije, ukloniti privremene lokalne artefakte koji sadrže inventar u skladu sa politikom i opozvati privremenu laboratorijsku tajnu ako je kreirana. Ne uklanjati module niti menjati sistemski execution policy kao deo cleanup-a ako to nije bilo unapred odobreno.
Get-VIServer | Disconnect-VIServer -Confirm:$false
$cred = $null
$session = $null
$headers = $null
44.11. Tipični kvarovi i dijagnostička matrica
| Simptom | Prva read-only provera | Verovatan uzrok | Bezbedna korekcija |
|---|---|---|---|
Invalid server certificate | FQDN, SAN, lanac, vreme i nedavna zamena | Nepoverljiv ili promenjen sertifikat | Validirati promenu i uvesti CA/obnoviti sertifikat; ne trajno Ignore |
| Cmdlet ne postoji | Get-Module -ListAvailable, Get-Command | Modul nije instaliran/učitan ili verzija nema cmdlet | Pinovana podržana verzija i regresioni test |
| Radi ručno, ne radi u pipeline-u | Identitet, platforma, module path, proxy, trust store | Drugi kontekst ili interaktivna pretpostavka | Eksplicitna konfiguracija runnera i neinteraktivna autentikacija |
| Više objekata istog imena | Server, datacenter, folder, ID | Ime nije jedinstveni ključ | Prekinuti i koristiti složeni ključ/stabilni ID |
| Timeout posle mutacije | Stanje, task/event i correlation ID | Nepoznat ishod, spor servis ili mreža | Reconcile pre retry-ja |
| Drugo izvršavanje ponovo menja | Normalizacija tipa, case, jedinica i server-side default | Neispravan diff ili nekanonski izlaz | Kanonsko poređenje i test konvergencije |
403 Forbidden | Identitet, scope i Required Privileges | Nedostajuća privilegija ili pogrešna propagacija | Korigovati minimalnu ulogu; ne dodeljivati Administrator napamet |
44.12. Administratorske prakse
- Pinuj verzije VCF PowerCLI-ja i zavisnosti; nadogradnju tretiraj kao kontrolisanu promenu.
- Koristi poseban identitet po automatizaciji ili jasno razdvojenoj funkciji, uz najmanje privilegije i rotaciju tajni.
- Zadrži TLS validaciju; neočekivana promena sertifikata je događaj za proveru, ne smetnja koju treba isključiti.
- Svaki state-changing tok projektuj kao discover → validate → diff → approve → change → verify → record.
- Eksplicitno navedi
-Server, ciljaj stabilni ID i uvedi maksimalni dozvoljeni obim. - Testiraj nultu, jednu i višestruku metu, nedovoljnu privilegiju, timeout, parcijalni neuspeh i drugo izvršavanje.
- Ne smatraj izlazni kod ili HTTP status dovoljnim: potvrdi server-side task/event i završno stanje.
- Ne loguj tajne, session tokene ni cele objekte bez potrebe; koristi UTC, run ID i strukturisan format.
- Retry ograniči na klasifikovane prolazne greške i uvek reconcile-uj nepoznat ishod mutacije.
- Za svaki korak unapred definiši rollback, kompenzaciju ili jasan razlog zbog kog automatski rollback nije bezbedan.
44.13. Završna kontrolna tačka
Administrator je završio lekciju kada može da demonstrira i dokaže da:
- razlikuje VCF PowerCLI distribuciju, module
VMware.VimAutomation.*, Automation API i Web Services API; - bira najviši podržani interfejs koji potpuno pokriva zahtev i proverava verzijski API ugovor;
- uspostavlja vezu bez isključivanja TLS validacije i bez otkrivanja tajni;
- ograničava metu na tačno očekivani vCenter, objekat i scope;
- implementira pre-check, kanonski diff, state-changing korak i nezavisni post-check;
- drugim izvršavanjem dokazuje
NoChange/Compliantrezultat; - razlikuje transportni uspeh, završetak taska i ostvareno željeno stanje;
- kod timeout-a prvo utvrđuje ishod, pa tek onda odlučuje o retry-ju;
- koreliše run ID, identitet, task/event, UTC vreme i pre/post dokaz;
- bezbedno zaustavlja batch, vraća reverzibilnu laboratorijsku promenu i dokumentuje parcijalni neuspeh.
44.14. Zaključak
VCF PowerCLI i vSphere API pretvaraju vSphere administraciju u kod, ali kvalitet automatizacije ne meri se brojem uklonjenih klikova. Meri se time koliko precizno kod ograničava cilj, poštuje identitet i TLS poverenje, konvergira ka željenom stanju, zaustavlja se kada pretpostavke nisu ispunjene i ostavlja dokaz koji drugi administrator može nezavisno da proveri. Najvažnija produkciona veština zato nije brzo pisanje naredbi, već projektovanje bezbedne odluke oko svake naredbe.
Takav obrazac neposredno priprema sledeće lekcije: kapacitet se može pouzdano meriti samo iz kontrolisanog i verzionisanog prikupljanja podataka, a održavanje se može automatizovati samo kada postoje pre-check, ograničen blast radius, rollback i post-check. Automatizacija tada prestaje da bude lična skripta i postaje proverljiv deo operativnog sistema organizacije.