Ar PowerShell palÄ«dzÄ«bu inženieri un IT administratori veiksmÄ«gi automatizÄ dažÄdas uzdevumus, strÄdÄjot ne tikai ar on-premises, bet arÄ« ar mÄkoÅu infrastruktÅ«rÄm, konkrÄti, ar Azure. StrÄdÄt caur PowerShell daudzkÄrt ir ÄrtÄk un ÄtrÄk nekÄ caur Azure portÄlu. Pateicoties PowerShell multiplatformmai, to var izmantot jebkurÄ OS.
Nav svarÄ«gi, vai strÄdÄjat ar Ubuntu, Red Hat vai Windows ā PowerShell palÄ«dzÄs kontrolÄt mÄkoÅu resursus. Izmantojot moduli , piemÄram, varat noteikt jebkuras Ä«paŔības virtuÄlajÄm maŔīnÄm.
Å ajÄ rakstÄ mÄs apskatÄ«sim, kÄ var izmantot PowerShell, lai mainÄ«tu VM izmÄru Azure mÄkoÅos, kÄ arÄ« lai dzÄstu VM un ar to saistÄ«tos objektus.

Svarīgi! Neaizmirstiet notīrīt rokas ar dezinfekcijas līdzekli un sagatavoties darbam:
- Jums bÅ«s nepiecieÅ”ams modulis Azure PowerShell Module ā to var lejupielÄdÄt no PowerShell Gallery, izmantojot komandu
Install-Module Az. - Ir jÄautentificÄjas Azure mÄkoÅos, kur darbojas virtuÄlÄ maŔīna, izpildot komandu
Connect-AzAccount.
Vispirms izveidosim skriptu, kas maina Azure VM izmÄru. AtvÄrsim VS Code un saglabÄsim jaunu PowerShell skriptu ar nosaukumu Resize-AzVirtualMachine.ps1 ā tajÄ mÄs paÅ”a piemÄra gaitÄ pievienosim koda gabalus.
Paužam pieejamos VM izmÄrus.
Pirms mainÄt VM izmÄru, ir jÄnoskaidro, kÄdi ir pieejamie izmÄri virtuÄlajÄm maŔīnÄm Azure mÄkoÅos. To var izdarÄ«t, izpildot komandu Get-AzVMSize.
TÄtad, virtuÄlajai maŔīnai devvm01 no resursu grupas dev prasÄm visus iespÄjamÄs izmÄrus:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01(ReÄlos uzdevumos, protams, vietÄ ResourceGroupName=dev un VMName=devvm01 jÅ«s norÄdÄ«sit savas vÄrtÄ«bas Å”iem parametriem.)
Komanda atgriezÄ«s aptuveni Å”Ädu sarakstu:

