Virtuele machines in een Azure Resource Manager-sjabloon

Van toepassing op: ✔️ Windows-VM's

In dit artikel worden aspecten van een Azure Resource Manager-sjabloon beschreven die van toepassing zijn op virtuele machines. In dit artikel wordt geen volledige sjabloon beschreven voor het maken van een virtuele machine. hiervoor hebt u resourcedefinities nodig voor opslagaccounts, netwerkinterfaces, openbare IP-adressen en virtuele netwerken. Zie de Resource Manager sjabloon voor meer informatie over hoe deze resources samen kunnen worden gedefinieerd.

Er zijn veel sjablonen in de galerie die de VM-resource bevatten. Niet alle elementen die in een sjabloon kunnen worden opgenomen, worden hier beschreven.

In dit voorbeeld ziet u een typische resourcesectie van een sjabloon voor het maken van een opgegeven aantal VM's:

"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"
          }
        }
      }
    ]
  }
]

Notitie

Dit voorbeeld is afhankelijk van een opslagaccount dat eerder is gemaakt. U kunt het opslagaccount maken door het te implementeren vanuit de sjabloon. Het voorbeeld is ook afhankelijk van een netwerkinterface en de afhankelijke resources die in de sjabloon worden gedefinieerd. Deze resources worden niet weergegeven in het voorbeeld.

API-versie

Wanneer u resources implementeert met behulp van een sjabloon, moet u een versie van de API opgeven die u wilt gebruiken. In het voorbeeld ziet u de virtuele-machineresource met behulp van dit apiVersion-element:

"apiVersion": "2016-04-30-preview",

De versie van de API die u opgeeft in uw sjabloon, is van invloed op de eigenschappen die u in de sjabloon kunt definiëren. Over het algemeen moet u de meest recente API-versie selecteren bij het maken van sjablonen. Voor bestaande sjablonen kunt u beslissen of u een eerdere API-versie wilt blijven gebruiken of uw sjabloon wilt bijwerken voor de nieuwste versie om te profiteren van nieuwe functies.

Gebruik deze mogelijkheden om de nieuwste API-versies op te halen:

Parameters en variabelen

Met parameters kunt u eenvoudig waarden voor de sjabloon opgeven wanneer u deze uitvoert. Deze parametersectie wordt gebruikt in het voorbeeld:

"parameters": {
  "adminUsername": { "type": "string" },
  "adminPassword": { "type": "securestring" },
  "numberOfInstances": { "type": "int" }
},

Wanneer u de voorbeeldsjabloon implementeert, voert u waarden in voor de naam en het wachtwoord van het beheerdersaccount op elke VM en het aantal virtuele machines dat moet worden gemaakt. U kunt parameterwaarden opgeven in een afzonderlijk bestand dat wordt beheerd met de sjabloon of waarden opgeven wanneer u hierom wordt gevraagd.

Met variabelen kunt u eenvoudig waarden instellen in de sjabloon die herhaaldelijk worden gebruikt of die in de loop van de tijd kunnen veranderen. Deze sectie met variabelen wordt gebruikt in het voorbeeld:

"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>"
},

Wanneer u de voorbeeldsjabloon implementeert, worden variabele waarden gebruikt voor de naam en id van het eerder gemaakte opslagaccount. Variabelen worden ook gebruikt om de instellingen voor de diagnostische extensie op te geven. Gebruik de best practices voor het maken van Azure Resource Manager-sjablonen om u te helpen bepalen hoe u de parameters en variabelen in uw sjabloon wilt structureren.

Resourcelussen

Wanneer u meer dan één virtuele machine voor uw toepassing nodig hebt, kunt u een kopieerelement in een sjabloon gebruiken. Dit optionele element doorloopt het maken van het aantal VM's dat u als parameter hebt opgegeven:

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

In het voorbeeld ziet u ook dat de lusindex wordt gebruikt bij het opgeven van enkele waarden voor de resource. Als u bijvoorbeeld een aantal exemplaren van drie hebt ingevoerd, zijn de namen van de besturingssysteemschijven myOSDisk1, myOSDisk2 en myOSDisk3:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
}

Notitie

In dit voorbeeld worden beheerde schijven gebruikt voor de virtuele machines.

Houd er rekening mee dat het maken van een lus voor één resource in de sjabloon mogelijk vereist dat u de lus gebruikt bij het maken of openen van andere resources. Meerdere VM's kunnen bijvoorbeeld niet dezelfde netwerkinterface gebruiken, dus als uw sjabloon wordt herhaald door het maken van drie VM's, moet deze ook worden herhaald door het maken van drie netwerkinterfaces. Bij het toewijzen van een netwerkinterface aan een VM wordt de lusindex gebruikt om deze te identificeren:

