ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Azure VM с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PowerShell

Използвайки PowerShell, ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΈ ИВ администраторитС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ работят Π½Π΅ само с Π»ΠΎΠΊΠ°Π»Π½ΠΈ, Π½ΠΎ ΠΈ с ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ инфраструктури, ΠΏΠΎ-спСциално с Azure. Π’ някои случаи Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΏΡ€Π΅Π· PowerShell Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡƒΠ΄ΠΎΠ±Π½Π° ΠΈ ΠΏΠΎ-Π±ΡŠΡ€Π·Π° ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΏΡ€Π΅Π· ΠΏΠΎΡ€Ρ‚Π°Π»Π° Azure. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° своята ΠΌΠ΅ΠΆΠ΄ΡƒΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π° ΠΏΡ€ΠΈΡ€ΠΎΠ΄Π°, PowerShell ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π° всяка ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π° систСма.

НСзависимо Π΄Π°Π»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ubuntu, Red Hat ΠΈΠ»ΠΈ Windows, PowerShell ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Ρ‚Π΅ ΠΎΠ±Π»Π°Ρ‡Π½ΠΈΡ‚Π΅ рСсурси. ИзползванС Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π° Azure PowerShell, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ всякакви свойства Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ PowerShell Π·Π° прСоразмСряванС Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Azure, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅Ρ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина ΠΈ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ‚Π΅ с нСя ΠΎΠ±Π΅ΠΊΡ‚ΠΈ.

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Azure VM с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PowerShell

Π’Π°ΠΆΠ½ΠΎ! НС забравяйтС Π΄Π° ΠΈΠ·Π±ΡŠΡ€ΡˆΠ΅Ρ‚Π΅ Ρ€ΡŠΡ†Π΅Ρ‚Π΅ си с Π΄Π΅Π·ΠΈΠ½Ρ„Π΅ΠΊΡ‚Π°Π½Ρ‚, Π·Π° Π΄Π° сС ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ‚Π΅ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°:

  • Π©Π΅ Π²ΠΈ трябва ΠΌΠΎΠ΄ΡƒΠ» ΠœΠΎΠ΄ΡƒΠ» Azure PowerShell - ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ ΠΎΡ‚ PowerShell Gallery с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Install-Module Az.
  • Врябва Π΄Π° сС удостовСритС Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Azure, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Connect-AzAccount.

ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° създадСм скрипт, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ прСоразмСрява Azure VM. НСка ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ VS Code ΠΈ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π½ΠΎΠ² скрипт Π½Π° PowerShell, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠŸΡ€Π΅ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€ΡΠ²Π°Π½Π΅-AzVirtualMachine.ps1 β€” Ρ‰Π΅ добавямС части ΠΎΡ‚ ΠΊΠΎΠ΄ към Π½Π΅Π³ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π°ΠΏΡ€Π΅Π΄Π²Π°.

ИскамС Π½Π°Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ VM Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈ

ΠŸΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° VM, трябва Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΈ са ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈ Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠ±Π»Π°ΠΊΠ° Π½Π° Azure. Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π°, трябва Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Get-AzVMSize.

И Ρ‚Π°ΠΊΠ° Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина devvm01 ΠΎΡ‚ рСсурсна Π³Ρ€ΡƒΠΏΠ° Π”Π΅Π² ИзисквамС всички възмоТни ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΈ:

Get-AzVMSize -ResourceGroupName dev -VMName devvm01

(ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, вмСсто ResourceGroupName=dev ΠΈ VMName=devvm01 Π²ΠΈΠ΅ Ρ‰Π΅ посочитС свои собствСни стойности Π·Π° Ρ‚Π΅Π·ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ.)

ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Ρ‰Π΅ Π²ΡŠΡ€Π½Π΅ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

ΠœΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Π½Π° Azure VM с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° PowerShell

Π’ΠΎΠ²Π° са всички възмоТни ΠΎΠΏΡ†ΠΈΠΈ Π·Π° Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π·Π° Π΄Π°Π΄Π΅Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина.

НСка ΠΏΡ€Π΅ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€ΠΈΠΌ ΠΊΠΎΠ»Π°Ρ‚Π°

