了解虚拟机规模集模板

Azure 资源管理器模板是部署成组的相关资源的好办法。 本系列教程演示如何创建基本规模集模板,以及如何修改此模板以满足各种场景。 所有示例都来自此 GitHub 存储库

此模板简单易用。 有关更完整的规模集模板的示例,请参阅 Azure 快速入门模板 GitHub 存储库,并搜索包含字符串 vmss 的文件夹。

如果已熟悉模板创建,则可以跳到“后续步骤”部分,查看如何修改此模板。

定义 $schema 和 contentVersion

首先,定义模板中的 $schemacontentVersion$schema 元素定义模板语言的版本,并用于 Visual Studio 语法突出显示和类似的验证功能。 contentVersion 元素不由 Azure 使用。 而是帮助跟踪模板版本。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json",
  "contentVersion": "1.0.0.0",
}

定义参数

接下来,定义两个参数:adminUsernameadminPassword。 参数是部署时指定的值。 adminUsername 参数只是一个 string 类型,但是由于 adminPassword 是一个机密,因此将其类型指定为 securestring。 稍后,这些参数会被传递到规模集配置。

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

定义变量

Resource Manager 模板还可用于定义以后要在模板中使用的变量。 本示例不使用任何变量,因此 JSON 对象为空。

  "variables": {},

定义资源

接下来是模板的资源部分。 在此处定义实际需要部署的内容。 与 parametersvariables(它们是 JSON 对象)不同,resources 是 JSON 对象的 JSON 列表。

  "resources": [
    ...
  ]

所有资源都需要 typenameapiVersionlocation 属性。 此示例的第一个资源具有类型 Microsoft.Network/virtualNetwork、名称 myVnet 和 apiVersion 2018-11-01。 (若要查找资源类型的最新 API 版本,请参阅 Azure 资源管理器模板参考。)

{
  "type": "Microsoft.Network/virtualNetworks",
  "name": "myVnet",
  "apiVersion": "2018-11-01",
}

指定位置

若要指定虚拟网络的位置,请使用资源管理器模板函数。 此函数必须括在引号和方括号内,如:"[<template-function>]"。 在本例中,使用 resourceGroup 函数。 该函数不使用任何参数,并返回 JSON 对象和有关要将部署部署到的资源组的元数据。 资源组在部署时由用户进行设置。 然后此值会通过 .location 编入到该 JSON 对象的索引中,以便从该 JSON 对象中获取位置。

  "location": "[resourceGroup().location]",

指定虚拟网络属性

每个 Resource Manager 资源都有自己的针对特定于的资源的配置的 properties 部分。 在本示例中,使用专用 IP 地址范围 10.0.0.0/16 指定虚拟网络应具有一个子网。 规模集始终包含在一个子网中。 它不能跨子网。

  {
    "properties": {
      "addressSpace": {
        "addressPrefixes": [
          "10.0.0.0/16"
        ]
      },
      "subnets": [
        {
          "name": "mySubnet",
          "properties": {
            "addressPrefix": "10.0.0.0/16"
          }
        }
      ]
    }
  },

添加 dependsOn 列表

除所需的 typenameapiVersionlocation 属性外,每个资源还可具有可选的字符串 dependsOn 列表。 此列表指定部署此资源前,必须先部署哪些其他资源。

在本示例中,列表中只有一个元素,即前面示例中的虚拟网络。 指定此依赖项的原因是在创建任何 VM 之前规模集需要有网络。 这样,规模集可为这些虚拟机提供之前在网络属性中指定的 IP 地址范围中的专用 IP 地址。 dependsOn 列表中每个字符串的格式为 <type>/<name>。 使用先前虚拟机资源定义中使用的同一 typename

  {
    "type": "Microsoft.Compute/virtualMachineScaleSets",
    "name": "myScaleSet",
    "apiVersion": "2019-03-01",
    "location": "[resourceGroup().location]",
    "dependsOn": [
      "Microsoft.Network/virtualNetworks/myVnet"
    ],
    ...
  }

指定规模集属性

规模集具有多个用于自定义规模集中 VM 的属性。 有关这些属性的完整列表,请参阅模板参考。 在本教程中,仅设置一些常用属性。

提供 VM 大小和容量

规模集需要知道要创建的 VM 的大小(“sku name”) 和要创建的此类 VM的 数量(“sku capacity”)。 若要查看可用的 VM 大小,请参阅 VM 大小文档

  "sku": {
    "name": "Standard_A1",
    "capacity": 2
  },

选择更新类型

规模集还需要知道如何处理规模集的更新。 目前有三个选项:ManualRollingAutomatic。 有关这两者之间的区别的详细信息,请参阅文档如何升级规模集

  "properties": {
    "upgradePolicy": {
      "mode": "Manual"
    },
  }

选择 VM 操作系统

规模集需知道要在 VM 上安装什么操作系统。 此处使用完全修补的 Ubuntu 16.04-LTS 映像创建 VM。

  "virtualMachineProfile": {
    "storageProfile": {
      "imageReference": {
        "publisher": "Canonical",
        "offer": "UbuntuServer",
        "sku": "16.04-LTS",
        "version": "latest"
      }
    },
  }

指定 computerNamePrefix

此规模集部署多个 VM。 指定 computerNamePrefix 而不是指定每个 VM 名称。 规模集在每个 VM 的前缀中附加一个索引,因此 VM 名称格式为 <computerNamePrefix>_<auto-generated-index>

在以下代码片段中,使用前面提到的参数为规模集中所有 VM 设置管理员用户名和密码。 此过程使用 parameters 模板函数。 此函数采用一个字符串,此字符串指定要引用哪个参数及哪个参数输出该参数的值。

 "osProfile": {
   "computerNamePrefix": "vm",
   "adminUsername": "[parameters('adminUsername')]",
   "adminPassword": "[parameters('adminPassword')]"
  },

指定 VM 网络配置

最后,指定规模集中 VM 的网络配置。 在本例中,仅需指定之前创建的子网的 ID。 此会告知规模集将网络接口置于此子网中。

可使用 resourceId 模板函数获取包含子网的虚拟网络的 ID。 此函数采用资源的类型和名称,并返回该资源的完全限定的标识符。 此 ID 格式为:/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/<resourceProviderNamespace>/<resourceType>/<resourceName>

但是,仅有虚拟网络的标识符是不够的。 提供规模集 VM 应位于的特定子网。 为此,请将 /subnets/mySubnet 串联到虚拟网络的 ID。 其结果是子网的完全限定的 ID。 使用 concat 函数执行此串联,该函数使用一系列字符串并返回它们的串联字符串。

  "networkProfile": {
    "networkInterfaceConfigurations": [
      {
        "name": "myNic",
        "properties": {
          "primary": "true",
          "ipConfigurations": [
            {
              "name": "myIpConfig",
              "properties": {
                "subnet": {
                  "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', 'myVnet'), '/subnets/mySubnet')]"
                }
              }
            }
          ]
        }
      }
    ]
  }

后续步骤

可以按照 Azure 资源管理器文档部署上述模板。

若要学习这一系列教程,可先阅读基本规模集模板文章

可以了解如何修改基本规模集模板,以便将规模集部署到现有虚拟网络

可以了解如何修改基本规模集模板,以便使用自定义映像部署规模集

可以了解如何修改基本规模集模板,以便使用基于来宾的自动缩放部署 Linux 规模集

有关规模集的详细信息,请参阅规模集概述页