ИзмСняСм ΠΈ удаляСм Azure VMs, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PowerShell

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PowerShell ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Ρ‹ ΠΈ IT-администраторы ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с on-premises, Π½ΠΎ ΠΈ с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌΠΈ инфраструктурами, Π² частности, с Azure. Π Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· PowerShell Π² рядС случаСв Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈ быстрСС, Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Azure portal. Благодаря кросс-платформСнности PowerShell ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π»ΡŽΠ±Ρ‹Ρ… ОБ.

НСваТно, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ с Ubuntu, Red Hat ΠΈΠ»ΠΈ Windows β€” PowerShell ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Π΅ рСсурсы. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Azure PowerShell, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ свойства Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PowerShell, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π’Πœ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ Azure, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π’Πœ ΠΈ ассоциированныС с Π½Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹.

ИзмСняСм ΠΈ удаляСм Azure VMs, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PowerShell

Π’Π°ΠΆΠ½ΠΎ! НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΡ€ΠΎΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ Ρ€ΡƒΠΊΠΈ санитайзСром ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅:

  • Π’Π°ΠΌ понадобится ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Azure PowerShell Module β€” Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ· PowerShell Gallery ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Install-Module Az.
  • НуТно Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ Azure, Π³Π΄Π΅ крутится Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Connect-AzAccount.

Для Π½Π°Ρ‡Π°Π»Π° создадим скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСсайзит Azure VM. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ VS Code ΠΈ сохраним Π½ΠΎΠ²Ρ‹ΠΉ PowerShell скрипт ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Resize-AzVirtualMachine.ps1 β€” Π² Π½Π΅Π³ΠΎ ΠΌΡ‹ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ куски ΠΊΠΎΠ΄Π°.

Π—Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π’Πœ

Π”ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π’Πœ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ допустимыС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΎΠ±Π»Π°ΠΊΠ΅ Azure. Для этого Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Get-AzVMSize.

Π˜Ρ‚Π°ΠΊ, для Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ devvm01 ΠΈΠ· рСсурсной Π³Ρ€ΡƒΠΏΠΏΡ‹ dev Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ всСвозмоТныС допустимыС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(Π’ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ…, СстСствСнно, вмСсто ResourceGroupName=dev ΠΈ VMName=devvm01 Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ свои значСния этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².)

Команда Π²Π΅Ρ€Π½Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ:

ИзмСняСм ΠΈ удаляСм Azure VMs, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PowerShell

Π­Ρ‚ΠΎ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

РСсайзим ΠΌΠ°ΡˆΠΈΠ½Ρƒ

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ сдСлаСм рСсайз Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Standard_B1ls β€” ΠΎΠ½ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ мСстС Π² спискС Π²Ρ‹ΡˆΠ΅. (Π’ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ…, разумССтся, Π²Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ любой Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π²Π°ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€.)

  1. Π‘Π½Π°Ρ‡Π°Π»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Get-AzVM ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ свСдСния ΠΎ нашСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС), сохраняя ΠΈΡ… Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Π—Π°Ρ‚Π΅ΠΌ Ρƒ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π΅Ρ€Π΅ΠΌ свойство .HardwareProfile.VmSize ΠΈ устанавливаСм Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ просто выполняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ обновлСния Π’Πœ β€” Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. УбСТдаСмся, Ρ‡Ρ‚ΠΎ всё ΠΏΡ€ΠΎΡˆΠ»ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ β€” для этого ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ нашСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΈ смотрим Π½Π° свойство $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Если Ρ‚Π°ΠΌ Π²ΠΈΠ΄ΠΈΠΌ Standard_B1ls β€” Π·Π½Π°Ρ‡ΠΈΡ‚, всё Π² порядкС, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. МоТно ΠΏΠΎΠΉΡ‚ΠΈ дальшС ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΡŒ успСх β€” Π·Π°Ρ€Π΅ΡΠ°ΠΉΠ·ΠΈΡ‚ΡŒ сразу нСсколько Π’Πœ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ массив.

А Ρ‡Ρ‚ΠΎ насчСт удалСния Π’Πœ Π² Azure?