НапримСр Ρ‰Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π΄ΠΎ Π½ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚_B1ls - Ρ‚ΠΎΠΉ Π΅ Π½Π° ΠΏΡŠΡ€Π²ΠΎ място Π² списъка ΠΏΠΎ-Π³ΠΎΡ€Π΅. (Π’ прилоТСнията Π² рСалния ΠΆΠΈΠ²ΠΎΡ‚, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Π²ΠΈΠ΅ ΠΈΠ·Π±ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊΡŠΠ²Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ.)

  1. ΠŸΡŠΡ€Π²ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Get-AzVM ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ информация Π·Π° нашия ΠΎΠ±Π΅ΠΊΡ‚ (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина), ΠΊΠ°Ρ‚ΠΎ я ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°ΠΌΠ΅ Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° $virtualMachine:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
  2. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ собствСността ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ .HardwareProfile.VmSize ΠΈ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ΠΆΠ΅Π»Π°Π½Π°Ρ‚Π° Π½ΠΎΠ²Π° стойност:
    $virtualMachine.HardwareProfile.VmSize = "Standard_B1ls"
  3. И сСга просто изпълнявамС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° VM update - Update-AzVm:
    Update-AzVM -VM devvm01 -ResourceGroupName dev
  4. УвСрявамС сС, Ρ‡Π΅ всичко Π΅ ΠΌΠΈΠ½Π°Π»ΠΎ Π΄ΠΎΠ±Ρ€Π΅ - Π·Π° Ρ†Π΅Π»Ρ‚Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ изисквамС информация Π·Π° нашия ΠΎΠ±Π΅ΠΊΡ‚ ΠΈ ΠΎΠ³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΈΠΌΠΎΡ‚Π° $virtualMachine.HardwareProfile:
    $virtualMachine = Get-AzVM -ResourceGroupName dev -VMName devvm01
    $virtualMachine.HardwareProfile

Ако Π²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΌ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚_B1ls - Ρ‚ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ всичко Π΅ Π½Π°Ρ€Π΅Π΄, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΊΠΎΠ»Π°Ρ‚Π° Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ‡ ΠΈ Π΄Π° Π½Π°Π΄Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ успСха си, ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΡ€Π°Π·ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ няколко Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини навСднъТ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° масив.

Какво Ρ‰Π΅ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина Π² Azure?

Π‘ ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π΅ всичко Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° просто ΠΈ ясно, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°. Π’ ΠΊΡ€Π°ΠΉΠ½Π° смСтка Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ Ρ€Π΅Π΄ΠΈΡ†Π° рСсурси, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с Ρ‚Π°Π·ΠΈ машина, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ:

  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° диагностика Π½Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅
  • ΠœΡ€Π΅ΠΆΠΎΠ²ΠΈ интСрфСйси
  • ΠŸΡƒΠ±Π»ΠΈΡ‡Π½ΠΈ IP адрСси
  • БистСмСн диск ΠΈ ΠΏΠ΅Ρ‚Π½ΠΎ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ
  • ДисковС с Π΄Π°Π½Π½ΠΈ

Π—Π°Ρ‚ΠΎΠ²Π° Ρ‰Π΅ създадСм функция ΠΈ Ρ‰Π΅ я ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ Remove-AzrVirtualMachine - ΠΈ Ρ‰Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ Π½Π΅ само Azure VM, Π½ΠΎ ΠΈ всичко ΠΏΠΎ-Π³ΠΎΡ€Π΅.

Π’ΡŠΡ€Π²ΠΈΠΌ ΠΏΠΎ стандартния Π½Π°Ρ‡ΠΈΠ½ ΠΈ ΠΏΡŠΡ€Π²ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ нашия ΠΎΠ±Π΅ΠΊΡ‚ (VM) с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Get-AzVm. НапримСр, Π½Π΅ΠΊΠ° Π΄Π° Π΅ ΠΊΠΎΠ»Π° WINSRV19 ΠΎΡ‚ рСсурсна Π³Ρ€ΡƒΠΏΠ° MyTestVMs.

НСка Π·Π°ΠΏΠ°Π·ΠΈΠΌ Ρ‚ΠΎΠ·ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ Π·Π°Π΅Π΄Π½ΠΎ с всичкитС ΠΌΡƒ свойства Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° $vm:

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

ΠŸΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° с диагностични Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅

ΠšΠΎΠ³Π°Ρ‚ΠΎ създава VM Π² Azure, потрСбитСлят ΡΡŠΡ‰ΠΎ Π΅ ΠΏΠΎΠΌΠΎΠ»Π΅Π½ Π΄Π° създадС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π° ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅ Π½Π° диагностика Π·Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π° диагностика Π½Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅), Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π°ΠΊΠΎ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ със Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ, Π΄Π° ΠΈΠΌΠ° Π½Π΅Ρ‰ΠΎ, към ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π° сС ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π·Π° отстраняванС Π½Π° нСизправности. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина бъдС ΠΈΠ·Ρ‚Ρ€ΠΈΡ‚Π°, Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ остава Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π±Π΅Π·Ρ†Π΅Π»Π½ΠΎΡ‚ΠΎ си ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Π½Π΅. НСка ΠΎΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚Π°Π·ΠΈ ситуация.

  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

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ΠΌ самата Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ смС създали ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° $vm Π·Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ‚. Π•, Π½Π΅ΠΊΠ° изпълним ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Remove-AzVm:

$null = $vm | Remove-AzVM -Force

ΠŸΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° мрСТовия интСрфСйс ΠΈ публичния IP адрСс

