Azure kezelése PowerShellből: Virtuális gép létrehozása

Most, hogy már be tudunk lépni az Azure előfizetésünkbe távolról, automatizált módon, itt az idő, hogy az előfizetésünkhöz tartozó szolgáltatásokat igénybe vegyük. A számos szolgáltatás közül most csak egyet mutatok be, egy virtuális gép létrehozását, de a többi erőforrás kezelése is hasonló elveken és módszereken alapul.

Elsőként vizsgáljuk meg kicsit jobban az előfizetésünket:

PS C:\> Get-AzureSubscription

SubscriptionId            : 5a218e0c-d090-4421-a254-5bef1fa83c9d

SubscriptionName          : Free Trial

Environment               : AzureCloud

SupportedModes            : AzureServiceManagement

DefaultAccount            : 5E5B430A444F747038D91A739B24D1D8254DD530

Accounts                  : {5E5B430A444F747038D91A739B24D1D8254DD530}

IsDefault                 : True

IsCurrent                 : True

CurrentStorageAccountName :

TenantId                  :

Miután a virtuális gép tárhely-szolgáltatást is igényel, hiszen a virtuális meghajtóhoz valamilyen tárhelyre lesz szükségünk, így a fenti üres CurrentStorageAccountName tulajdonságot tartalommal kell megtölteni:

PS C:\> New-AzureStorageAccount -StorageAccountName stazurstorage -Label stazurstorage -Location “West Europe” -Type Standard_LRS

OperationDescription       OperationId               OperationStatus

——————–       ———–               —————

New-AzureStorageAccount    32eedad6-1c0b-a6fd-a3e… Succeeded

Az új tárhelyfiók létrehozásához meg kell adni annak nevét, a tárolás fizikai helyét és a típusát. Miután ez itt nekem csak egy kis tesztkörnyezet, ezért az LRS, azaz a Locally Redundant Storage típus bőven elég, nem kell globálisan redundáns tároló.

Ha megvan a tárhelyfiókom, akkor azt össze kell rendelni az előfizetéssel, így már látható, hogy a CurrentStorageAccountName tulajdonságban már ott a tárhelyfiókom:

PS C:\> Set-AzureSubscription -SubscriptionName ‘Free Trial’ -CurrentStorageAccount ‘stazurstorage’

PS C:\> Get-AzureSubscription

SubscriptionId            : 5a218e0c-d090-4421-a254-5bef1fa83c9d

SubscriptionName          : Free Trial

Environment               : AzureCloud

SupportedModes            : AzureServiceManagement

DefaultAccount            : 5E5B430A444F747038D91A739B24D1D8254DD530

Accounts                  : {5E5B430A444F747038D91A739B24D1D8254DD530}

IsDefault                 : True

IsCurrent                 : True

CurrentStorageAccountName : stazurstorage

TenantId                  :

Virtuális gép létrehozásának másik előfeltétele a virtuális hálózat létrehozása. Igaz, ez nem kötelező akkor, ha teljesen független „standalone” gépekkel megelégszünk, de ha ezeket össze akarjuk kötni a felhőben, esetleg egy tartományi környezetet akarunk létrehozni, akkor mindenképpen saját virtuális hálózatot kell létrehoznunk.

Ha lekérdezzük az alaphelyzet szerinti hálózatokat, akkor nem kapunk semmit sem:

PS C:\> Get-AzureVNetConfig

PS C:\>

Sajnos virtuális hálózat közvetlen létrehozására nincs cmdlet — remélem, ez az Azure modul későbbi verzióiban változni fog. Most sajnos csak az a lehetőség áll rendelkezésre, hogy egy XML dokumentumban megadjuk a virtuális hálózatunk adatait, majd ezt a konfigurációs fájlt töltsük fel, aminek hatására létrejön a virtuális hálózatunk.

Az XML konfigurációs fájl szerkezete az alábbi:

$workingVnetConfig = [xml] ‘<?xml version=”1.0″ encoding=”utf-8″?>

<NetworkConfiguration xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration”>

<VirtualNetworkConfiguration>
<VirtualNetworkSites>
<VirtualNetworkSite>
<AddressSpace>
</AddressSpace>
<Subnets>
<Subnet>
</Subnet>
</Subnets>

</VirtualNetworkSite>
</VirtualNetworkSites>
</VirtualNetworkConfiguration>

</NetworkConfiguration>’

Ebbe kell betenni azokat az XML node-okat és attribútumokat, amelyek a hálózat különböző tulajdonságait adják meg.

Az alábbi kóddal megadom a VirtualNetworkSite nevét és helyét, az AddressSpace-be felveszem a címtartományt, a Subnet alá pedig az alhálózatomat annak a címtartományával:

$NetworkSite = $workingVnetConfig.GetElementsByTagName(“VirtualNetworkSite”)

$NetworkSite.SetAttribute(“name”,“myVirtualNetwork”)

$NetworkSite.SetAttribute(“Location”,“West Europe”)

$AddressSpace = $workingVnetConfig.GetElementsByTagName(“AddressSpace”)

$newAddressPrefix = $workingVnetConfig.CreateElement(“AddressPrefix”,“http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration”)

