ΠŸΡ€ΠΎΠΌΠ΅Π½ΡΠΌΠ΅ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°ΠΌΠ΅ Azure VMs, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ PowerShell

Π‘ PowerShell ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΈ IT администраторитС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π΅ само с on-premises, Π½ΠΎ ΠΈ с ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ инфраструктури, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ с Azure. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Ρ‡Ρ€Π΅Π· PowerShell Π² ΠΌΠ½ΠΎΠ³ΠΎ случаи Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½Π° ΠΈ Π±ΡŠΡ€Π·Π° ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Ρ‡Ρ€Π΅Π· Azure ΠΏΠΎΡ€Ρ‚Π°Π»Π°. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° крос-платформСността 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 Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° Π’Πœ. Π—Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ слСдното рСгулярнo ΠΈΠ·Ρ€Π°Π·Π΅Π½ΠΈΠ΅:
    $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 Π½Π° нашия ΠΎΠ±Π΅ΠΊΡ‚ Π’Πœ ΠΈ Ρ‰Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ΠΌ 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 Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‰ΠΈΡ storage Π°ΠΊΠ°ΡƒΠ½Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Get-AzStorageAccount. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ storage URI, Π·Π° Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ΄Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° blob ΠΈ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Remove-AzStorageBlob Π·Π°Π΅Π΄Π½ΠΎ със storage Π°ΠΊΠ°ΡƒΠ½Ρ‚Π°. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ‰Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π² ΠΊΠΎΠ΄Π°:

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster