~/yazilar/powercli-ile-vcenter-otomasyonu
PowerCLI ile vCenter otomasyonu
içindekiler
"Hangi VM'lerde bir haftadan eski snapshot var?" sorusunun cevabını vSphere Client'ta bulmak, VM'leri tek tek açıp Snapshots sekmesine bakmak demek. PowerCLI ile tek satır:
Get-VM | Get-Snapshot | Where-Object Created -lt (Get-Date).AddDays(-7)PowerCLI, VMware'in vSphere API'sini PowerShell cmdlet'leri olarak sunan modül. Arayüzde yapılan neredeyse her şey burada da yapılabiliyor, ama asıl kazanç rapor almak ve aynı işi on VM için tekrarlamak.
Kurulum
Modülün adı bir süre önce değişti. Eskiden VMware.PowerCLI olan modül artık VCF.PowerCLI olarak yayınlanıyor. Cmdlet'ler aynı, eski script'ler değişmeden çalışıyor ve yeni modül vCenter 8'i de yönetiyor.
Install-Module -Name VCF.PowerCLI -Scope CurrentUserMakinede eski VMware.PowerCLI kuruluysa önce onu kaldır. İkisi aynı anda kurulu olunca cmdlet çakışması hataları çıkıyor:
Get-Module -ListAvailable VMware.* | Select-Object Name, Version
Uninstall-Module -Name VMware.PowerCLI -AllVersionsUninstall-Module sadece üst modülü kaldırıyor, alt modüller (VMware.VimAutomation.Core gibi) kalabiliyor. Liste boşalana kadar onları da kaldır.
PowerShell 7 kullanıyorum. Windows PowerShell 5.1'de de çalışıyor, ama Linux ya da macOS'ta da aynı script'leri çalıştırabilmek için 7 daha mantıklı.
İlk açılışta iki ayar yapıyorum:
Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $false -Confirm:$false
Set-PowerCLIConfiguration -Scope User -InvalidCertificateAction Fail -Confirm:$falseİkinci satır önemli. İnternetteki örneklerin çoğu -InvalidCertificateAction Ignore yazıyor. Bu, sertifikası doğrulanamayan her sunucuya, araya giren biri olsa bile, parolanı göndermek demek. Doğru çözüm, vCenter'ın kendi CA'sının kök sertifikasına güvenmek.
vCenter sertifikasına güvenmek
vCenter kendi sertifika otoritesiyle (VMCA) geliyor ve kök sertifikasını indirilebilir bir dosya olarak sunuyor:
Invoke-WebRequest -Uri https://vcsa01.ornek.local/certs/download.zip -OutFile vcenter-certs.zip -SkipCertificateCheck
Expand-Archive vcenter-certs.zip -DestinationPath vcenter-certs
Get-ChildItem vcenter-certs -RecurseArşivdeki dosyalardan uzantısı .0, .1 gibi rakamla bitenler kök sertifikalar, .r0 gibi r ile başlayanlar ise iptal listeleri (CRL). Burada -SkipCertificateCheck bilerek var, çünkü güvenmek istediğimiz sertifikayı tam bu dosyadan alıyoruz. Dosyayı aldıktan sonra parmak izini vSphere Client'ta Administration, Certificates, Certificate Management, Trusted Root Certificates altında görünenle karşılaştırmak, araya biri girmediğinden emin olmanın yolu.
Windows'ta arşivin win dizinindeki .crt dosyasını "Trusted Root Certification Authorities" deposuna aktar:
Import-Certificate -FilePath .\vcenter-certs\certs\win\XXXXXXXX.0.crt -CertStoreLocation Cert:\LocalMachine\RootvCenter'ın sertifikasını kurumun kendi CA'sıyla değiştirdiysen bu adıma gerek yok, makinen o CA'ya zaten güveniyordur.
Bağlanmak
$cred = Get-Credential
Connect-VIServer -Server vcsa01.ornek.local -Credential $credScript'lerde parolayı dosyaya düz metin yazma. Zamanlanmış görevler için PowerShell'in Microsoft.PowerShell.SecretManagement modülü ve bir kasa (Windows'ta SecretStore ya da kurumun kullandığı bir parola kasası) daha temiz. PowerCLI'nin eskiden beri gelen New-VICredentialStoreItem cmdlet'i de var, ama sadece Windows'ta çalışıyor ve parolayı o kullanıcının profiline bağlı şifreliyor. Linux'ta da çalışacak bir script için SecretManagement daha mantıklı.
Rapor script'lerini administrator@vsphere.local ile değil, vCenter'da sadece "Read-only" rolü verilmiş bir AD servis hesabıyla çalıştır. Okuma yapan bir script'in yanlışlıkla bir VM silebilmesi için bir sebep yok.
İş bitince bağlantıyı kapat:
Disconnect-VIServer -Server vcsa01.ornek.local -Confirm:$falseRapor: eski snapshot'lar
Snapshot yedek değil. Silinmeyen bir snapshot zamanla büyüyor, datastore'u dolduruyor ve VM'in disk performansını düşürüyor. Bir haftadan eski olanları her pazartesi rapor etmek için:
$esik = (Get-Date).AddDays(-7)
Get-VM | Get-Snapshot |
Where-Object Created -lt $esik |
Select-Object @{N='VM'; E={$_.VM.Name}},
Name,
Created,
@{N='Gun'; E={((Get-Date) - $_.Created).Days}},
@{N='BoyutGB'; E={[math]::Round($_.SizeGB, 1)}},
Description |
Sort-Object Created |
Export-Csv -Path "snapshot-raporu-$(Get-Date -Format yyyy-MM-dd).csv" -NoTypeInformation -Encoding utf8Raporu görmek ile snapshot'ları silmek ayrı adımlar olsun. Silmeye karar verdiğinde önce -WhatIf ile ne olacağına bak:
Get-VM -Name test-* | Get-Snapshot | Where-Object Created -lt $esik | Remove-Snapshot -WhatIfBüyük bir snapshot'ı silmek (vSphere'in deyişiyle "consolidate") birkaç dakika sürebiliyor ve o sürede VM'in disk performansı düşüyor. Mesai içinde onlarca snapshot'ı aynı anda silme.
Datastore doluluğu
Get-Datastore |
Select-Object Name,
@{N='KapasiteGB'; E={[math]::Round($_.CapacityGB)}},
@{N='BosGB'; E={[math]::Round($_.FreeSpaceGB)}},
@{N='BosYuzde'; E={[math]::Round($_.FreeSpaceGB / $_.CapacityGB * 100)}} |
Sort-Object BosYuzdeName KapasiteGB BosGB BosYuzde
---- ---------- ----- --------
ds-uretim-01 4096 389 10
ds-uretim-02 4096 1720 42
ds-iso 512 301 59Thin diskler ve snapshot'lar yüzünden datastore'lar bazen bir gecede doluyor. BosYuzde 15'in altına düşen datastore'lar için e-posta atan küçük bir zamanlanmış görev, dolu bir datastore yüzünden VM'lerin durduğu bir sabahtan çok daha ucuz.
Template'ten toplu VM
Template'ten tek bir VM oluşturmak:
$vm = New-VM -Name web03 `
-Template (Get-Template ubuntu-sablon) `
-ResourcePool (Get-Cluster Uretim) `
-Datastore (Get-Datastore ds-uretim-02) `
-OSCustomizationSpec (Get-OSCustomizationSpec linux-statik)
$vm | Get-NetworkAdapter | Set-NetworkAdapter -Portgroup (Get-VDPortgroup VM-110) -Confirm:$false
$vm | Start-VMOSCustomizationSpec VM'in ilk açılışında hostname'i ve ağ ayarlarını değiştiren tanım. vSphere Client'ta Policies and Profiles, VM Customization Specifications altında oluşturuluyor. Linux için template'te open-vm-tools kurulu olmalı. Ubuntu template'lerinde cloud-init de kurulu geliyor ve customization'ı cloud-init'in yapması için /etc/cloud/cloud.cfg dosyasında disable_vmware_customization: false satırı gerekiyor. VMware Tools bu ayarı sadece bu dosyada arıyor, cloud.cfg.d altına koymak işe yaramıyor.
Her VM'e farklı bir IP vermek için customization spec'in bir kopyasını alıp NIC eşlemesini değiştirmek gerekiyor. Birkaç VM'i bir CSV'den oluşturan script:
Ad,IP,PortGroup
web03,10.0.110.23,VM-110
web04,10.0.110.24,VM-110$sablon = Get-Template ubuntu-sablon
$cluster = Get-Cluster Uretim
$ds = Get-Datastore ds-uretim-02
foreach ($satir in Import-Csv yeni-vmler.csv) {
$spec = Get-OSCustomizationSpec linux-statik | New-OSCustomizationSpec -Name "gecici-$($satir.Ad)" -Type NonPersistent
$spec | Get-OSCustomizationNicMapping | Set-OSCustomizationNicMapping `
-IpMode UseStaticIP -IpAddress $satir.IP `
-SubnetMask 255.255.255.0 -DefaultGateway 10.0.110.1 | Out-Null
$vm = New-VM -Name $satir.Ad -Template $sablon -ResourcePool $cluster -Datastore $ds -OSCustomizationSpec $spec
$vm | Get-NetworkAdapter | Set-NetworkAdapter -Portgroup (Get-VDPortgroup $satir.PortGroup) -Confirm:$false | Out-Null
$vm | Start-VM | Out-Null
Write-Host "$($satir.Ad) oluşturuldu: $($satir.IP)"
}-Type NonPersistent geçici spec'in vCenter'a kaydedilmemesini, oturum kapanınca kaybolmasını sağlıyor. Her VM için bir spec kopyası vCenter'da birikmiyor.
Linux spec'lerinde DNS sunucuları NIC eşlemesinde değil, spec'in kendisinde tanımlanıyor (New-OSCustomizationSpec ve Set-OSCustomizationSpec komutlarının -DnsServer parametresi). Bunu ana spec'te bir kez ayarladıysan kopyalar da aynı değeri alıyor.
DNS kayıtlarını da aynı döngüde açmak istersen kurulum yazısındaki Add-DnsServerResourceRecordA satırını buraya ekleyebilirsin.
Hız: Get-View
Get-VM her VM için zengin bir nesne oluşturuyor ve yüzlerce VM'lik bir ortamda yavaşlıyor. Aynı veriyi doğrudan API nesneleri olarak almak çok daha hızlı:
Get-View -ViewType VirtualMachine -Property Name, Guest.ToolsStatus, Runtime.PowerState |
Where-Object { $_.Runtime.PowerState -eq 'poweredOn' -and $_.Guest.ToolsStatus -ne 'toolsOk' } |
Select-Object Name, @{N='Tools'; E={$_.Guest.ToolsStatus}}Bu, çalışan ama VMware Tools'u eski ya da çalışmayan VM'leri listeliyor. Tools çalışmayan bir VM'de guest customization, düzgün kapatma ve IP bilgisi çalışmıyor. -Property ile sadece gereken alanları istemek, büyük ortamlarda sorguyu saniyelere indiriyor.
Bu script'leri bir Windows sunucusunda zamanlanmış görev olarak çalıştırmak PowerShell yazısındaki yöntemle aynı. Otomasyon ne kadar iyi olursa olsun vCenter'ın kendisi giderse hepsi durur. Serinin son yazısı onun yedeği ve güncellemesi.
Sıradaki yazı: vCenter yedeği ve güncellemesi