$newAddressPrefix.InnerText=“10.10.0.0/8”

[void] $AddressSpace.appendchild($newAddressPrefix)

$subnet = $workingVnetConfig.GetElementsByTagName(“Subnet”)

$Subnet.SetAttribute(“name”,“myVirtSubnet”)

$newAddressPrefix = $workingVnetConfig.CreateElement(“AddressPrefix”,“http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration”)

$newAddressPrefix.InnerText=“10.10.0.0/24”

[void] $Subnet.appendchild($newAddressPrefix)

Mindezek után az egész XML dokumentumot elmentem egy fájlba, majd ezt feltöltöm, mint AzureVNetConfig:

$tempFileName = $env:TEMP + “\azurevnetconfig.netcfg”

$workingVnetConfig.save($tempFileName)

set-AzureVNetConfig -configurationpath $tempFileName

Ezek után már a Get-AzureVNetConfig is fog eredményt adni:

PS C:\> Get-AzureVNetConfig

XMLConfiguration    OperationDescriptio OperationId         OperationStatus

                    n

—————-    ——————- ———–         —————

<?xml version=”1… Get-AzureVNetConfig c6c088ab-f299-a1… Succeeded

Ugyan a lényeg most is XML formátumban van az XMLConfiguration tulajdonság alatt:

PS C:\> $vnetconfig = (Get-AzureVNetConfig).XMLConfiguration

PS C:\> $vnetconfig

<?xml version=”1.0″ encoding=”utf-8″?>

<NetworkConfiguration xmlns:xsd=”http://www.w3.org/2001/XMLSchema” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration”>

  <VirtualNetworkConfiguration>

    <Dns />

    <VirtualNetworkSites>

      <VirtualNetworkSite name=”myVirtualNetwork” Location=”West Europe”>

        <AddressSpace>

<AddressPrefix>10.10.0.0/8</AddressPrefix>

        </AddressSpace>

        <Subnets>

          <Subnet name=”myVirtSubnet”>

            <AddressPrefix>10.10.0.0/24</AddressPrefix>

          </Subnet>

        </Subnets>

      </VirtualNetworkSite>

    </VirtualNetworkSites>

  </VirtualNetworkConfiguration>

</NetworkConfiguration>

Most, hogy megvan a tárhelyfiókunk és a hálózatunk, elkezdhetjük kiválasztani, hogy melyik előre elkészített lemezkép alapján szeretnénk virtuális gépet létrehozni. Itt a bőség zavara fog hatalmába keríteni, hiszen több száz gép közül választhatunk:

PS C:\> $images = Get-AzureVMImage

PS C:\> $images.Count

517

Itt nem csak Windows gépek, hanem Linux, Oracle szerver és számtalan egyéb gép közül válogathatunk. Ha csak a Windows gépekre vagyunk kíváncsiak, akkor is a gridview segítségére is szükségünk lehet a böngészéshez:

PS C:\> $images | Where-Object {$_.os -eq “Windows” -and $_.PublisherName -notmatch “Open” } | Out-GridView

AzureVMImages

Az én érdeklődésemet a Windows 2016 Server előzetese keltette fel most, abból szeretnék virtuális gépet létrehozni. Ez az egy gép, aminek nevében most éppen a „Preview” szó szerepel, így erre szűrve egyértelműen megadhatom, hogy mire is gondolok:

PS C:\> $winserverprev = $images | Where-Object {$_.ImageFamily -match “Preview”}

Ezek után össze kell rakni a gép konfigurációját, nevet kell adni neki és ki kell választani az erőforrás-csomagok közül az igényeinknek megfelelőt. Mivel ez csak egy kísérletezésre használt gép lesz, így a Basic_A1 szint tökéletesen megfelelő lesz számomra. Ugyanitt, a New-AzureVMConfig paranccsal lehet megadni a lemezképet is, amit az elébb választottam ki:

PS C:\> $VMConfig = New-AzureVMConfig -Name “WinServPrev10” -InstanceSize Basic_A1 -ImageName $winserverprev.ImageName

PS C:\> $VMConfig

AvailabilitySetName               :

ConfigurationSets                 : {}

DataVirtualHardDisks              : {}

Label                             : WinServPrev10

OSVirtualHardDisk                 : Microsoft.WindowsAzure.Commands.ServiceMan

                                    agement.Model.OSVirtualHardDisk

RoleName                          : WinServPrev10

RoleSize                          : Basic_A1

RoleType                          : PersistentVMRole

WinRMCertificate                  :

X509Certificates                  :

NoExportPrivateKey                : False

NoRDPEndpoint                     : False

NoSSHEndpoint                     : False

DefaultWinRmCertificateThumbprint :

ProvisionGuestAgent               : True

ResourceExtensionReferences       :

DataVirtualHardDisksToBeDeleted   :

VMImageInput                      :

Ehhez a konfigurációhoz hozzá kell még adni a telepítéssel kapcsolatos információkat is, úgymint az időzóna, a rendszergazda felhasználóneve és jelszava, valamint hogy melyik alhálózatba szeretnénk tenni. Ezeket az információkat egy csővezeték segítségével kell hozzáfűzni a $VMConfig változómban tárolt konfigurációs adatokhoz, és az egészből lesz a telepítési adatokat megadó $VMProvision objektum:

PS C:\> $VMProvision = $VMConfig |

>>     Add-AzureProvisioningConfig -Windows -TimeZone “Central European Standard Time” -Password PaSSw0rd! -AdminUsername soostibor |

>>             Set-AzureSubnet -SubnetNames myVirtSubnet

Ha fix IP-címet szeretnék a gépemhez rendelni, akkor a New-AzureReservedIP cmdlettel készíthetek egy foglalást. Merthogy ez a fix IP valójában nem igazi fix IP lesz, hanem az Azure által szolgáltatott DHCP fogja a fix címet a gépünk számára biztosítani:

PS C:\> New-AzureReservedIP -ReservedIPName MyIP -Location “West Europe”

OperationDescription       OperationId               OperationStatus

——————–       ———–               —————

New-AzureReservedIP        e2a47b44-7c76-af0d-bf1… Succeeded

Az Azure-ban a virtuális gépek és egyéb szolgáltatások hibatűrő módon üzemeltethetők. Hasonló infrastruktúrát vehetünk igénybe, mint egy fürtözött rendszerben. Ehhez definiálnunk kell egy AzureService-t, amiben majd a virtuális gépünk üzemelni fog:

PS C:\> New-AzureService -ServiceName WinServPrevService -Location “West Europe”

OperationDescription       OperationId               OperationStatus

——————–       ———–               —————

New-AzureService           6806667b-4fe7-a2f4-8b7… Succeeded

Most már tényleg kezdődhet a telepítés, a $VMProvision objektumot betoljuk a New-AzureVM cmdletbe, megadva az Azure szolgáltatás és foglalt IP adatait:

PS C:\> $VMProvision | New-AzureVM -Location “West Europe” -VNetName myVirtualNetwork -ReservedIPName MyIP -ServiceName WinServPrevService

WARNING: The specified DNS name is already taken.

OperationDescription       OperationId               OperationStatus

——————–       ———–               —————

New-AzureVM                dad57c3e-f5a5-ac30-adb… Succeeded

Ha ezek után lekérdezzük a virtuális gépeinket, akkor már láthatóvá válik az épülő gépünk, de még a státusa „Provisioning”:

PS C:\> Get-AzureVM

ServiceName                Name                      Status

———–                —-                      ——

WinServPrevService         WinServPrev10             Provisioning

Kb. 10-15 perc múlva azonban már kész lett a gép és már fut is:

PS C:\> Get-AzureVM

ServiceName                Name                      Status

———–                —-                      ——

WinServPrevService         WinServPrev10             ReadyRole

Ekkor már be lehet jelentkezni RDP-n keresztül a gépbe. Ehhez segítséget ad a Get-AzureRemoteDesktopFile cmdlet, ami a Remote Desktop kliens számára állítja elő a kapcsolódáshoz szükséges rdp fájlt:

Get-AzureVM |
ForEach-Object {
Get-AzureRemoteDesktopFile -Name $_.name -ServiceName $_.ServiceName -LocalPath
$env:temp\$($_.name).rdp”

    ii $env:temp\$($_.name).rdp”

}

A fenti példa akár több virtuális gép esetén is működik, ilyenkor az összeshez előállítja az rdp fájl és mindegyikhez elindul a Remote Desktop bejelentkezés.

Mire lehet még szükségünk ilyen teszt virtuális gépekkel kapcsolatban? Például le lehet őket állítani, hogy ne fogyjon az előfizetésünkhöz tartozó keretösszeg feleslegesen:

workflow Stop-AllVMs {

    $VMs = Get-AzureVM

    foreach -parallel ($VM in $VMs){

        Stop-AzureVM -Name $vm.Name -ServiceName $vm.ServiceName -Force

    }

}

Stop-AllVMs

Vagy el lehet indítani őket, ha ismét játszani szeretnénk velük:

workflow Start-AllVMs {

    $VMs = Get-AzureVM

foreach -parallel ($VM in $VMs){

        Start-AzureVM -Name $vm.Name -ServiceName $vm.ServiceName

    }

}

Start-AllVMs

Illetve összeköthetjük az indítást és a bejelentkezést. Itt egy konkrét gép esetében az indítás után figyelem egy ciklussal a gép állapotát, és ha már teljesen elindult, akkor indítom az RDP bejelentkezést:

while((($vm = Get-AzureVM -Name WinServPrev10 -ServiceName WinServPrevService)).Status -ne “ReadyRole”){

    $vm

    Start-Sleep 10

}

get-azurevm -Name WinServPrev10 -ServiceName  WinServPrevService |

    %{ Get-AzureRemoteDesktopFile -Name $_.name -ServiceName $_.ServiceName -LocalPath $env:temp\$($_.name).rdp”

    ii $env:temp\$($_.name).rdp”

}

Ebben és az előző részben távoli kapcsolaton keresztül futtattam PowerShell kifejezéseket az Azure automatizálására. A következő részben az Azure-on belüli automatizálás lehetőségeibe pillantunk be.

– ST –

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.