Virtuella datorer i en Azure Resource Manager-mall

Gäller för: ✔️ Virtuella Windows-datorer

Den här artikeln beskriver aspekter av en Azure Resource Manager-mall som gäller för virtuella datorer. Den här artikeln beskriver inte en fullständig mall för att skapa en virtuell dator. för att du behöver resursdefinitioner för lagringskonton, nätverksgränssnitt, offentliga IP-adresser och virtuella nätverk. Mer information om hur dessa resurser kan definieras tillsammans finns i genomgången Resource Manager mall.

Det finns många mallar i galleriet som innehåller VM-resursen. Alla element som kan ingå i en mall beskrivs inte här.

Det här exemplet visar ett typiskt resursavsnitt i en mall för att skapa ett angivet antal virtuella datorer:

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

Anteckning

Det här exemplet förlitar sig på ett lagringskonto som skapades tidigare. Du kan skapa lagringskontot genom att distribuera det från mallen. Exemplet förlitar sig också på ett nätverksgränssnitt och dess beroende resurser som skulle definieras i mallen. Dessa resurser visas inte i exemplet.

API-version

När du distribuerar resurser med en mall måste du ange en version av API:et som ska användas. Exemplet visar den virtuella datorresursen med hjälp av det här apiVersion-elementet:

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

Den version av API:et som du anger i mallen påverkar vilka egenskaper du kan definiera i mallen. I allmänhet bör du välja den senaste API-versionen när du skapar mallar. För befintliga mallar kan du bestämma om du vill fortsätta använda en tidigare API-version eller uppdatera mallen för den senaste versionen för att dra nytta av nya funktioner.

Använd dessa möjligheter för att hämta de senaste API-versionerna:

Parametrar och variabler

Parametrar gör det enkelt för dig att ange värden för mallen när du kör den. Det här parameteravsnittet används i exemplet:

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

När du distribuerar exempelmallen anger du värden för namnet och lösenordet för administratörskontot på varje virtuell dator och antalet virtuella datorer som ska skapas. Du kan välja att ange parametervärden i en separat fil som hanteras med mallen eller ange värden när du uppmanas att göra det.

Variabler gör det enkelt för dig att konfigurera värden i mallen som används upprepade gånger i den eller som kan ändras över tid. Det här variabelavsnittet används i exemplet:

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

När du distribuerar exempelmallen används variabelvärden för namnet och identifieraren för det tidigare skapade lagringskontot. Variabler används också för att ange inställningarna för diagnostiktillägget. Använd metodtipsen för att skapa Azure Resource Manager mallar som hjälper dig att bestämma hur du vill strukturera parametrarna och variablerna i mallen.

Resursloopar

När du behöver mer än en virtuell dator för ditt program kan du använda ett kopieringselement i en mall. Det här valfria elementet loopar genom att skapa antalet virtuella datorer som du angav som en parameter:

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

Observera också i exemplet att loopindexet används när du anger några av värdena för resursen. Om du till exempel anger ett instansantal på tre är namnen på operativsystemdiskarna myOSDisk1, myOSDisk2 och myOSDisk3:

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

Anteckning

I det här exemplet används hanterade diskar för de virtuella datorerna.

Tänk på att om du skapar en loop för en resurs i mallen kan du behöva använda loopen när du skapar eller kommer åt andra resurser. Till exempel kan flera virtuella datorer inte använda samma nätverksgränssnitt, så om mallen loopar genom att skapa tre virtuella datorer måste den också loopa genom att skapa tre nätverksgränssnitt. När du tilldelar ett nätverksgränssnitt till en virtuell dator används loopindexet för att identifiera det:

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

Beroenden

De flesta resurser är beroende av andra resurser för att fungera korrekt. Virtuella datorer måste associeras med ett virtuellt nätverk och för att kunna göra det måste de ha ett nätverksgränssnitt. DependsOn-elementet används för att kontrollera att nätverksgränssnittet är redo att användas innan de virtuella datorerna skapas:

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

Resource Manager distribuerar parallellt alla resurser som inte är beroende av en annan resurs som distribueras. Var försiktig när du anger beroenden eftersom du oavsiktligt kan fördröja distributionen genom att ange onödiga beroenden. Beroenden kan länkas via flera resurser. Nätverksgränssnittet beror till exempel på den offentliga IP-adressen och virtuella nätverksresurser.

Hur vet du om ett beroende krävs? Titta på de värden som du anger i mallen. Om ett element i resursdefinitionen för den virtuella datorn pekar på en annan resurs som distribueras i samma mall behöver du ett beroende. Din virtuella exempeldator definierar till exempel en nätverksprofil:

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