Π‘ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ всё Ρ‚Π°ΠΊ просто ΠΈ прямолинСйно, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. Π’Π΅Π΄ΡŒ Π½Π°Π΄ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ряд рСсурсов, ассоциированных с этой машиной, Π² Ρ‚ΠΎΠΌ числС:

  • Π‘Ρ‚ΠΎΡ€Π°Π΄ΠΆ-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ для диагностики Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (Boot diagnostics storage containers)
  • Π‘Π΅Ρ‚Π΅Π²Ρ‹Π΅ интСрфСйсы
  • ΠŸΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ IP адрСса
  • БистСмный диск ΠΈ blob, Π³Π΄Π΅ хранится Π΅Π³ΠΎ статус
  • Диски с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (data disks)

ΠŸΠΎΡΠ΅ΠΌΡƒ ΠΌΡ‹ создадим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π΅ Remove-AzrVirtualMachine β€” ΠΈ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Azure VM, Π½ΠΎ ΠΈ всС Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½ΠΎΠ΅.

Π˜Π΄Ρ‘ΠΌ стандартным ΠΏΡƒΡ‚Π΅ΠΌ ΠΈ сначала ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ наш ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (Π’Πœ) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Get-AzVm. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡƒΡΡ‚ΡŒ это Π±ΡƒΠ΄Π΅Ρ‚ машина WINSRV19 ΠΈΠ· рСсурсной Π³Ρ€ΡƒΠΏΠΏΡ‹ MyTestVMs.

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ вмСстС со всСми Π΅Π³ΠΎ свойствами Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $vm:

$vm = Get-AzVm -Name WINSRV19 -ResourceGroupName MyTestVMs

УдаляСм ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ диагностики Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

ΠŸΡ€ΠΈ создании Π’Πœ Π² Azure ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ прСдлагаСтся Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для хранСния диагностики Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (boot diagnostics container), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΊΠ°Ρ… с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π±Ρ‹Π»ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚Ρ€Π°Π±Π»ΡˆΡƒΡ‚ΠΈΠ½Π³Π°. Однако ΠΏΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π’Πœ этот ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ остаСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ своС Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±Π΅ΡΡ†Π΅Π»ΡŒΠ½ΠΎΠ΅ сущСствованиС. Π˜ΡΠΏΡ€Π°Π²ΠΈΠΌ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

  1. Π‘ΠΏΠ΅Ρ€Π²Π° выясним, ΠΊΠ°ΠΊΠΎΠΌΡƒ сторадТ-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρƒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ этот ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ β€” для этого Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ‹ΡΠΊΠ°Ρ‚ΡŒ свойство storageUri Π² Π½Π΅Π΄Ρ€Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° DiagnosticsProfile нашСй Π’Πœ. Для этого я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:
    $diagSa = [regex]::match($vm.DiagnosticsProfile.bootDiagnostics.storageUri, '^http[s]?://(.+?)\.').groups[1].value
  2. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°Π΄ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ имя ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° для этого Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ VM ID с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ 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)
    
  3. Π”Π°Π»Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ имя рСсурсной Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€:
    $diagSaRg = (Get-AzStorageAccount | where { $_.StorageAccountName -eq $diagSa }).ResourceGroupName
  4. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ нас Π΅ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Remove-AzStorageContainer:
    $saParams = @{
        'ResourceGroupName' = $diagSaRg
        'Name' = $diagSa
    }
     
    Get-AzStorageAccount @saParams | Get-AzStorageContainer | where { $_.Name-eq $diagContainerName } | Remove-AzStorageContainer -Force

УдаляСм Π’Πœ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠ΄Π°Π»ΠΈΠΌ собствСнно Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ, Π±Π»Π°Π³ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ создали ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ $vm для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π§Ρ‚ΠΎ ΠΆ, запустим ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Remove-AzVm:

$null = $vm | Remove-AzVM -Force

УдаляСм сСтСвой интСрфСйс ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ IP-адрСс

