Met behulp van PowerShell kunnen ingenieurs en IT-beheerders met succes verschillende taken automatiseren wanneer ze niet alleen met on-premises werken, maar ook met cloudinfrastructuren, in het bijzonder met Azure. In sommige gevallen is het werken via PowerShell veel handiger en sneller dan het werken via de Azure portal. Dankzij het platformonafhankelijke karakter kan PowerShell op elk besturingssysteem worden gebruikt.
Of u nu Ubuntu, Red Hat of Windows gebruikt, PowerShell kan u helpen uw cloudbronnen te beheren. Gebruik van de module
In dit artikel bekijken we hoe u PowerShell kunt gebruiken om het formaat van een virtuele machine in de Azure-cloud te wijzigen, en om een virtuele machine en de bijbehorende objecten te verwijderen.
Belangrijk! Vergeet niet uw handen af te vegen met een ontsmettingsmiddel ter voorbereiding op het werk:
- Je hebt een module nodig Azure PowerShell-module - het kan worden gedownload van PowerShell Gallery met de opdracht
Install-Module Az
. - U moet zich verifiëren in de Azure-cloud waar de virtuele machine wordt uitgevoerd door de opdracht uit te voeren
Connect-AzAccount
.
Laten we eerst een script maken waarmee de grootte van een Azure-VM wordt aangepast. Laten we VS Code openen en een nieuw PowerShell-script opslaan met de naam Formaat wijzigen-AzVirtualMachine.ps1 — we zullen er stukjes code aan toevoegen naarmate het voorbeeld vordert.
Wij vragen de beschikbare VM-groottes op
Voordat u de VM-grootte wijzigt, moet u weten wat de acceptabele grootten zijn voor virtuele machines in de Azure-cloud. Om dit te doen, moet u de opdracht uitvoeren Get-AzVMSize
.
Dus voor de virtuele machine devvm01 uit de resourcegroep dev Wij vragen alle mogelijke acceptabele maten:
Get-AzVMSize -ResourceGroupName dev -VMName devvm01
(Bij echte problemen natuurlijk, in plaats van ResourceGroupName=ontwikkelaar и VMNaam=devvm01 u specificeert uw eigen waarden voor deze parameters.)
Het commando retourneert ongeveer dit:
Dit zijn allemaal mogelijke grootte-opties die voor een bepaalde virtuele machine kunnen worden ingesteld.
Laten we de auto groter maken
We passen het formaat bijvoorbeeld aan naar een nieuw formaat Standaard_B1ls - hij staat op de eerste plaats op de bovenstaande lijst. (In echte toepassingen kiest u natuurlijk de maat die u nodig heeft.)
- Gebruik eerst het commando
Get-AzVM
we krijgen informatie over ons object (virtuele machine) door het in een variabele op te slaan$virtualMachine
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
- Vervolgens nemen we de eigendom van dit object
.HardwareProfile.VmSize
en stel de gewenste nieuwe waarde in:$virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
- En nu voeren we eenvoudigweg de opdracht VM-update uit -
Update-AzVm
:Update-AzVM -VM devvm01 -ResourceGroupName dev
- Wij zorgen ervoor dat alles goed is gegaan. Hiervoor vragen wij opnieuw informatie op over ons object en bekijken we de woning
$virtualMachine.HardwareProfile
:$virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01 $virtualMachine.HardwareProfile
Als we het daar zien Standaard_B1ls - dat betekent dat alles in orde is, de grootte van de auto is gewijzigd. U kunt nog verder gaan en voortbouwen op uw succes door de grootte van meerdere VM's tegelijk aan te passen met behulp van een array.
Hoe zit het met het verwijderen van een virtuele machine in Azure?
Met verwijdering is niet alles zo eenvoudig en duidelijk als het lijkt. Het is immers noodzakelijk om een aantal bronnen te verwijderen die aan deze machine zijn gekoppeld, waaronder:
- Opslagcontainers voor diagnostische gegevens over opstarten
- Netwerk interfaces
- Openbare IP-adressen
- Systeemschijf en blob waar de status ervan wordt opgeslagen
- Gegevensschijven
Daarom zullen we een functie maken en deze aanroepen Remove-AzrVirtualMachine
- en het zal niet alleen Azure VM verwijderen, maar ook al het bovenstaande.
We gaan op de standaardmanier en halen eerst ons object (VM) op met behulp van de opdracht Get-AzVm
. Laat het bijvoorbeeld een auto zijn WINSRV19 uit de resourcegroep MijnTestVM's.
Laten we dit object samen met al zijn eigenschappen opslaan in een variabele $vm
:
$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs
De container met diagnostische opstartbestanden verwijderen
Bij het maken van een VM in Azure wordt de gebruiker ook gevraagd om een container te maken voor het opslaan van opstartdiagnostiek (boot diagnostics container), zodat als er problemen zijn met het opstarten, er iets is waar hij terecht kan voor het oplossen van problemen. Wanneer de VM echter wordt verwijderd, kan deze container zijn nu doelloze bestaan voortzetten. Laten we deze situatie oplossen.
- Laten we eerst eens kijken tot welk opslagaccount deze container behoort. Hiervoor moeten we de eigenschap vinden
storageUri
in de ingewanden van het objectDiagnosticsProfile
onze VM. Om dit te doen gebruik ik deze reguliere expressie:$diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
- Nu moet je de naam van de container achterhalen, en hiervoor moet je de VM-ID ophalen met behulp van de opdracht
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)
- Vervolgens krijgen we de naam van de resourcegroep waartoe de container behoort:
$diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
- En nu hebben we alles wat we nodig hebben om de container met de opdracht te verwijderen
Remove-AzStorageContainer
:$saParams = @{ 'ResourceGroupName' = $diagSaRg 'Name' = $diagSa } Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force
De virtuele machine verwijderen
Laten we nu de virtuele machine zelf verwijderen, omdat we al een variabele hebben gemaakt $vm
voor het bijbehorende object. Laten we het commando uitvoeren Remove-AzVm
:
$null = $vm | Remove-AzVM -Force
De netwerkinterface en het openbare IP-adres verwijderen
Onze VM heeft nog steeds één (of zelfs meerdere) netwerkinterfaces (NIC's). Om ze als onnodig te verwijderen, gaan we door de eigenschap NetworkInterfaces
ons VM-object en verwijder de NIC met de opdracht Remove-AzNetworkInterface
. Als er meer dan één netwerkinterface is, gebruiken we een lus. Tegelijkertijd zullen we voor elke NIC de eigendom controleren IpConfiguration
om te bepalen of de interface een openbaar IP-adres heeft. Als er een wordt gevonden, verwijderen we deze met het commando Remove-AzPublicIpAddress
.
Hier is een voorbeeld van zo'n code, waarbij we alle NIC's in een lus bekijken, ze verwijderen en controleren of er een openbaar IP-adres is. Als dat het geval is, parseert u de eigenschap PublicIpAddress
, zoek de naam van de overeenkomstige bron op ID en verwijder deze:
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
}
}
}
De systeemschijf verwijderen
De besturingssysteemschijf is een blob, waarvoor een opdracht bestaat om deze te verwijderen Remove-AzStorageBlob
- maar voordat u het uitvoert, moet u de vereiste waarden voor de parameters instellen. Om dit in het bijzonder te doen, moet u de naam ophalen van de opslagcontainer die de systeemschijf bevat, en deze vervolgens samen met het bijbehorende opslagaccount doorgeven aan deze opdracht.
$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]
De statusblob van de systeemschijf verwijderen
Om dit te doen, zoals je waarschijnlijk al geraden had, nemen we de opslagcontainer waarin deze schijf is opgeslagen, en, wat impliceert dat de blob aan het einde status
, geef de overeenkomstige parameters door aan de verwijderopdracht Remove-AzStorageBlob
:
$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob
En ten slotte verwijderen we de gegevensschijven
Onze VM kan nog steeds schijven hebben met daaraan gekoppelde gegevens. Als ze niet nodig zijn, verwijderen we ze ook. Laten we het eerst analyseren StorageProfile
onze VM en vind de woning Uri
. Als er meerdere schijven zijn, organiseren we een cyclus volgens URI
. Voor elke URI vinden we het bijbehorende opslagaccount met behulp van Get-AzStorageAccount
. Parseer vervolgens de opslag-URI om de gewenste blobnaam te extraheren en deze door te geven aan de verwijderopdracht Remove-AzStorageBlob
samen met een opslagaccount. Dit is hoe het er in code uit zou zien:
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]
}
}
En nu “hebben we het gelukkige einde bereikt!” Nu moeten we uit al deze fragmenten één geheel samenstellen. De vriendelijke auteur Adam Bertram ontmoette de gebruikers halverwege en deed het zelf. Hier is een link naar het uiteindelijke script genaamd Verwijder-AzrVirtualMachine.ps1:
→
Ik hoop dat u deze praktische tips nuttig vindt om u moeite, tijd en geld te besparen bij het werken met Azure VM's.
Bron: www.habr.com