Udostępnij za pośrednictwem


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 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, są opisane tutaj.

W tym przykładzie przedstawiono typową sekcję zasobów 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

Ten przykład opiera się na koncie 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 pokazano 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 kontynuować korzystanie z wcześniejszej 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:

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 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 zapewnienia 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 wykonuje pętlę przez utworzenie liczby maszyn wirtualnych określonych jako parametr:

"copy": {
  "name": "virtualMachineLoop",
  "count": "[parameters('numberOfInstances')]"
},

Zwróć również uwagę, ż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 muszą mieć interfejs sieciowy. 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())]"
],

Resource Manager wdraża równolegle wszystkie zasoby, które nie są zależne od wdrażanego innego zasobu. Podczas ustawiania zależności należy zachować ostrożność, ponieważ wdrożenie można przypadkowo spowolnić, określając niepotrzebne zależności. Zależności mogą łączyć się 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 zależność jest wymagana? 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 innym zasobie (nadrzędnym). 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 z nich są wymagane, a niektóre są opcjonalne. Na przykład elementy hardwareProfile, osProfile, storageProfile i networkProfile są wymagane, ale plik diagnosticsProfile jest opcjonalny. Te profile definiują ustawienia, takie jak:

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ć następującej definicji:

"imageReference": {
  "publisher": "Canonical",
  "offer": "UbuntuServer",
  "sku": "20.04.2-LTS",
  "version": "latest"
},

Uwaga

Odpowiednio zmodyfikuj publisherwartości , offersku 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ń element imageReference i elementy 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. Po ustawieniu rozmiaru maszyn wirtualnych 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 dodane 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 do wywołania innych skryptów programu PowerShell w usłudze Azure Storage. W tym 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 ustawieniach Rozszerzenia w portalu:

Uzyskiwanie stanu rozszerzenia

Informacje o rozszerzeniu można również uzyskać za pomocą polecenia Get-AzVMExtension programu PowerShell, rozszerzenia maszyny wirtualnej get interfejsu wiersza polecenia platformy Azure lub interfejsu API REST uzyskiwania informacji o rozszerzeniu .

Wdrożenia

Podczas wdrażania szablonu platforma Azure śledzi zasoby wdrożone jako grupę 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 Azure Portal:

Pobieranie informacji o wdrożeniu

Nie jest to problem z użyciem tego samego szablonu do tworzenia zasobów lub aktualizowania istniejących zasobów. Gdy używasz poleceń do wdrażania szablonów, możesz powiedzieć, którego trybu chcesz użyć. Tryb można ustawić na Wartość Ukończone lub Przyrostowe. Wartością domyślną jest wykonywanie aktualizacji przyrostowych. Zachowaj ostrożność podczas korzystania z trybu ukończenia , ponieważ możesz przypadkowo usunąć zasoby. Po ustawieniu trybu na Ukończono Resource Manager usuwa wszystkie zasoby w grupie zasobów, które nie są w szablonie.

Następne kroki