ΠΠ°ΡˆΠ°Ρ‚Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина всС ΠΎΡ‰Π΅ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ (ΠΈΠ»ΠΈ Π΄ΠΎΡ€ΠΈ няколко) ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ интСрфСйса (NIC) - Π·Π° Π΄Π° Π³ΠΈ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ ΠΊΠ°Ρ‚ΠΎ Π½Π΅Π½ΡƒΠΆΠ½ΠΈ, Π½Π΅ΠΊΠ° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡ€Π΅Π· собствСността NetworkInterfaces нашия VM ΠΎΠ±Π΅ΠΊΡ‚ ΠΈ ΠΈΠ·Ρ‚Ρ€ΠΈΠΉΡ‚Π΅ NIC с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Remove-AzNetworkInterface. Π’ случай, Ρ‡Π΅ ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΅Π΄ΠΈΠ½ ΠΌΡ€Π΅ΠΆΠΎΠ² интСрфСйс, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ†ΠΈΠΊΡŠΠ». Π’ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° всСки NIC Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ собствСността IpConfiguration Π·Π° Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Π΄Π°Π»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡŠΡ‚ ΠΈΠΌΠ° ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ IP адрСс. Ако бъдС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ Ρ‚Π°ΠΊΡŠΠ², Ρ‰Π΅ Π³ΠΎ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ΠΌ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Remove-AzPublicIpAddress.

Π•Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΡŠΠ² ΠΊΠΎΠ΄, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΏΡ€Π΅Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ всички NIC Π² Ρ†ΠΈΠΊΡŠΠ», ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°ΠΌΠ΅ Π³ΠΈ ΠΈ провСрявамС Π΄Π°Π»ΠΈ ΠΈΠΌΠ° ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ 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
        }
    }
}

ΠŸΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° систСмния диск

OS Π΄ΠΈΡΠΊΡŠΡ‚ Π΅ ΠΏΠ΅Ρ‚Π½ΠΎ, Π·Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ 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]

ΠŸΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅ Π½Π° ΠΏΠ΅Ρ‚Π½ΠΎΡ‚ΠΎ Π·Π° ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅Ρ‚ΠΎ Π½Π° систСмния диск

Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, ΠΊΠ°ΠΊΡ‚ΠΎ вСроятно Π²Π΅Ρ‡Π΅ сС досСщатС, Π½ΠΈΠ΅ Π²Π·Π΅ΠΌΠ°ΠΌΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Ρ‚ΠΎΠ·ΠΈ диск, ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΏΠ΅Ρ‚Π½ΠΎΡ‚ΠΎ Π² края ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° status, ΠΏΡ€Π΅Π΄Π°ΠΉΡ‚Π΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ Remove-AzStorageBlob:

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

И накрая ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π°ΠΌΠ΅ дисковСтС с Π΄Π°Π½Π½ΠΈ

ΠΠ°ΡˆΠ°Ρ‚Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина всС ΠΎΡ‰Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° дисковС с Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΏΡ€ΠΈΠΊΠ°Ρ‡Π΅Π½ΠΈ към нСя. Ако Π½Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ, Ρ‰Π΅ ΠΈΠ·Ρ‚Ρ€ΠΈΠ΅ΠΌ ΠΈ тях. НСка ΠΏΡŠΡ€Π²ΠΎ Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ StorageProfile Π½Π°ΡˆΠ°Ρ‚Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина ΠΈ Π½Π°ΠΌΠ΅Ρ€Π΅Ρ‚Π΅ ΠΈΠΌΠΎΡ‚Π° Uri. Ако ΠΈΠΌΠ° няколко диска, ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Ρ†ΠΈΠΊΡŠΠ» спорСд URI. Π—Π° всСки URI Ρ‰Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ Π°ΠΊΠ°ΡƒΠ½Ρ‚ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Get-AzStorageAccount. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ URI Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, Π·Π° Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ ΠΆΠ΅Π»Π°Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° blob ΠΈ Π΄Π° Π³ΠΎ ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅ 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]
    }
}

И сСга β€žΡΡ‚ΠΈΠ³Π½Π°Ρ…ΠΌΠ΅ щастливия ΠΊΡ€Π°ΠΉ!β€œ Π‘Π΅Π³Π° трябва Π΄Π° сглобим Π΅Π΄Π½ΠΎ цяло ΠΎΡ‚ всички Ρ‚Π΅Π·ΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ. Π›ΡŽΠ±Π΅Π·Π½ΠΈΡΡ‚ Π°Π²Ρ‚ΠΎΡ€ Адам Π‘Π΅Ρ€Ρ‚Ρ€Π°ΠΌ сС срСщна с ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π°ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΠΈ Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ сам. Π•Ρ‚ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° към крайния скрипт, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ ΠŸΡ€Π΅ΠΌΠ°Ρ…Π²Π°Π½Π΅-AzrVirtualMachine.ps1:

β†’ GitHub

Надявам сС, Ρ‡Π΅ Π½Π°ΠΌΠΈΡ€Π°Ρ‚Π΅ Ρ‚Π΅Π·ΠΈ практичСски ΡΡŠΠ²Π΅Ρ‚ΠΈ Π·Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΈ, Π·Π° Π΄Π° Π²ΠΈ спСстят усилия, Π²Ρ€Π΅ΠΌΠ΅ ΠΈ ΠΏΠ°Ρ€ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ с Azure VM.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€