Tas ir viss iespÄjamais izmÄru varianti, kurus var norÄdÄ«t Å”ai virtuÄlajai maŔīnai.
MainÄm maŔīnas izmÄru
PiemÄram, mÄs mainÄ«sim uz jauno izmÄru Standard_B1ls ā tas ir pirmajÄ vietÄ sarakstÄ augstÄk. (ReÄlos uzdevumos, protams, jÅ«s izvÄlaties jebkuru vajadzÄ«go izmÄru.)
- Vispirms ar komandu
Get-AzVMiegÅ«stam informÄciju par mÅ«su objektu (virtuÄlo maŔīnu), saglabÄjot to mainÄ«gajÄ$virtualMachine:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 - PÄc tam no Ŕī objekta Åemam Ä«paŔību
.HardwareProfile.VmSizeun iestÄdÄm vajadzÄ«go jauno vÄrtÄ«bu:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls" - Un tagad vienkÄrÅ”i izpildÄm VM atjaunoÅ”anas komandu ā
Update-AzVm:Update-AzVM -VM devvm01 -ResourceGroupName dev - PÄrliecinÄmies, ka viss ir izdevies ā tam mÄs atkal pieprasÄm informÄciju par mÅ«su objektu un aplÅ«kojam Ä«paÅ”umu
$virtualMachine.HardwareProfile:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Ja tur redzam Standard_B1ls ā tad viss kÄrtÄ«bÄ, maŔīnas izmÄrs ir mainÄ«ts. Varam doties tÄlÄk un turpinÄt veiksmÄ«gi ā pÄrsayzÄt vairÄkas VM, izmantojot masÄ«vu.
Bet kÄ ir ar VM dzÄÅ”anu Azure?
Ar dzÄÅ”anu nav tik vienkÄrÅ”i un acÄ«mredzami, kÄ varÄtu Ŕķist. Galu galÄ ir jÄdara jÄdzÄÅ” arÄ« vairÄki resursi, kas saistÄ«ti ar Å”o maŔīnu, tostarp:
- Boot diagnostics storage containers
- Network interfaces
- Publiskie IP adreses
- SistÄmas disks un blob, kur tiek glabÄta tÄ statuss
- Dati diski (data disks)
TÄpÄc mÄs izveidosim funkciju un nosauksim to par Remove-AzrVirtualMachine ā un tÄ dzÄsÄ«s ne tikai Azure VM, bet arÄ« visus iepriekÅ” minÄtos.
Iet pa standarta ceļu un vispirms iegÅ«stam mÅ«su objektu (VM) ar komandu Get-AzVm. PiemÄram, lai tÄ bÅ«tu maŔīna WINSRV19 no resursu grupas MyTestVMs.
SaglabÄsim Å”o objektu kopÄ ar visÄm tÄ Ä«paŔībÄm mainÄ«gajÄ $vm:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMsDzÄÅ”am boot diagnostic failu kontu
Izveidojot VM Azure, lietotÄjam tiek piedÄvÄta arÄ« iespÄja izveidot boot diagnostics container, lai, ja ar boot ir problÄmas, bÅ«tu ko izmantot problÄmu risinÄÅ”anÄ. TaÄu, dzÄÅ”ot VM, Å”is konteiners paliek, joprojÄm pastÄvot bezdarbÄ«bÄ. Labosim Å”o situÄciju.
- Vispirms noskaidrosim, kuram storage kontam pieder Å”is konteiners ā tam mÄs meklÄsim Ä«paŔību
storageUrimÅ«su VM objekta iekÅ”ienÄ.DiagnosticsProfileLai to izdarÄ«tu, es izmantoÅ”u Å”Ädu regulÄro izteiksmi:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?:\/\/(.+?)\.').groups[1].value - Tagad jÄsaprot konteinera nosaukums, un tam vajag iegÅ«t VM ID, izmantojot komandu
Get-AzResource:if ($vm.Name.Length -gt 9) { $i = 9 } else { $i = $vm.Name.Length - 1 } $azResourceParams = @{ 'ResourceName' = WINSRV 'ResourceType' = 'Microsoft.Compute\/virtualMachines' 'ResourceGroupName' = MyTestVMs } $vmResource = Get-AzResource @azResourceParams $vmId = $vmResource.Properties.VmId $diagContainerName = ('bootdiagnostics-{0}-{1}' -f $vm.Name.ToLower().Substring(0, $i), $vmId) - TÄlÄk iegÅ«stam resursu grupas nosaukumu, kurai pieder konteiners:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName - Un tagad mums ir viss nepiecieÅ”amais, lai dzÄstu konteineru ar komandu
Remove-AzStorageContainer:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
DzÄÅ”am VM
Tagad izdzÄsÄ«sim paÅ”u virtuÄlo maŔīnu, laimÄ«gÄ kÄrtÄ mÄs jau esam izveidojuÅ”i mainÄ«go $vm attiecÄ«gajam objektam. Nu tad palaidÄ«sim komandu Remove-AzVm:
$null = $vm | Remove-AzVM -ForceDzÄÅ”am tÄ«kla interfeisu un publisko IP adresi
MÅ«su VM ir palikuÅ”i viens (vai pat vairÄki) tÄ«kla interfeisi (NICs) ā lai tos dzÄstu, jo tie vairs nav nepiecieÅ”ami, mÄs pÄrskatÄ«sim Ä«paŔību NetworkInterfaces mÅ«su VM objektÄ un dzÄÅ”am NIC ar komandu Remove-AzNetworkInterface. GadÄ«jumÄ, ja tÄ«kla interfeisu ir vairÄk nekÄ viens, izmantojam ciklu. TurklÄt katram NIC pÄrbaudÄm Ä«paŔību IpConfiguration vai interfeisam ir publiskÄ IP adrese. Ja tÄda tiek atrasta, mÄs to dzÄsÄ«sim ar komandu Remove-AzPublicIpAddress.
Å eit ir piemÄrs tÄdam kodam, kurÄ mÄs ciklÄ izskatÄm visus NICs, tos dzÄÅ”am, pÄrbaudÄm, vai ir publiska IP adrese. Ja tÄda ir, tad analizÄjam Ä«paŔību PublicIpAddress, iegÅ«stam pÄc ID attiecÄ«gÄ resursa nosaukumu un to dzÄÅ”am:
foreach($nicUri in $vm.NetworkProfile.NetworkInterfaces.Id) {
$nic = Get-AzNetworkInterface -ResourceGroupName $vm.ResourceGroupName -Name $nicUri.Split('\/')[-1]
Remove-AzNetworkInterface -Name $nic.Name -ResourceGroupName $vm.ResourceGroupName -Force
foreach($ipConfig in $nic.IpConfigurations) {
if($ipConfig.PublicIpAddress -ne $null) {
Remove-AzPublicIpAddress -ResourceGroupName $vm.ResourceGroupName -Name $ipConfig.PublicIpAddress.Id.Split('\/')[-1] -Force
}
}
}
DzÄÅ”am sistÄmas disku
OS disks ir blobs, kuru dzÄÅ”anai ir komanda Remove-AzStorageBlob ā taÄu pirms tÄs izpildes jÄnorÄda nepiecieÅ”amie parametru vÄrtÄ«bas. TÄdÄļ ir jÄiegÅ«st nosaukums storÄža konteineram, kurÄ ir sistÄmas disks, un tikai tad to nodot Å”ai komandai kopÄ ar atbilstoÅ”o storÄža kontu.
$osDiskUri = $vm.StorageProfile.OSDisk.Vhd.Uri
$osDiskContainerName = $osDiskUri.Split('\/')[-2]
$osDiskStorageAcct = Get-AzStorageAccount | where { $_.StorageAccountName -eq $osDiskUri.Split('\/')[2].Split('.')[0] }
$osDiskStorageAcct | Remove-AzStorageBlob -Container $osDiskContainerName -Blob $osDiskUri.Split('\/')[-1]
DzÄÅ”am sistÄmas diska statusa Blob
Lai to izdarÄ«tu, kÄ jÅ«s jau, iespÄjams, nojauÅ”at, mÄs Åemam storÄža konteineru, kurÄ tiek glabÄts Å”is disks, un, pieÅemot, ka blobs beigÄs satur status, nododam attiecÄ«gos parametrus dzÄÅ”anas komandai Remove-AzStorageBlob:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlobUn, visbeidzot, izdzÄsÄ«sim datu diskus
MÅ«su VM varÄja palikt datu diski, kas tika pievienoti tam. Ja tie nav nepiecieÅ”ami, izdzÄsÄ«sim arÄ« tos. SÄkumÄ analizÄsim StorageProfile mÅ«su VM un atradÄ«sim Ä«paŔību Uri. Ja disku ir vairÄk, organizÄsim ciklu pÄc URI. Ikvienam URI atradÄ«sim atbilstoÅ”o glabÄÅ”anas kontu, izmantojot Get-AzStorageAccount. PÄc tam analizÄsim glabÄÅ”anas URI, lai izceltu nepiecieÅ”amo blob vÄrdu un nodotu to dzÄÅ”anas komandai Remove-AzStorageBlob kopÄ ar glabÄÅ”anas kontu. LÅ«k, kÄ tas izskatÄ«sies kodÄ:
if ($vm.DataDiskNames.Count -gt 0) {
foreach ($uri in $vm.StorageProfile.DataDisks.Vhd.Uri) {
$dataDiskStorageAcct = Get-AzStorageAccount -Name $uri.Split('\/')[2].Split('.')[0]
$dataDiskStorageAcct | Remove-AzStorageBlob -Container $uri.Split('\/')[-2] -Blob $uri.Split('\/')[-1]
}
}
Un nu "mÄs esam nonÄkuÅ”i lÄ«dz laimÄ«gajam iznÄkumam!" Tagad no visiem Å”iem fragmentiem jÄizveido viens vesels. Labais autors Ädams Bertrams atviegloja lietotÄjiem un izdarÄ«ja to pats. LÅ«k, links uz gala skriptu ar nosaukumu Remove-AzrVirtualMachine.ps1:
ā
Ceru, ka Å”ie praktiskie padomi noderÄs, lai ietaupÄ«tu spÄkus, laiku un lÄ«dzekļus, strÄdÄjot ar Azure VM.
Avots: habr.com
