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
151 . á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"
}