Maszyny wirtualne w szablonie usługi Azure Resource Manager
Dotyczy: ✔️ maszyny wirtualne z systemem Windows
W tym artykule opisano aspekty szablonu usługi Azure Resource Manager, które mają zastosowanie do maszyn wirtualnych. W tym artykule nie opisano kompletnego szablonu tworzenia maszyny wirtualnej; w tym celu potrzebne są definicje zasobów dla kont magazynu, interfejsów sieciowych, publicznych adresów IP i sieci wirtualnych. Aby uzyskać więcej informacji na temat sposobu definiowania tych zasobów razem, zobacz przewodnik po szablonie usługi Resource Manager.
W galerii znajduje się wiele szablonów zawierających zasób maszyny wirtualnej. Nie wszystkie elementy, które można uwzględnić w szablonie, zostały opisane tutaj.
W tym przykładzie przedstawiono typową sekcję zasobu szablonu do tworzenia określonej liczby maszyn wirtualnych:
"resources": [
{
"apiVersion": "2016-04-30-preview",
"type": "Microsoft.Compute/virtualMachines",
"name": "[concat('myVM', copyindex())]",
"location": "[resourceGroup().location]",
"copy": {
"name": "virtualMachineLoop",
"count": "[parameters('numberOfInstances')]"
},
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/myNIC', copyindex())]"
],
"properties": {
"hardwareProfile": {
"vmSize": "Standard_DS1"
},
"osProfile": {
"computername": "[concat('myVM', copyindex())]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter",
"version": "latest"
},
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
},
"dataDisks": [
{
"name": "[concat('myDataDisk', copyindex())]",
"diskSizeGB": "100",
"lun": 0,
"createOption": "Empty"
}
]
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex()))]"
}
]
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": "true",
"storageUri": "[concat('https://', variables('storageName'), '.blob.core.windows.net')]"
}
}
},
"resources": [
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2016-03-30",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'),
variables('wadmetricsresourceid'),
concat('myVM', copyindex()),
variables('wadcfgxend')))]",
"storageAccount": "[variables('storageName')]"
},
"protectedSettings": {
"storageAccountName": "[variables('storageName')]",
"storageAccountKey": "[listkeys(variables('accountid'),
'2015-06-15').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
},
{
"name": "MyCustomScriptExtension",
"type": "extensions",
"apiVersion": "2016-03-30",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.7",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat('https://', variables('storageName'),
'.blob.core.windows.net/customscripts/start.ps1')]"
],
"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
}
}
}
]
}
]
Uwaga
W tym przykładzie jest używane konto magazynu, które zostało wcześniej utworzone. Konto magazynu można utworzyć, wdrażając je na podstawie szablonu. Przykład opiera się również na interfejsie sieciowym i jego zasobach zależnych, które zostałyby zdefiniowane w szablonie. Te zasoby nie są wyświetlane w przykładzie.
Wersja interfejsu API
Podczas wdrażania zasobów przy użyciu szablonu należy określić wersję interfejsu API do użycia. W przykładzie przedstawiono zasób maszyny wirtualnej przy użyciu tego elementu apiVersion:
"apiVersion": "2016-04-30-preview",
Wersja interfejsu API określonego w szablonie ma wpływ na właściwości, które można zdefiniować w szablonie. Ogólnie rzecz biorąc, podczas tworzenia szablonów należy wybrać najnowszą wersję interfejsu API. W przypadku istniejących szablonów możesz zdecydować, czy chcesz nadal używać starszej wersji interfejsu API, czy zaktualizować szablon dla najnowszej wersji, aby korzystać z nowych funkcji.
Skorzystaj z tych możliwości, aby uzyskać najnowsze wersje interfejsu API:
- Interfejs API REST — wyświetlanie listy wszystkich dostawców zasobów
- PowerShell — Get-AzResourceProvider
- Interfejs wiersza polecenia platformy Azure — az provider show
Parametry i zmienne
Parametry ułatwiają określanie wartości szablonu podczas jego uruchamiania. Ta sekcja parametrów jest używana w przykładzie:
"parameters": {
"adminUsername": { "type": "string" },
"adminPassword": { "type": "securestring" },
"numberOfInstances": { "type": "int" }
},
Podczas wdrażania przykładowego szablonu należy wprowadzić wartości nazwy i hasła konta administratora na każdej maszynie wirtualnej oraz liczbę maszyn wirtualnych do utworzenia. Istnieje możliwość określenia wartości parametrów w osobnym pliku zarządzanym za pomocą szablonu lub podanie wartości po wyświetleniu monitu.
Zmienne ułatwiają konfigurowanie wartości w szablonie, które są używane wielokrotnie w nim lub które mogą się zmieniać w czasie. Ta sekcja zmiennych jest używana w przykładzie:
"variables": {
"storageName": "mystore1",
"accountid": "[concat('/subscriptions/', subscription().subscriptionId,
'/resourceGroups/', resourceGroup().name,
'/providers/','Microsoft.Storage/storageAccounts/', variables('storageName'))]",
"wadlogs": "<WadCfg>
<DiagnosticMonitorConfiguration overallQuotaInMB=\"4096\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2010/10/DiagnosticsConfiguration\">
<DiagnosticInfrastructureLogs scheduledTransferLogLevelFilter=\"Error\"/>
<WindowsEventLog scheduledTransferPeriod=\"PT1M\" >
<DataSource name=\"Application!*[System[(Level = 1 or Level = 2)]]\" />
<DataSource name=\"Security!*[System[(Level = 1 or Level = 2)]]\" />
<DataSource name=\"System!*[System[(Level = 1 or Level = 2)]]\" />
</WindowsEventLog>",
"wadperfcounters": "<PerformanceCounters scheduledTransferPeriod=\"PT1M\">
<PerformanceCounterConfiguration counterSpecifier=\"\\Process(_Total)\\Thread Count\" sampleRate=\"PT15S\" unit=\"Count\">
<annotation displayName=\"Threads\" locale=\"en-us\"/>
</PerformanceCounterConfiguration>
</PerformanceCounters>",
"wadcfgxstart": "[concat(variables('wadlogs'), variables('wadperfcounters'),
'<Metrics resourceId=\"')]",
"wadmetricsresourceid": "[concat('/subscriptions/', subscription().subscriptionId,
'/resourceGroups/', resourceGroup().name ,
'/providers/', 'Microsoft.Compute/virtualMachines/')]",
"wadcfgxend": "\"><MetricAggregation scheduledTransferPeriod=\"PT1H\"/>
<MetricAggregation scheduledTransferPeriod=\"PT1M\"/>
</Metrics></DiagnosticMonitorConfiguration>
</WadCfg>"
},
Podczas wdrażania przykładowego szablonu wartości zmiennych są używane dla nazwy i identyfikatora wcześniej utworzonego konta magazynu. Zmienne są również używane do udostępniania ustawień rozszerzenia diagnostycznego. Skorzystaj z najlepszych rozwiązań dotyczących tworzenia szablonów usługi Azure Resource Manager, aby ułatwić podjęcie decyzji o sposobie struktury parametrów i zmiennych w szablonie.
Pętle zasobów
Jeśli potrzebujesz więcej niż jednej maszyny wirtualnej dla aplikacji, możesz użyć elementu copy w szablonie. Ten opcjonalny element tworzy pętle przez utworzenie liczby maszyn wirtualnych określonych jako parametr:
"copy": {
"name": "virtualMachineLoop",
"count": "[parameters('numberOfInstances')]"
},
Zwróć również uwagę na to, że w przykładzie indeks pętli jest używany podczas określania niektórych wartości zasobu. Jeśli na przykład wprowadzono liczbę wystąpień wynoszącą trzy, nazwy dysków systemu operacyjnego to myOSDisk1, myOSDisk2 i myOSDisk3:
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
}
Uwaga
W tym przykładzie użyto dysków zarządzanych dla maszyn wirtualnych.
Pamiętaj, że utworzenie pętli dla jednego zasobu w szablonie może wymagać użycia pętli podczas tworzenia lub uzyskiwania dostępu do innych zasobów. Na przykład wiele maszyn wirtualnych nie może używać tego samego interfejsu sieciowego, więc jeśli szablon zapętla się przez tworzenie trzech maszyn wirtualnych, musi również pętli przez tworzenie trzech interfejsów sieciowych. Podczas przypisywania interfejsu sieciowego do maszyny wirtualnej indeks pętli służy do identyfikowania go:
"networkInterfaces": [ {
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex()))]"
} ]
Zależności
Większość zasobów zależy od innych zasobów do poprawnego działania. Maszyny wirtualne muszą być skojarzone z siecią wirtualną i aby to zrobić, wymaga interfejsu sieciowego. Element dependsOn służy do upewnienia się, że interfejs sieciowy jest gotowy do użycia przed utworzeniem maszyn wirtualnych:
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', 'myNIC', copyindex())]"
],
Usługa Resource Manager wdraża równolegle wszystkie zasoby, które nie są zależne od innego wdrażanego zasobu. Podczas ustawiania zależności należy zachować ostrożność, ponieważ nieumyślnie spowalniaj wdrożenie, określając niepotrzebne zależności. Zależności mogą łączyć łańcuchy za pośrednictwem wielu zasobów. Na przykład interfejs sieciowy zależy od publicznego adresu IP i zasobów sieci wirtualnej.
Jak sprawdzić, czy wymagana jest zależność? Przyjrzyj się wartościom ustawionym w szablonie. Jeśli element w definicji zasobu maszyny wirtualnej wskazuje inny zasób wdrożony w tym samym szablonie, potrzebna jest zależność. Na przykład przykładowa maszyna wirtualna definiuje profil sieciowy:
"networkProfile": {
"networkInterfaces": [ {
"id": "[resourceId('Microsoft.Network/networkInterfaces',
concat('myNIC', copyindex())]"
} ]
},
Aby ustawić tę właściwość, interfejs sieciowy musi istnieć. W związku z tym potrzebna jest zależność. Należy również ustawić zależność, gdy jeden zasób (element podrzędny) jest zdefiniowany w ramach innego zasobu (nadrzędnego). Na przykład ustawienia diagnostyczne i niestandardowe rozszerzenia skryptu są definiowane jako zasoby podrzędne maszyny wirtualnej. Nie można ich utworzyć, dopóki maszyna wirtualna nie istnieje. W związku z tym oba zasoby są oznaczone jako zależne od maszyny wirtualnej.
Profile
Podczas definiowania zasobu maszyny wirtualnej jest używanych kilka elementów profilu. Niektóre są wymagane, a niektóre są opcjonalne. Na przykład wymagane są elementy hardwareProfile, osProfile, storageProfile i networkProfile, ale plik diagnosticsProfile jest opcjonalny. Te profile definiują ustawienia, takie jak:
- rozmiar
- nazwa i poświadczenia
- ustawienia dysku i systemu operacyjnego
- interfejs sieciowy
- diagnostyka rozruchu
Dyski i obrazy
Na platformie Azure pliki vhd mogą reprezentować dyski lub obrazy. Gdy system operacyjny w pliku VHD jest wyspecjalizowany jako określona maszyna wirtualna, jest określany jako dysk. Gdy system operacyjny w pliku vhd jest uogólniony do użycia do tworzenia wielu maszyn wirtualnych, jest określany jako obraz.
Tworzenie nowych maszyn wirtualnych i nowych dysków na podstawie obrazu platformy
Podczas tworzenia maszyny wirtualnej musisz zdecydować, jakiego systemu operacyjnego użyć. Element imageReference służy do definiowania systemu operacyjnego nowej maszyny wirtualnej. W przykładzie przedstawiono definicję systemu operacyjnego Windows Server:
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter",
"version": "latest"
},
Jeśli chcesz utworzyć system operacyjny Linux, możesz użyć tej definicji:
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "20.04.2-LTS",
"version": "latest"
},
Uwaga
Zmodyfikuj publisher
odpowiednio wartości , offer
sku
i version
.
Ustawienia konfiguracji dysku systemu operacyjnego są przypisywane z elementem osDisk. W przykładzie zdefiniowano nowy dysk zarządzany z trybem buforowania ustawionym na ReadWrite i tworzonym na podstawie obrazu platformy:
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"caching": "ReadWrite",
"createOption": "FromImage"
},
Tworzenie nowych maszyn wirtualnych na podstawie istniejących dysków zarządzanych
Jeśli chcesz utworzyć maszyny wirtualne z istniejących dysków, usuń elementy imageReference i osProfile i zdefiniuj następujące ustawienia dysku:
"osDisk": {
"osType": "Windows",
"managedDisk": {
"id": "[resourceId('Microsoft.Compute/disks', [concat('myOSDisk', copyindex())])]"
},
"caching": "ReadWrite",
"createOption": "Attach"
},
Tworzenie nowych maszyn wirtualnych na podstawie obrazu zarządzanego
Jeśli chcesz utworzyć maszynę wirtualną na podstawie obrazu zarządzanego, zmień element imageReference i zdefiniuj następujące ustawienia dysku:
"storageProfile": {
"imageReference": {
"id": "[resourceId('Microsoft.Compute/images', 'myImage')]"
},
"osDisk": {
"name": "[concat('myOSDisk', copyindex())]",
"osType": "Windows",
"caching": "ReadWrite",
"createOption": "FromImage"
}
},
Dołączanie dysków danych
Opcjonalnie możesz dodać dyski danych do maszyn wirtualnych. Liczba dysków zależy od rozmiaru używanego dysku systemu operacyjnego. Jeśli rozmiar maszyn wirtualnych jest ustawiony na Standard_DS1_v2, maksymalna liczba dysków danych, które można dodać do nich, wynosi dwa. W tym przykładzie do każdej maszyny wirtualnej jest dodawany jeden dysk danych zarządzanych:
"dataDisks": [
{
"name": "[concat('myDataDisk', copyindex())]",
"diskSizeGB": "100",
"lun": 0,
"caching": "ReadWrite",
"createOption": "Empty"
}
],
Rozszerzenia
Mimo że rozszerzenia są oddzielnym zasobem, są ściśle powiązane z maszynami wirtualnymi. Rozszerzenia można dodać jako zasób podrzędny maszyny wirtualnej lub jako oddzielny zasób. W przykładzie pokazano rozszerzenie diagnostyki dodawane do maszyn wirtualnych:
{
"name": "Microsoft.Insights.VMDiagnosticsSettings",
"type": "extensions",
"location": "[resourceGroup().location]",
"apiVersion": "2016-03-30",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Azure.Diagnostics",
"type": "IaaSDiagnostics",
"typeHandlerVersion": "1.5",
"autoUpgradeMinorVersion": true,
"settings": {
"xmlCfg": "[base64(concat(variables('wadcfgxstart'),
variables('wadmetricsresourceid'),
concat('myVM', copyindex()),
variables('wadcfgxend')))]",
"storageAccount": "[variables('storageName')]"
},
"protectedSettings": {
"storageAccountName": "[variables('storageName')]",
"storageAccountKey": "[listkeys(variables('accountid'),
'2015-06-15').key1]",
"storageAccountEndPoint": "https://core.windows.net"
}
}
},
Ten zasób rozszerzenia używa zmiennej storageName i zmiennych diagnostycznych do podawania wartości. Jeśli chcesz zmienić dane zbierane przez to rozszerzenie, możesz dodać więcej liczników wydajności do zmiennej wadperfcounters. Możesz również umieścić dane diagnostyczne na innym koncie magazynu niż miejsce przechowywania dysków maszyn wirtualnych.
Istnieje wiele rozszerzeń, które można zainstalować na maszynie wirtualnej, ale najbardziej przydatne jest prawdopodobnie rozszerzenie niestandardowego skryptu. W tym przykładzie skrypt programu PowerShell o nazwie start.ps1 jest uruchamiany na każdej maszynie wirtualnej po pierwszym uruchomieniu:
{
"name": "MyCustomScriptExtension",
"type": "extensions",
"apiVersion": "2016-03-30",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
],
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.7",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"[concat('https://', variables('storageName'),
'.blob.core.windows.net/customscripts/start.ps1')]"
],
"commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File start.ps1"
}
}
}
Skrypt start.ps1 może wykonywać wiele zadań konfiguracyjnych. Na przykład dyski danych dodawane do maszyn wirtualnych w przykładzie nie są inicjowane; Możesz użyć niestandardowego skryptu, aby je zainicjować. Jeśli masz wiele zadań uruchamiania do wykonania, możesz użyć pliku start.ps1, aby wywołać inne skrypty programu PowerShell w usłudze Azure Storage. W przykładzie użyto programu PowerShell, ale możesz użyć dowolnej metody skryptów dostępnej w używanym systemie operacyjnym.
Stan zainstalowanych rozszerzeń można wyświetlić w obszarze Ustawienia rozszerzeń w portalu:
Informacje o rozszerzeniu można również uzyskać przy użyciu polecenia Get-AzVMExtension programu PowerShell, rozszerzenia maszyny wirtualnej pobierz polecenie interfejsu wiersza polecenia platformy Azure lub interfejsu API REST Uzyskiwanie informacji o rozszerzeniu.
Wdrożenia
Podczas wdrażania szablonu platforma Azure śledzi zasoby wdrożone jako grupa i automatycznie przypisuje nazwę do tej wdrożonej grupy. Nazwa wdrożenia jest taka sama jak nazwa szablonu.
Jeśli interesuje Cię stan zasobów we wdrożeniu, wyświetl grupę zasobów w witrynie Azure Portal:
Nie jest to problem, aby użyć tego samego szablonu do utworzenia zasobów lub zaktualizowania istniejących zasobów. Gdy używasz poleceń do wdrażania szablonów, możesz powiedzieć, który tryb ma być używany. Tryb można ustawić na Wartość Ukończone lub Przyrostowe. Wartość domyślna to wykonywanie aktualizacji przyrostowych. Należy zachować ostrożność podczas korzystania z trybu ukończenia , ponieważ możesz przypadkowo usunąć zasoby. Po ustawieniu trybu na Ukończono usługa Resource Manager usuwa wszystkie zasoby w grupie zasobów, które nie są w szablonie.
Następne kroki
- Utwórz własny szablon przy użyciu szablonów usługi Azure Resource Manager.
- Wdróż szablon utworzony przy użyciu polecenia Utwórz maszynę wirtualną z systemem Windows przy użyciu szablonu usługi Resource Manager.
- Dowiedz się, jak zarządzać utworzonymi maszynami wirtualnymi, przeglądając artykuł Tworzenie maszyn wirtualnych z systemem Windows i zarządzanie nimi za pomocą modułu Azure PowerShell.
- Aby zapoznać się ze składnią JSON i właściwościami typów zasobów w szablonach, zobacz Dokumentacja szablonu usługi Azure Resource Manager.