"networkInterfaces": [ {
  "id": "[resourceId('Microsoft.Network/networkInterfaces',
    concat('myNIC', copyindex()))]"
} ]

Afhankelijkheden

De meeste resources zijn afhankelijk van andere resources om correct te werken. Virtuele machines moeten zijn gekoppeld aan een virtueel netwerk en hiervoor is een netwerkinterface vereist. Het element dependsOn wordt gebruikt om ervoor te zorgen dat de netwerkinterface gereed is voor gebruik voordat de VM's worden gemaakt:

"dependsOn": [
  "[concat('Microsoft.Network/networkInterfaces/', 'myNIC', copyindex())]"
],

Resource Manager implementeert parallel resources die niet afhankelijk zijn van een andere resource die wordt geïmplementeerd. Wees voorzichtig bij het instellen van afhankelijkheden, omdat u per ongeluk uw implementatie kunt vertragen door onnodige afhankelijkheden op te geven. Afhankelijkheden kunnen worden gekoppeld via meerdere resources. De netwerkinterface is bijvoorbeeld afhankelijk van het openbare IP-adres en de virtuele netwerkresources.

Hoe weet u of een afhankelijkheid vereist is? Bekijk de waarden die u in de sjabloon hebt ingesteld. Als een element in de definitie van de virtuele machineresource verwijst naar een andere resource die in dezelfde sjabloon is geïmplementeerd, hebt u een afhankelijkheid nodig. Uw virtuele voorbeeldmachine definieert bijvoorbeeld een netwerkprofiel:

"networkProfile": {
  "networkInterfaces": [ {
    "id": "[resourceId('Microsoft.Network/networkInterfaces',
      concat('myNIC', copyindex())]"
  } ]
},

Als u deze eigenschap wilt instellen, moet de netwerkinterface bestaan. Daarom hebt u een afhankelijkheid nodig. U moet ook een afhankelijkheid instellen wanneer een resource (een onderliggend item) is gedefinieerd binnen een andere resource (een bovenliggende resource). De diagnostische instellingen en aangepaste scriptextensies worden bijvoorbeeld beide gedefinieerd als onderliggende resources van de virtuele machine. Ze kunnen pas worden gemaakt als de virtuele machine bestaat. Daarom worden beide resources gemarkeerd als afhankelijk van de virtuele machine.

Profielen

Er worden verschillende profielelementen gebruikt bij het definiëren van een virtuele-machineresource. Sommige zijn vereist en andere zijn optioneel. De elementen hardwareProfile, osProfile, storageProfile en networkProfile zijn bijvoorbeeld vereist, maar het diagnosticsProfile is optioneel. Deze profielen definiëren instellingen zoals:

Schijven en installatiekopieën

In Azure kunnen vHD-bestanden schijven of installatiekopieën vertegenwoordigen. Wanneer het besturingssysteem in een vHD-bestand is gespecialiseerd om een specifieke VM te zijn, wordt dit een schijf genoemd. Wanneer het besturingssysteem in een vHD-bestand wordt gegeneraliseerd om te worden gebruikt voor het maken van veel VM's, wordt dit een installatiekopieën genoemd.

Nieuwe virtuele machines en nieuwe schijven maken vanuit een platforminstallatiekopieën

Wanneer u een virtuele machine maakt, moet u beslissen welk besturingssysteem u wilt gebruiken. Het element imageReference wordt gebruikt om het besturingssysteem van een nieuwe virtuele machine te definiëren. In het voorbeeld ziet u een definitie voor een Windows Server-besturingssysteem:

"imageReference": {
  "publisher": "MicrosoftWindowsServer",
  "offer": "WindowsServer",
  "sku": "2012-R2-Datacenter",
  "version": "latest"
},

Als u een Linux-besturingssysteem wilt maken, kunt u deze definitie gebruiken:

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

Notitie

Wijzig publisherde waarden , offersku en version dienovereenkomstig.

Configuratie-instellingen voor de besturingssysteemschijf worden toegewezen met het element osDisk. In het voorbeeld wordt een nieuwe beheerde schijf gedefinieerd met de cachemodus ingesteld op ReadWrite en dat de schijf wordt gemaakt op basis van een platforminstallatiekopieën:

"osDisk": {
  "name": "[concat('myOSDisk', copyindex())]",
  "caching": "ReadWrite",
  "createOption": "FromImage"
},

Nieuwe virtuele machines maken van bestaande beheerde schijven

Als u virtuele machines wilt maken van bestaande schijven, verwijdert u de elementen imageReference en osProfile en definieert u deze schijfinstellingen:

"osDisk": {
  "osType": "Windows",
  "managedDisk": {
    "id": "[resourceId('Microsoft.Compute/disks', [concat('myOSDisk', copyindex())])]"
  },
  "caching": "ReadWrite",
  "createOption": "Attach"
},

Nieuwe virtuele machines maken van een beheerde installatiekopieën

Als u een virtuele machine wilt maken van een beheerde installatiekopie, wijzigt u het element imageReference en definieert u deze schijfinstellingen:

"storageProfile": {
  "imageReference": {
    "id": "[resourceId('Microsoft.Compute/images', 'myImage')]"
  },
  "osDisk": {
    "name": "[concat('myOSDisk', copyindex())]",
    "osType": "Windows",
    "caching": "ReadWrite",
    "createOption": "FromImage"
  }
},

Gegevensschijven koppelen

U kunt desgewenst gegevensschijven toevoegen aan de VM's. Het aantal schijven is afhankelijk van de grootte van de besturingssysteemschijf die u gebruikt. Als de grootte van de VM's is ingesteld op Standard_DS1_v2, is het maximum aantal gegevensschijven dat aan de vm's kan worden toegevoegd, twee. In het voorbeeld wordt aan elke VM één beheerde gegevensschijf toegevoegd:

"dataDisks": [
  {
    "name": "[concat('myDataDisk', copyindex())]",
    "diskSizeGB": "100",
    "lun": 0,
    "caching": "ReadWrite",
    "createOption": "Empty"
  }
],

Uitbreidingen

Hoewel extensies een afzonderlijke resource zijn, zijn ze nauw verbonden met VM's. Extensies kunnen worden toegevoegd als een onderliggende resource van de VM of als een afzonderlijke resource. In het voorbeeld ziet u dat de diagnostische extensie wordt toegevoegd aan de VM's:

{
  "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"
    }
  }
},

Deze extensieresource gebruikt de variabele storageName en de diagnostische variabelen om waarden op te geven. Als u de gegevens wilt wijzigen die door deze extensie worden verzameld, kunt u meer prestatiemeteritems toevoegen aan de variabele wadperfcounters. U kunt er ook voor kiezen om de diagnostische gegevens in een ander opslagaccount te plaatsen dan waar de VM-schijven zijn opgeslagen.

Er zijn veel extensies die u op een VM kunt installeren, maar de meest nuttige is waarschijnlijk de aangepaste scriptextensie. In het voorbeeld wordt een PowerShell-script met de naam start.ps1 uitgevoerd op elke VM wanneer deze voor het eerst wordt gestart:

{
  "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"
    }
  }
}

Het start.ps1-script kan veel configuratietaken uitvoeren. De gegevensschijven die in het voorbeeld aan de VM's worden toegevoegd, zijn bijvoorbeeld niet geïnitialiseerd; u kunt een aangepast script gebruiken om ze te initialiseren. Als u meerdere opstarttaken moet uitvoeren, kunt u het bestand start.ps1 gebruiken om andere PowerShell-scripts aan te roepen in Azure Storage. In het voorbeeld wordt PowerShell gebruikt, maar u kunt elke scriptmethode gebruiken die beschikbaar is op het besturingssysteem dat u gebruikt.

U kunt de status van de geïnstalleerde extensies bekijken in de instellingen voor extensies in de portal:

Extensiestatus ophalen

U kunt ook extensie-informatie ophalen met behulp van de PowerShell-opdracht Get-AzVMExtension , de opdracht VM-extensie ophalen Azure CLI of de REST API Extensiegegevens ophalen .

Implementaties

Wanneer u een sjabloon implementeert, houdt Azure de resources bij die u als groep hebt geïmplementeerd en wijst automatisch een naam toe aan deze geïmplementeerde groep. De naam van de implementatie is hetzelfde als de naam van de sjabloon.

Als u meer wilt weten over de status van resources in de implementatie, bekijkt u de resourcegroep in de Azure Portal:

Implementatiegegevens ophalen

Het is geen probleem om dezelfde sjabloon te gebruiken om resources te maken of om bestaande resources bij te werken. Wanneer u opdrachten gebruikt om sjablonen te implementeren, kunt u aangeven welke modus u wilt gebruiken. De modus kan worden ingesteld op Voltooid of Incrementeel. De standaardinstelling is om incrementele updates uit te voeren. Wees voorzichtig wanneer u de modus Volledig gebruikt, omdat u per ongeluk resources kunt verwijderen. Wanneer u de modus instelt op Voltooid, verwijdert Resource Manager resources in de resourcegroep die zich niet in de sjabloon bevinden.

Volgende stappen