Π£ нашСй Π’Πœ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ ΠΎΠ΄ΠΈΠ½ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ нСсколько) сСтСвых интСрфСйсов (NICs) β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΡ… Π·Π° Π½Π΅Π½ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ, пройдСмся ΠΏΠΎ свойству NetworkInterfaces нашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° VM ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ NIC ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Remove-AzNetworkInterface. На случай, Ссли сСтСвых интСрфСйсов Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ». Π—Π°ΠΎΠ΄Π½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ NIC ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ свойство IpConfiguration Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ интСрфСйса ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ IP адрСс. Π‘ΡƒΠ΄Π΅ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠΉ обнаруТится, ΡƒΠ΄Π°Π»ΠΈΠΌ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Remove-AzPublicIpAddress.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π³Π΄Π΅ ΠΌΡ‹ Π² Ρ†ΠΈΠΊΠ»Π΅ просматриваСм всС NICs, удаляСм ΠΈΡ…, провСряСм, имССтся Π»ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ IP. Если Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ парсим свойство PublicIpAddress, достаСм ΠΏΠΎ ID имя ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ рСсурса ΠΈ удаляСм Π΅Π³ΠΎ:


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
        }
    }
}

УдаляСм систСмный диск

Диск ОБ прСдставляСт собой blob, для удалСния ΠΊΠΎΠ΅Π³ΠΎ имССтся ΠΊΠΎΠΌΠ°Π½Π΄Π° Remove-AzStorageBlob β€” Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ значСния Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ. Для этого, Π² частности, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ имя сторадТ-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, содСрТащСго систСмный диск, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΡƒΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ вмСстС с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ сторадТ-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ.

$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]

УдаляСм Blob статуса систСмного диска

Для этого, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ навСрняка догадались, ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ сторадТ-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранится Π΄Π°Π½Π½Ρ‹ΠΉ диск, ΠΈ, подразумСвая, Ρ‡Ρ‚ΠΎ blob Π² ΠΊΠΎΠ½Ρ†Π΅ содСрТит status, ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ удалСния Remove-AzStorageBlob:

$osDiskStorageAcct | Get-AzStorageBlob -Container $osDiskContainerName -Blob "$($vm.Name)*.status" | Remove-AzStorageBlob

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, удаляСм диски с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

Π£ нашСй Π’Πœ ΠΌΠΎΠ³Π»ΠΈ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ диски с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΊ Π½Π΅ΠΉ ΠΏΡ€ΠΈΠ°Ρ‚Ρ‚Π°Ρ‡Π΅Π½Ρ‹. Если Π² Π½ΠΈΡ… Π½Π΅Ρ‚ нСобходимости, ΡƒΠ΄Π°Π»ΠΈΠΌ ΠΈ ΠΈΡ… Ρ‚ΠΎΠΆΠ΅. Π‘Π½Π°Ρ‡Π°Π»Π° распарсим StorageProfile нашСй Π’Πœ ΠΈ Π½Π°ΠΉΠ΄Π΅ΠΌ свойство Uri. Если дисков нСсколько, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΡƒΠ΅ΠΌ Ρ†ΠΈΠΊΠ» ΠΏΠΎ URI. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ URI Π½Π°ΠΉΠ΄Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ сторадТ-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Get-AzStorageAccount. Π—Π°Ρ‚Π΅ΠΌ распарсим storage URI, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ имя blob-a ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ удалСния Remove-AzStorageBlob вмСстС со сторадТ-Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠΌ. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅:

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]
    }
}

И Π²ΠΎΡ‚ β€œΠΌΡ‹ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ счастливого ΠΊΠΎΠ½Ρ†Π°!” Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ· всСх этих Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π°Π΄ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅. Π”ΠΎΠ±Ρ€Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΡ€ Адам Π‘Π΅Ρ€Ρ‚Ρ€Π°ΠΌ пошСл навстрСчу ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈ сдСлал это сам. Π’ΠΎΡ‚ ссылочка Π½Π° ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ скрипт ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Remove-AzrVirtualMachine.ps1:

β†’ GitHub

НадСюсь, Ρ‡Ρ‚ΠΎ эти практичСскиС совСты пригодятся Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ силы, врСмя ΠΈ срСдства ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Azure VMs.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com