Om du vill ange den här egenskapen måste nätverksgränssnittet finnas. Därför behöver du ett beroende. Du måste också ange ett beroende när en resurs (en underordnad) definieras i en annan resurs (överordnad). Diagnostikinställningarna och tilläggen för anpassade skript definieras till exempel båda som underordnade resurser för den virtuella datorn. De kan inte skapas förrän den virtuella datorn finns. Därför markeras båda resurserna som beroende av den virtuella datorn.

Profiler

Flera profilelement används när du definierar en virtuell datorresurs. Vissa krävs och vissa är valfria. Elementen hardwareProfile, osProfile, storageProfile och networkProfile krävs, men diagnosticsProfile är valfritt. Dessa profiler definierar inställningar som:

Diskar och avbildningar

I Azure kan vhd-filer representera diskar eller avbildningar. När operativsystemet i en vhd-fil är specialiserat på att vara en specifik virtuell dator kallas det en disk. När operativsystemet i en vhd-fil generaliseras för att användas för att skapa många virtuella datorer kallas det för en avbildning.

Skapa nya virtuella datorer och nya diskar från en plattformsbild

När du skapar en virtuell dator måste du bestämma vilket operativsystem som ska användas. ImageReference-elementet används för att definiera operativsystemet för en ny virtuell dator. Exemplet visar en definition för ett Windows Server-operativsystem:

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

Om du vill skapa ett Linux-operativsystem kan du använda den här definitionen:

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

Anteckning

Ändra publishervärdena , skuofferoch version därefter.

Konfigurationsinställningar för operativsystemdisken tilldelas med osDisk-elementet. Exemplet definierar en ny hanterad disk med cachelagringsläget inställt på ReadWrite och att disken skapas från en plattformsbild:

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

Skapa nya virtuella datorer från befintliga hanterade diskar

Om du vill skapa virtuella datorer från befintliga diskar tar du bort elementen imageReference och osProfile och definierar dessa diskinställningar:

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

Skapa nya virtuella datorer från en hanterad avbildning

Om du vill skapa en virtuell dator från en hanterad avbildning ändrar du imageReference-elementet och definierar följande diskinställningar:

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

Koppla datadiskar

Du kan också lägga till datadiskar till de virtuella datorerna. Antalet diskar beror på storleken på den operativsystemdisk som du använder. Med storleken på de virtuella datorerna inställda på Standard_DS1_v2 är det maximala antalet datadiskar som kan läggas till dem två. I exemplet läggs en hanterad datadisk till på varje virtuell dator:

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

Tillägg

Även om tillägg är en separat resurs är de nära knutna till virtuella datorer. Tillägg kan läggas till som en underordnad resurs för den virtuella datorn eller som en separat resurs. Exemplet visar diagnostiktillägget som läggs till i de virtuella datorerna:

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

Den här tilläggsresursen använder variabeln storageName och diagnostikvariablerna för att ange värden. Om du vill ändra de data som samlas in av det här tillägget kan du lägga till fler prestandaräknare i wadperfcounters-variabeln. Du kan också välja att placera diagnostikdata i ett annat lagringskonto än där de virtuella datordiskarna lagras.

Det finns många tillägg som du kan installera på en virtuell dator, men det mest användbara är förmodligen det anpassade skripttillägget. I exemplet körs ett PowerShell-skript med namnet start.ps1 på varje virtuell dator när det först startar:

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

Det start.ps1 skriptet kan utföra många konfigurationsuppgifter. Till exempel initieras inte de datadiskar som läggs till i de virtuella datorerna i exemplet. du kan använda ett anpassat skript för att initiera dem. Om du har flera startuppgifter att utföra kan du använda start.ps1-filen för att anropa andra PowerShell-skript i Azure Storage. I exemplet används PowerShell, men du kan använda valfri skriptmetod som är tillgänglig på det operativsystem som du använder.

Du kan se statusen för de installerade tilläggen från tilläggsinställningarna i portalen:

Hämta tilläggsstatus

Du kan också hämta tilläggsinformation med hjälp av Kommandot Get-AzVMExtension PowerShell, vm-tillägget hämta Azure CLI-kommandot eller REST API:et Hämta tilläggsinformation .

Distributioner

När du distribuerar en mall spårar Azure de resurser som du distribuerade som en grupp och tilldelar automatiskt ett namn till den distribuerade gruppen. Namnet på distributionen är samma som namnet på mallen.

Om du är nyfiken på status för resurser i distributionen kan du visa resursgruppen i Azure Portal:

Hämta distributionsinformation

Det är inte ett problem att använda samma mall för att skapa resurser eller uppdatera befintliga resurser. När du använder kommandon för att distribuera mallar har du möjlighet att säga vilket läge du vill använda. Läget kan anges till Antingen Slutfört eller Inkrementellt. Standardvärdet är att göra inkrementella uppdateringar. Var försiktig när du använder läget Slutför eftersom du kan ta bort resurser av misstag. När du ställer in läget på Slutför tar Resource Manager bort alla resurser i resursgruppen som inte finns i mallen.

Nästa steg