Virtuális gép létrehozása Azure-ban

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 valailyen 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 stazur

storage -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 teszt környezet, ezértt 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' -CurrentStorageAcc

ount '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 konfigurciós fájlt töltsük fel, aminek hatására létrejön a viruá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 Window 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 -notm

atch "Open" } | Out-GridView

144 . ábra Windows lemezképek böngésése GridView segítségévl

Az én érdeklődésemet a Windows 2016 Server előzetese érdekel most, azbbó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 inforá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 Standar

d 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. Mertogy 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 myVirtualN

etwork -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öthetü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 álapotá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"

}

 

 

 



Word To HTML Converter