Поделиться через


Сведения о шаблонах масштабируемого набора виртуальных машин

Шаблоны Azure Resource Manager прекрасно подходят для развертывания группы связанных ресурсов. В этой серии руководств показано, как создать шаблон базового масштабируемого набора и изменить его в соответствии с различными сценариями. Все примеры взяты из этого репозитория GitHub.

Этот шаблон должен быть простым. Полные примеры шаблонов масштабируемых наборов можно найти в репозитории шаблонов быстрого запуска Azure на сайте GitHub. Папки с этими шаблонами содержат строку vmss.

Если вы уже умеете создавать шаблоны, можете смело переходите к разделу "Дальнейшие действия", где мы расскажем, как нужно изменить этот шаблон.

Определение элементов $schema и contentVersion

Сначала в шаблоне необходимо определить $schema и contentVersion. Элемент $schema определяет версию языка шаблона. Он используется для разметки синтаксиса в редакторе Visual Studio и других функций проверки кода. Элемент contentVersion не используется в Azure, но позволяет отслеживать версию шаблона.

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

Определить параметры

Далее определите два параметра: adminUsername и adminPassword. Параметры — это значения, которые пользователь задает во время развертывания. Параметр adminUsername будет иметь простейший тип string, но для параметра adminPassword необходимо назначить тип securestring, так как он содержит секретную информацию. Позднее эти параметры будут переданы в конфигурацию масштабируемого набора.

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

Определение переменных

Шаблоны Resource Manager позволяют определять переменные и затем использовать их в шаблоне. В текущем примере не используется никаких переменных, поэтому объект JSON пустой.

  "variables": {},

Определение ресурсов

Теперь мы переходим к разделу шаблона resources, где вы можете определить ресурсы, которые следует развернуть. В отличие от разделов parameters и variables, которые сами являются объектами JSON, раздел resources представляет собой JSON-список объектов JSON.

  "resources": [
    ...
  ]

Каждый ресурс должен иметь свойства type, name, apiVersion и location. В этом примере первого ресурса указан тип Microsoft.Network/virtualNetwork с именем myVnet и apiVersion 2018-11-01. (Последнюю версию API для типа ресурса см. в справочнике по шаблонам Azure Resource Manager.)

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

Определение расположения

Чтобы указать расположение для виртуальной сети, примените функции шаблона Resource Manager. Каждая функция заключается в кавычки и квадратные скобки, примерно так: "[<template-function>]". В этом случае используйте функцию resourceGroup. Она не принимает никаких аргументов и возвращает объект JSON с метаданными о группе ресурсов, в которой выполняется развертывание. Группу ресурсов устанавливает пользователь во время развертывания. Затем, используя функцию .location, значение этого объекта 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)

Помимо обязательных свойств type, name, apiVersion и location, в каждом ресурсе можно использовать дополнительный список строк dependsOn. Этот список определяет, какие еще ресурсы из текущего развертывания необходимо создать перед развертыванием этого ресурса.

В нашем примере этот список содержит только один элемент — это упомянутая выше виртуальная сеть. Эту зависимость нужно указать, так как перед созданием виртуальных машин для масштабируемого набора требуется задать сеть. Тогда масштабируемый набор сможет назначить этим виртуальным машинам частные IP-адреса из диапазона IP-адресов, указанного ранее в свойствах сети. Каждая строка в списке dependsOn имеет формат <type>/<name>. Используйте такие же значения type и name, как и в определении ресурса виртуальной сети.

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

Определение свойств масштабируемого набора

Масштабируемый набор имеет множество свойств, позволяющих настроить входящие в этот набор виртуальные машины. Полный список этих свойств см. в справочнике по шаблонам. Лишь несколько наиболее распространенных свойств определены в этом руководстве.

Определение размера и емкости виртуальных машин

Для масштабируемого набора следует указать размер виртуальной машины, которую следует создать (имя SKU), и число создаваемых виртуальных машин (емкость SKU). Сведения о доступных размерах (именах SKU) для виртуальных машин см. в документации по размерам виртуальных машин.

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

Выбор типа обновления

Кроме того, нужно указать способ обновления масштабируемого набора. Сейчас поддерживаются три варианта: Manual,Rolling и Automatic. Дополнительные сведения о различиях между этими двумя способами см. в документации по обновлению масштабируемого набора.

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

Выбор операционной системы для виртуальных машин

Для масштабируемого набора нужно указать операционную систему, которую следует установить на виртуальных машинах. Создайте виртуальную машину на базе образа Ubuntu 16.04 со всеми исправлениями.

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

Определение префикса имени компьютера (computerNamePrefix)

В масштабируемом наборе развертываются несколько виртуальных машин. Не указывайте имя отдельно для каждой из них, а просто укажите префикс computerNamePrefix. Масштабируемый набор добавляет индекс к этому префиксу для каждой виртуальной машины, поэтому имена виртуальных машин выглядят следующим образом: <computerNamePrefix>_<auto-generated-index>.

В следующем фрагменте кода используйте описанные выше параметры, с помощью которых задается имя пользователя и пароль администратора для всех виртуальных машин в масштабируемом наборе. В этот процессе используется функция шаблона parameters. Эта функция принимает строку, обозначающую параметр для ссылки, и возвращает значение для этого параметра.

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

Определение конфигурации сети для виртуальных машин

Наконец, укажите конфигурацию сети для виртуальных машин в масштабируемом наборе. В данном случае достаточно просто указать идентификатор созданной ранее подсети. Это означает, что масштабируемый набор будет размещать в этой подсети сетевые интерфейсы.

Чтобы получить идентификатор виртуальной сети, содержащей подсеть, выполните функцию шаблона resourceId. Эта функция принимает тип и имя ресурса и возвращает полный идентификатор ресурса. Этот идентификатор имеет следующий вид: /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/<resourceProviderNamespace>/<resourceType>/<resourceName>.

Однако идентификатора виртуальной сети недостаточно. Укажите конкретную подсеть, в которой должны размещаться виртуальные машины масштабируемого набора. Для этого нужно объединить строку /subnets/mySubnet с идентификатором виртуальной сети. Это и будет полный идентификатор вашей подсети. Чтобы выполнить объединение строк, используйте функцию concat. Она принимает несколько строк и возвращает одну объединенную строку.

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

Следующие шаги

Предыдущий шаблон можно развернуть, следуя указаниям, описанным в документации по Azure Resource Manager.

Начать работу с этой серией руководств можно со статьи о шаблоне базового масштабируемого набора.

Вы узнаете, как изменить шаблон базового масштабируемого набора, чтобы развернуть масштабируемый набор в существующей виртуальной сети.

Вы узнаете, как изменить шаблон базового масштабируемого набора, чтобы развернуть масштабируемый набор с помощью настраиваемого образа.

Вы узнаете, как изменить шаблон базового масштабируемого набора, чтобы развернуть масштабируемый набор Linux с использованием автосохранения на основе гостя.

Дополнительные сведения о масштабируемых наборах см. на этой странице.