VMware

Treći deo: Produkcione operacije, automatizacija i otpornost
VCF PowerCLI i vSphere API – bezbedna, idempotentna i proverljiva automatizacija
XI. Automatizacija, kapacitet i kontrolisane promene
44. VCF PowerCLI i vSphere API – bezbedna, idempotentna i proverljiva automatizacija

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.

SvojstvoSlaba skriptaProdukcioni obrazac
UlazVrednosti ugrađene u kodValidirana konfiguracija, verzionisana uz šemu i vlasnika
CiljIme ili širok wildcardJedinstveni MoRef/API ID, uz potvrdu imena, vCenter-a i foldera
PromenaBez poređenja stanjaMenja samo utvrđenu razliku; podržava -WhatIf gde cmdlet to omogućava
GreškaNastavlja ili skriva izuzetakPrekida odgovarajući obim, čuva kontekst i razdvaja retryable od trajnih grešaka
DokazPoruka „Done”Pre/post stanje, task/event identifikator, strukturisan log i izlazni kod
Ponovljeno izvršavanjeMože duplirati ili ponovo menjatiDrugo 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

InterfejsKada ga biramoGlavni rizikDokaz
PowerCLI cmdletPodržana česta administrativna radnja, čitljiv tok i PowerShell pipelinePodrazumevani server ili implicitni izbor prošire obimVraćeni objekat, task, ponovni Get-*
Get-View / Web Services APIPotrebna svojstva ili metode nisu izloženi cmdletom; efikasno čitanje velikog inventaraNiskonivojski tipovi i verzijska vezanostMoRef, TaskInfo, ponovni property read
vSphere Automation APIIntegracija iz više jezika, REST/JSON, tagging, content library, appliance i noviji servisiMešanje endpointa, ID-jeva, sesija ili ugovora različitih verzijaHTTP status, response body, task i naknadni GET
GUIIstraživanje, mala izuzetna promena i nezavisna vizuelna proveraTeška ponovljivost i ljudska greškaRecent 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 manifestRun/change ID, commit/verziju, modul, runner, cilj, vreme UTCLozinku, session ID, private key
Pre/post stanjeStabilni ID, relevantna svojstva, hash/normalizovani diffNepotreban kompletan inventar i lične podatke
Task/eventTask ID, korisnika, objekat, status, server timestampNekontrolisani masovni export bez retencije
Pipeline rezultatTestove, approval, izlazni kod, artefakt i retentionNemaskirane 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.

  1. Sačuvati početnu vrednost: $before = Get-Annotation -Entity $vm[0] -CustomAttribute 'Owner'.
  2. Pokrenuti funkciju iz odeljka 44.5 sa -WhatIf; potvrditi da nije nastao task/event promene.
  3. Pokrenuti bez -WhatIf u laboratorijskom change prozoru.
  4. Ponovo pročitati anotaciju i sačuvati rezultat zajedno sa UTC vremenom i VM ID-jem.
  5. Pokrenuti funkciju drugi put. Očekuje se Status=Compliant i Changed=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.

  1. Izvršiti REST primer iz 44.3 i pronaći app01 u rezultatu.
  2. Sačuvati samo bezbedna polja: UTC vreme, vCenter, VM ID, ime, power state i HTTP ishod.
  3. Obrisati sesiju u finally bloku.
  4. 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.

  1. Zaustaviti batch i zabeležiti UTC vreme, cilj, run ID i poslednji poznati odgovor.
  2. Read-only proverom utvrditi trenutno stanje cilja.
  3. U Recent Tasks/Events filtrirati automation korisnika, objekat i vremenski prozor; zatim, samo ako je potrebno, korelisati vpxd.log ili vAPI endpoint log.
  4. Ako je željeno stanje već ostvareno, označiti oporavak kao VerifiedAfterTimeout i ne ponavljati mutaciju.
  5. Ako task nije prihvaćen i stanje je staro, tek nakon potvrde ponoviti jedan kontrolisan pokušaj.
  6. 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

SimptomPrva read-only proveraVerovatan uzrokBezbedna korekcija
Invalid server certificateFQDN, SAN, lanac, vreme i nedavna zamenaNepoverljiv ili promenjen sertifikatValidirati promenu i uvesti CA/obnoviti sertifikat; ne trajno Ignore
Cmdlet ne postojiGet-Module -ListAvailable, Get-CommandModul nije instaliran/učitan ili verzija nema cmdletPinovana podržana verzija i regresioni test
Radi ručno, ne radi u pipeline-uIdentitet, platforma, module path, proxy, trust storeDrugi kontekst ili interaktivna pretpostavkaEksplicitna konfiguracija runnera i neinteraktivna autentikacija
Više objekata istog imenaServer, datacenter, folder, IDIme nije jedinstveni ključPrekinuti i koristiti složeni ključ/stabilni ID
Timeout posle mutacijeStanje, task/event i correlation IDNepoznat ishod, spor servis ili mrežaReconcile pre retry-ja
Drugo izvršavanje ponovo menjaNormalizacija tipa, case, jedinica i server-side defaultNeispravan diff ili nekanonski izlazKanonsko poređenje i test konvergencije
403 ForbiddenIdentitet, scope i Required PrivilegesNedostajuća privilegija ili pogrešna propagacijaKorigovati minimalnu ulogu; ne dodeljivati Administrator napamet

44.12. Administratorske prakse

44.13. Završna kontrolna tačka

Administrator je završio lekciju kada može da demonstrira i dokaže da:

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.

← Prethodna lekcija Povratak na sadržaj Sledeća lekcija →