Разработка шаблонов Azure Resource Manager для обеспечения согласованности с облакомDevelop Azure Resource Manager templates for cloud consistency

Важно!

Для использования этой функции Azure в PowerShell требуется установленный модуль AzureRM.Using this Azure feature from PowerShell requires the AzureRM module installed. Это устаревший модуль, поддерживаемый только в Windows PowerShell 5.1.x, в который больше не добавляются новые функции.This is an older module only available for Windows PowerShell 5.1 that no longer receives new features. Модули Az и AzureRM являются несовместимыми при использовании с одинаковыми версиями PowerShell.The Az and AzureRM modules are not compatible when installed for the same versions of PowerShell. Если вам необходимы обе версии, выполните следующее:If you need both versions:

  1. Удалите модуль Az в сеансе PowerShell 5.1.Uninstall the Az module from a PowerShell 5.1 session.
  2. Установите модуль AzureRM в сеансе PowerShell 5.1.Install the AzureRM module from a PowerShell 5.1 session.
  3. Скачайте и установите PowerShell Core 6.x или последующей версии.Download and install PowerShell Core 6.x or later.
  4. Установите модуль Az в сеансе PowerShell Core.Install the Az module in a PowerShell Core session.

Основным преимуществом Azure является согласованность.A key benefit of Azure is consistency. Вложения в разработку для одного расположения можно повторно использовать для другого.Development investments for one location are reusable in another. Шаблон обеспечивает согласованность и воспроизводимость развертываний в различных средах, включая глобальную платформу Azure, национальные облака Azure и Azure Stack.A template makes your deployments consistent and repeatable across environments, including the global Azure, Azure sovereign clouds, and Azure Stack. Для повторного использования шаблонов в разных облачных средах, тем не менее, необходимо учитывать зависимости, присущие конкретным средам, о которых рассказывается в этом руководстве.To reuse templates across clouds, however, you need to consider cloud-specific dependencies as this guide explains.

Корпорация Майкрософт предлагает интеллектуальные, готовые к работе в корпоративных средах облачные службы в различных расположениях, включая перечисленные ниже.Microsoft offers intelligent, enterprise-ready cloud services in many locations, including:

  • Глобальная платформа Azure, поддерживаемая растущей сетью центров обработки данных, управляемых корпорацией Майкрософт, в различных регионах по всему миру.The global Azure platform supported by a growing network of Microsoft-managed datacenters in regions around the world.
  • Изолированные национальные облака, такие как Azure для Германии, Azure для государственных организаций и Azure для Китая (Azure под управлением 21Vianet).Isolated sovereign clouds like Azure Germany, Azure Government, and Azure China (Azure operated by 21Vianet). Национальные облака обеспечивают согласованную платформу с большинством замечательных возможностей, к которым имеют доступ клиенты глобальной платформы Azure по всему миру.Sovereign clouds provide a consistent platform with most of the same great features that global Azure customers have access to.
  • Azure Stack, гибридная облачная платформа, которая позволяет доставлять службы Azure из корпоративного центра обработки данных.Azure Stack, a hybrid cloud platform that lets you deliver Azure services from your organization's datacenter. Предприятия могут настроить Azure Stack в собственных центрах обработки данных или использовать службы Azure от поставщиков услуг, запуская Azure Stack на своих предприятиях (также известных как размещенные регионы).Enterprises can set up Azure Stack in their own datacenters, or consume Azure Services from service providers, running Azure Stack in their facilities (sometimes known as hosted regions).

В основе всех этих облачных сред лежит API, предоставляемый Azure Resource Manager, который обеспечивает широкий ряд пользовательских интерфейсов для взаимодействия с платформой Azure.At the core of all these clouds, Azure Resource Manager provides an API that allows a wide variety of user interfaces to communicate with the Azure platform. Этот API предоставляет мощные возможности модели "инфраструктура как код".This API gives you powerful infrastructure-as-code capabilities. Любой тип ресурса, который доступен в облачной платформе Azure, можно развернуть и настроить с помощью Azure Resource Manager.Any type of resource that is available on the Azure cloud platform can be deployed and configured with Azure Resource Manager. Используя один шаблон, можно развернуть и настроить полное приложение, готовое к работе.With a single template, you can deploy and configure your complete application to an operational end state.

Среды Azure

Согласованность глобальной платформы Azure, национальных облаков, размещенных облаков и облака в вашем центре обработки данных позволяет воспользоваться преимуществами Azure Resource Manager.The consistency of global Azure, the sovereign clouds, hosted clouds, and a cloud in your datacenter helps you benefit from Azure Resource Manager. Можно повторно использовать инвестиции в разработку в этих облаках при настройке конфигурации и развертывания ресурсов на основе шаблона.You can reuse your development investments across these clouds when you set up template-based resource deployment and configuration.

Тем не менее, даже если глобальные, национальные, размещенные и гибридные облака обеспечивают согласованные службы, не все облака идентичны.However, even though the global, sovereign, hosted, and hybrid clouds provide consistent services, not all clouds are identical. Таким образом, можно создать шаблон с зависимостями от компонентов, доступных только в определенных облаках.As a result, you can create a template with dependencies on features available only in a specific cloud.

В оставшейся части этого руководства описаны аспекты, которые необходимо учитывать при планировании разработки новых или обновления существующих шаблонов Azure Resource Manager для Azure Stack.The rest of this guide describes the areas to consider when planning to develop new or updating existing Azure Resource Manager templates for Azure Stack. Как правило, такой контрольный список должен включать следующие элементы:In general, your checklist should include the following items:

  • Убедитесь, что функции, конечные точки, службы и другие ресурсы в шаблоне доступны во всех расположениях целевого развертывания.Verify that the functions, endpoints, services, and other resources in your template are available in the target deployment locations.
  • Храните вложенные шаблоны и артефакты конфигурации в расположениях, доступных из разных облачных сред.Store nested templates and configuration artifacts in accessible locations, ensuring access across clouds.
  • Используйте динамические ссылки вместо жестко запрограммированных ссылок и элементов.Use dynamic references instead of hard-coding links and elements.
  • Убедитесь, что используемые параметры шаблонов работают в целевых облаках.Ensure the template parameters you use work in the target clouds.
  • Убедитесь, что свойства, определяемые ресурсами, доступны в целевых облаках.Verify that resource-specific properties are available the target clouds.

Основные сведения о шаблонах Azure Resource Manger см. в статье, посвященной развертыванию шаблонов.For an introduction to Azure Resource Manger templates, see Template deployment.

Проверка работы функций шаблоновEnsure template functions work

Базовый синтаксис шаблона Resource Manager — JSON.The basic syntax of a Resource Manager template is JSON. Шаблоны используют подмножество нотации JSON, расширяя синтаксис с помощью выражений и функций.Templates use a superset of JSON, extending the syntax with expressions and functions. Модуль обработки языка шаблонов часто обновляется для поддержки дополнительных функций шаблонов.The template language processor is frequently updated to support additional template functions. Подробное описание доступных функций шаблонов см. в статье Функции шаблонов Azure Resource Manager.For a detailed explanation of the available template functions, see Azure Resource Manager template functions.

Новые функции шаблонов, представленные в Azure Resource Manager, не сразу становятся доступны в национальных облаках или Azure Stack.New template functions that are introduced to Azure Resource Manager aren't immediately available in the sovereign clouds or Azure Stack. Для успешного развертывания шаблона все функции, на которые ссылается шаблон, должны быть доступны в целевом облаке.To deploy a template successfully, all functions referenced in the template must be available in the target cloud.

Возможности Azure Resource Manager всегда сначала выпускаются в глобальном облаке Azure.Azure Resource Manager capabilities will always be introduced to global Azure first. Вы можете использовать следующий сценарий PowerShell, чтобы проверить, поддерживаются ли новые функции шаблона в Azure Stack:You can use the following PowerShell script to verify whether newly introduced template functions are also available in Azure Stack:

  1. Клонируйте репозиторий GitHub: https://github.com/marcvaneijk/arm-template-functions.Make a clone of the GitHub repository: https://github.com/marcvaneijk/arm-template-functions.

  2. Создав локальный клон репозитория, подключитесь к целевому экземпляру Azure Resource Manager с помощью PowerShell.Once you have a local clone of the repository, connect to the destination's Azure Resource Manager with PowerShell.

  3. Импортируйте модуль psm1 и выполните командлет Test-AzureRmureRmTemplateFunctions:Import the psm1 module and execute the Test-AzureRmureRmTemplateFunctions cmdlet:

    # Import the module
    Import-module <path to local clone>\AzTemplateFunctions.psm1
    
    # Execute the Test-AzureRmTemplateFunctions cmdlet
    Test-AzureRmTemplateFunctions -path <path to local clone>
    

Сценарий выполнит развертывание нескольких шаблонов с минимальными возможностями, каждый из которых будет содержать только уникальные функции шаблона.The script deploys multiple, minimized templates, each containing only unique template functions. Выходные данные сценария будут содержать поддерживаемые и недоступные функции шаблонов.The output of the script reports the supported and unavailable template functions.

Работа со связанными артефактамиWorking with linked artifacts

Шаблон может содержать ссылки на связанные артефакты и ресурс развертывания, который ссылается на другой шаблон.A template can contain references to linked artifacts and contain a deployment resource that links to another template. Связанные шаблоны (также называемые вложенными шаблонами) извлекаются Resource Manager во время выполнения.The linked templates (also referred to as nested template) are retrieved by Resource Manager at runtime. Шаблон также может содержать ссылки на артефакты для расширений виртуальной машины.A template can also contain references to artifacts for virtual machine (VM) extensions. Эти артефакты можно получить с помощью расширения виртуальной машины, выполняющегося внутри виртуальной машины, для настройки расширения виртуальной машины во время развертывания шаблона.These artifacts are retrieved by the VM extension running inside of the VM for configuration of the VM extension during the template deployment.

В следующих разделах описываются некоторые аспекты обеспечения согласованности с облаком при разработке шаблонов, включающих артефакты, которые являются внешними по отношению к основному шаблону развертывания.The following sections describe considerations for cloud consistency when developing templates that include artifacts that are external to the main deployment template.

Использование вложенных шаблонов в разных регионахUse nested templates across regions

Шаблоны можно разложить на небольшие, многократно используемые шаблоны, каждый из которых имеет конкретное назначение и может повторно использоваться в разных сценариях развертывания.Templates can be decomposed into small, reusable templates, each of which has a specific purpose and can be reused across deployment scenarios. Чтобы выполнить развертывание, необходимо указать один шаблон, называемый главным или основным шаблоном.To execute a deployment, you specify a single template known as the main or master template. Он указывает развертываемые ресурсы, такие как виртуальные сети, виртуальные машины и веб-приложения.It specifies the resources to deploy, such as virtual networks, VMs, and web apps. Основной шаблон также может содержать ссылку на другой шаблон, таким образом, можно создавать вложенные шаблоны.The main template can also contain a link to another template, meaning you can nest templates. Аналогичным образом, вложенный шаблон может содержать ссылки на другие шаблоны.Likewise, a nested template can contain links to other templates. Для шаблонов поддерживается до пяти уровней вложения.You can nest up to five levels deep.

В следующем коде показано, как параметр templateLink ссылается на вложенный шаблон:The following code shows how the templateLink parameter refers to a nested template:

"resources": [
  {
     "apiVersion": "2017-05-10",
     "name": "linkedTemplate",
     "type": "Microsoft.Resources/deployments",
     "properties": {
       "mode": "incremental",
       "templateLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/vNet.json",
          "contentVersion":"1.0.0.0"
       }
     }
  }
]

Azure Resource Manager оценивает основной шаблон во время выполнения и извлекает и оценивает каждый вложенный шаблон.Azure Resource Manager evaluates the main template at runtime and retrieves and evaluates each nested template. После извлечения всех вложенных шаблонов шаблон становится плоским и инициируется дальнейшая обработка.After all nested templates are retrieved, the template is flattened, and further processing is initiated.

Предоставление доступа к связанным шаблонам в разных облакахMake linked templates accessible across clouds

Рассмотрим, где и как хранить используемые связанные шаблоны.Consider where and how to store any linked templates you use. Во время выполнения Azure Resource Manager получает все связанные шаблоны, поэтому ему требуется прямой доступ к ним.At runtime, Azure Resource Manager fetches—and therefore requires direct access to—any linked templates. Как правило, для хранения вложенных шаблонов используется GitHub.A common practice is to use GitHub to store the nested templates. Репозиторий GitHub может содержать файлы, доступные всем пользователям Интернета через URL-адрес.A GitHub repository can contain files that are accessible publicly through a URL. Несмотря на то, что это удобный вариант для общедоступного облака и национальных облаков, среда Azure Stack может размещаться в корпоративной сети или в удаленных расположениях, не имеющих исходящего подключения к Интернету.Although this technique works well for the public cloud and the sovereign clouds, an Azure Stack environment might be located on a corporate network or on a disconnected remote location, without any outbound Internet access. В таком случае Azure Resource Manager не сможет получить доступ к вложенным шаблонам.In those cases, Azure Resource Manager would fail to retrieve the nested templates.

Для развертываний в нескольких облаках рекомендуется хранить связанные шаблоны в расположении, доступном для целевого облака.A better practice for cross-cloud deployments is to store your linked templates in a location that is accessible for the target cloud. В идеале все артефакты развертывания обслуживаются в конвейере непрерывной интеграции и разработки (CI/CD) и развертываются из него.Ideally all deployment artifacts are maintained in and deployed from a continuous integration/continuous development (CI/CD) pipeline. Кроме того, вложенные шаблоны можно хранить в контейнере хранилища BLOB-объектов, из которого Azure Resource Manager может их получить.Alternatively, you can store nested templates in a blob storage container, from which Azure Resource Manager can retrieve them.

Так как хранилище BLOB-объектов для каждого облака использует другое полное доменное имя (FQDN) конечной точки, в шаблоне необходимо настроить расположение связанных шаблонов с помощью двух параметров.Since the blob storage on each cloud uses a different endpoint fully qualified domain name (FQDN), configure the template with the location of the linked templates with two parameters. Параметры могут принимать ввод пользователя во время развертывания.Parameters can accept user input at deployment time. Шаблоны обычно создаются и совместно используются несколькими пользователями, поэтому мы рекомендуем применять для этих параметров стандартные имена.Templates are typically authored and shared by multiple people, so a best practice is to use a standard name for these parameters. Соглашения об именовании помогают расширить возможности использования шаблонов в разных регионах и облачных средах, а также разными авторами.Naming conventions help make templates more reusable across regions, clouds, and authors.

В следующем примере кода _artifactsLocation используется для указания одного расположения, которое содержит все артефакты, связанные с развертыванием.In the following code, _artifactsLocation is used to point to a single location, containing all deployment-related artifacts. Обратите внимание, что предоставлено значение по умолчанию.Notice that a default value is provided. Во время развертывания, если не указать входное значение для _artifactsLocation, используется значение по умолчанию.At deployment time, if no input value is specified for _artifactsLocation, the default value is used. _artifactsLocationSasToken используется в качестве входных данных для sasToken.The _artifactsLocationSasToken is used as input for the sasToken. Значение по умолчанию должно быть пустой строкой для сценариев, где для _artifactsLocation не предусмотрена защита, как, например, в случае с общедоступным репозиторием GitHub.The default value should be an empty string for scenarios where the _artifactsLocation isn't secured — for example, a public GitHub repository.

"parameters": {
  "_artifactsLocation": {
    "type": "string",
    "metadata": {
      "description": "The base URI where artifacts required by this template are located."
    },
    "defaultValue": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/201-vm-custom-script-windows/"
  },
  "_artifactsLocationSasToken": {
    "type": "securestring",
    "metadata": {
      "description": "The sasToken required to access _artifactsLocation."
    },
    "defaultValue": ""
  }
}

В шаблоне ссылки создаются путем объединения базового URI (из параметра _artifactsLocation) с относительным путем к артефакту и _artifactsLocationSasToken.Throughout the template, links are generated by combining the base URI (from the _artifactsLocation parameter) with an artifact-relative path and the _artifactsLocationSasToken. В примере кода ниже показано, как указать ссылку на вложенный шаблон с помощью функции шаблона URI:The following code shows how to specify the link to the nested template using the uri template function:

"resources": [
  {
    "name": "shared",
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2015-01-01",
    "properties": {
      "mode": "Incremental",
      "templateLink": {
        "uri": "[uri(parameters('_artifactsLocation'), concat('nested/vnet.json', parameters('_artifactsLocationSasToken')))]",
        "contentVersion": "1.0.0.0"
      }
    }
  }
]

Благодаря такому подходу используется значение по умолчанию для параметра _artifactsLocation.By using this approach, the default value for the _artifactsLocation parameter is used. Если связанные шаблоны должны быть получены из другого расположения, входные данные параметра могут использоваться во время развертывания, чтобы переопределить значение по умолчанию — изменения для самого шаблона не требуются.If the linked templates need to be retrieved from a different location, the parameter input can be used at deployment time to override the default value—no change to the template itself is needed.

Помимо использования для вложенных шаблонов, URL-адрес в параметре _artifactsLocation используется в качестве основы для всех связанных артефактов шаблона развертывания.Besides being used for nested templates, the URL in the _artifactsLocation parameter is used as a base for all related artifacts of a deployment template. Некоторые расширения виртуальных машин включают ссылку на сценарий, который хранится за пределами шаблона.Some VM extensions include a link to a script stored outside the template. Для этих расширений не следует жестко кодировать ссылки.For these extensions, you should not hardcode the links. Например, расширения пользовательских сценариев и PowerShell DSC могут быть связаны с внешним сценарием на сайте GitHub, как показано ниже:For example, the Custom Script and PowerShell DSC extensions may link to an external script on GitHub as shown:

"properties": {
  "publisher": "Microsoft.Compute",
  "type": "CustomScriptExtension",
  "typeHandlerVersion": "1.9",
  "autoUpgradeMinorVersion": true,
  "settings": {
    "fileUris": [
      "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/scripts/configure-music-app.ps1"
    ]
  }
}

Жесткое кодирование ссылок на сценарий потенциально блокирует успешное развертывание шаблона в другом расположении.Hardcoding the links to the script potentially prevents the template from deploying successfully to another location. Во время настройки ресурсов виртуальной машины агент виртуальной машины, выполняемый на этой машине, инициирует загрузку всех сценариев, на которые есть ссылки в расширении виртуальной машины, а затем сохраняет их на локальном диске виртуальной машины.During configuration of the VM resource, the VM agent running inside the VM initiates a download of all the scripts linked in the VM extension, and then stores the scripts on the VM's local disk. Этот режим аналогичен связыванию вложенных шаблонов, которое описывалось выше в разделе "Использование вложенных шаблонов в разных регионах".This approach functions like the nested template links explained earlier in the "Use nested templates across regions" section.

Resource Manager извлекает вложенные шаблоны во время выполнения.Resource Manager retrieves nested templates at runtime. Для расширений виртуальной машины получение любых внешних артефактов выполняется агентом виртуальной машины.For VM extensions, the retrieval of any external artifacts is performed by the VM agent. Помимо отличия в инициаторе извлечения артефактов, решение в определении шаблона аналогично.Besides the different initiator of the artifact retrieval, the solution in the template definition is the same. Используйте параметр _artifactsLocation со значением базового пути по умолчанию, где хранятся все артефакты (включая сценарии расширений виртуальной машины) и параметр _artifactsLocationSasToken в качестве входных данных для sasToken.Use the _artifactsLocation parameter with a default value of the base path where all the artifacts are stored (including the VM extension scripts) and the _artifactsLocationSasToken parameter for the input for the sasToken.

"parameters": {
  "_artifactsLocation": {
    "type": "string",
    "metadata": {
      "description": "The base URI where artifacts required by this template are located."
    },
    "defaultValue": "https://raw.githubusercontent.com/Microsoft/dotnet-core-sample-templates/master/dotnet-core-music-windows/"
  },
  "_artifactsLocationSasToken": {
    "type": "securestring",
    "metadata": {
      "description": "The sasToken required to access _artifactsLocation."
    },
    "defaultValue": ""
  }
}

Для создания абсолютного URI артефакта рекомендуется использовать функцию шаблона uri, вместо функции шаблона concat.To construct the absolute URI of an artifact, the preferred method is to use the uri template function, instead of the concat template function. Заменив жестко закодированные ссылки на сценарии в расширении виртуальной машины функцией шаблона uri, можно настроить эту функциональность в шаблоне для обеспечения согласованности с облаком.By replacing hardcoded links to the scripts in the VM extension with the uri template function, this functionality in the template is configured for cloud consistency.

"properties": {
  "publisher": "Microsoft.Compute",
  "type": "CustomScriptExtension",
  "typeHandlerVersion": "1.9",
  "autoUpgradeMinorVersion": true,
  "settings": {
    "fileUris": [
      "[uri(parameters('_artifactsLocation'), concat('scripts/configure-music-app.ps1', parameters('_artifactsLocationSasToken')))]"
    ]
  }
}

При таком подходе все артефакты развертывания, включая сценарии конфигурации, могут храниться в одном расположении вместе с шаблоном.With this approach, all deployment artifacts, including configuration scripts, can be stored in the same location with the template itself. Чтобы изменить расположение всех ссылок, необходимо только указать другой базовый URL-адрес для параметров artifactsLocation.To change the location of all the links, you only need to specify a different base URL for the artifactsLocation parameters.

Факторы, определяющие различие возможностей регионовFactor in differing regional capabilities

В связи с гибкой разработкой и непрерывным потоком обновлений и новых служб, представляемых в Azure, доступность служб и обновлений в разных регионах может отличаться.With the agile development and continuous flow of updates and new services introduced to Azure, regions can differ in availability of services or updates. После тщательного внутреннего тестирования новые службы или обновления для существующих служб обычно представляются небольшой аудитории клиентов, участвующих в программе проверки.After rigorous internal testing, new services or updates to existing services are usually introduced to a small audience of customers participating in a validation program. После успешной проверки клиентами службы или обновления становятся доступными в ряде регионов Azure, затем в большем количестве регионов, развертываются в национальных облаках и, потенциально, также становятся доступны для клиентов Azure Stack.After successful customer validation, the services or updates are made available within a subset of Azure regions, then introduced to more regions, rolled out to the sovereign clouds, and potentially made available for Azure Stack customers as well.

Зная, что набор доступных служб может различаться в разных регионах и облаках Azure, можно принять некоторые упреждающие решения в отношении шаблонов.Knowing that Azure regions and clouds may differ in their available services, you can make some proactive decisions about your templates. Лучше всего начать с проверки доступных поставщиков ресурсов для облака.A good place to start is by examining the available resource providers for a cloud. Поставщик ресурсов сообщает о наборе ресурсов и операций, доступных для службы Azure.A resource provider tells you the set of resources and operations that are available for an Azure service.

Шаблон развертывает и настраивает ресурсы.A template deploys and configures resources. Тип ресурса предоставляется поставщиком ресурсов.A resource type is provided by a resource provider. Например, поставщик вычислительных ресурсов (Microsoft.Compute) предоставляет несколько типов ресурсов, таких как virtualMachines и availabilitySets.For example, the compute resource provider (Microsoft.Compute), provides multiple resource types such as virtualMachines and availabilitySets. Каждый поставщик ресурсов предоставляет API для Azure Resource Manager, определяемый общим контрактом, включая согласованные, унифицированные возможности разработки для всех поставщиков ресурсов.Each resource provider provides an API to Azure Resource Manager defined by a common contract, enabling a consistent, unified authoring experience across all resource providers. Тем не менее поставщик ресурсов, доступный в глобальной платформе Azure, может оказаться недоступным в национальном облаке или регионе Azure Stack.However, a resource provider that is available in global Azure may not be available in a sovereign cloud or an Azure Stack region.

Поставщики ресурсов

Чтобы проверить поставщиков ресурсов, доступных в данной облачной среде, выполните следующий сценарий в интерфейсе командной строки Azure (CLI):To verify the resource providers that are available in a given cloud, run the following script in the Azure command line interface (CLI):

az provider list --query "[].{Provider:namespace, Status:registrationState}" --out table

Для просмотра доступных поставщиков ресурсов можно также использовать следующий командлет PowerShell:You can also use the following PowerShell cmdlet to see available resource providers:

Get-AzureRmResourceProvider -ListAvailable | Select-Object ProviderNamespace, RegistrationState

Проверка версии всех типов ресурсовVerify the version of all resource types

Набор свойств является общим для всех типов ресурсов, однако каждый ресурс также имеет собственные свойства.A set of properties is common for all resource types, but each resource also has its own specific properties. Новые функции и связанные свойства периодически добавляются к существующим типам ресурсов с помощью новой версии API.New features and related properties are added to existing resource types at times through a new API version. У ресурса в шаблоне есть собственное свойство версии API — apiVersion.A resource in a template has its own API version property - apiVersion. Этот компонент управления версиями гарантирует, что на существующую конфигурацию ресурса в шаблоне не влияют изменения в платформе.This versioning ensures that an existing resource configuration in a template is not affected by changes on the platform.

Новые версии API, представленные в существующих типах ресурсов в глобальной платформе Azure, могут не сразу становиться доступными во всех регионах, национальных облаках и Azure Stack.New API versions introduced to existing resource types in global Azure might not immediately be available in all regions, sovereign clouds, or Azure Stack. Чтобы просмотреть список доступных поставщиков ресурсов, типов ресурсов и версий API для облака, можно использовать обозреватель ресурсов на портале Azure.To view a list of the available resource providers, resource types, and API versions for a cloud, you can use Resource Explorer in Azure portal. Найдите обозреватель ресурсов в меню "Все службы".Search for Resource Explorer in the All Services menu. В обозревателе ресурсов разверните узел "Поставщики", чтобы просмотреть всех доступных поставщиков ресурсов, их типы ресурсов и версии API в этом облаке.Expand the Providers node in Resource Explorer to return all the available resource providers, their resource types, and API versions in that cloud.

Чтобы получить список доступных версий API для всех типов ресурсов в заданном облаке в Azure CLI, выполните следующий сценарий:To list the available API version for all resource types in a given cloud in Azure CLI, run the following script:

az provider list --query "[].{namespace:namespace, resourceType:resourceType[]}"

Вы также можете воспользоваться следующим командлетом PowerShell:You can also use the following PowerShell cmdlet:

Get-AzureRmResourceProvider | select-object ProviderNamespace -ExpandProperty ResourceTypes | ft ProviderNamespace, ResourceTypeName, ApiVersions

Ссылка на расположения ресурсов с помощью параметраRefer to resource locations with a parameter

Шаблон всегда развертывается в группе ресурсов, которая размещается в регионе.A template is always deployed into a resource group that resides in a region. Помимо собственно развертывания, каждый ресурс в шаблоне также имеет свойство расположения, которое используется для указания региона для развертывания.Besides the deployment itself, each resource in a template also has a location property that you use to specify the region to deploy in. Чтобы разработать шаблон для обеспечения согласованности в облаке, нужен динамический способ обращения к расположениям ресурсов, так как каждый экземпляр Azure Stack может содержать уникальные имена расположений.To develop your template for cloud consistency, you need a dynamic way to refer to resource locations, because each Azure Stack can contain unique location names. Обычно ресурсы развертываются в том же регионе, что и группа ресурсов, но для поддержки таких сценариев, как доступность приложений между регионами, может быть удобнее распределить ресурсы между регионами.Usually resources are deployed in the same region as the resource group, but to support scenarios such as cross-region application availability, it can be useful to spread resources across regions.

Несмотря на то, что у вас есть возможность жестко задавать имена регионов при указании свойств ресурсов в шаблоне, этот подход не гарантирует, что шаблон можно будет развертывать в других средах Azure Stack, так как имена регионов, скорее всего, не будут совпадать.Even though you could hardcode the region names when specifying the resource properties in a template, this approach doesn't guarantee that the template can be deployed to other Azure Stack environments, because the region name most likely doesn't exist there.

Для размещения в разных регионах добавьте в шаблон входной параметр расположения со значением по умолчанию.To accommodate different regions, add an input parameter location to the template with a default value. Значение по умолчанию будет использоваться, если во время развертывания не будет указано значение.The default value will be used if no value is specified during deployment.

Функция шаблона [resourceGroup()] возвращает объект, содержащий следующие пары "ключ-значение":The template function [resourceGroup()] returns an object that contains the following key/value pairs:

{
  "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}",
  "name": "{resourceGroupName}",
  "location": "{resourceGroupLocation}",
  "tags": {
  },
  "properties": {
    "provisioningState": "{status}"
  }
}

Ссылаясь на ключ расположения объекта в значении defaultValue входного параметра, Azure Resource Manager во время выполнения заменит функцию шаблона [resourceGroup().location] именем расположения группы ресурсов для развертывания шаблона.By referencing the location key of the object in the defaultValue of the input parameter, Azure Resource Manager will, at runtime, replace the [resourceGroup().location] template function with the name of the location of the resource group the template is deployed to.

"parameters": {
  "location": {
    "type": "string",
    "metadata": {
      "description": "Location the resources will be deployed to."
    },
    "defaultValue": "[resourceGroup().location]"
  }
},
"resources": [
  {
    "name": "storageaccount1",
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2015-06-15",
    "location": "[parameters('location')]",
    ...

С помощью этой функции шаблона шаблон можно развернуть в любом облаке, даже не зная имен регионов заранее.With this template function, you can deploy your template to any cloud without even knowing the region names in advance. Кроме того, расположение для определенного ресурса в шаблоне может отличаться от расположения группы ресурсов.In addition, a location for a specific resource in the template can differ from the resource group location. В этом случае его можно настроить с помощью дополнительных входных параметров для этого конкретного ресурса, тогда как другие ресурсы в том же шаблоне будут по-прежнему использовать входной параметр первоначального расположения.In this case, you can configure it by using additional input parameters for that specific resource, while the other resources in the same template still use the initial location input parameter.

Отслеживание версий с помощью профилей APITrack versions using API profiles

Отслеживание всех доступных поставщиков ресурсов и связанных версий API, которые есть в Azure Stack, может оказаться очень сложной задачей.It can be very challenging to keep track of all the available resource providers and related API versions that are present in Azure Stack. Например, на момент написания этой статьи последняя версия API для Microsoft.Compute/availabilitySets в Azure — 2018-04-01, тогда как доступная версия API, общая для Azure и Azure Stack, — 2016-03-30.For example, at the time of writing, the latest API version for Microsoft.Compute/availabilitySets in Azure is 2018-04-01, while the available API version common to Azure and Azure Stack is 2016-03-30. Общая версия API для Microsoft.Storage/storageAccounts, используемая совместно всеми расположениями Azure и Azure Stack, — 2016-01-01, тогда как последняя версия API в Azure — 2018-02-01.The common API version for Microsoft.Storage/storageAccounts shared among all Azure and Azure Stack locations is 2016-01-01, while the latest API version in Azure is 2018-02-01.

По этой причине в Resource Manager введена концепция профилей API для шаблонов.For this reason, Resource Manager introduced the concept of API profiles to templates. Без профилей API для каждого ресурса в шаблоне настраивается элемент apiVersion, описывающий версию API для конкретного ресурса.Without API profiles, each resource in a template is configured with an apiVersion element that describes the API version for that specific resource.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "metadata": {
                "description": "Location the resources will be deployed to."
            },
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {},
    "resources": [
        {
            "name": "mystorageaccount",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2016-01-01",
            "location": "[parameters('location')]",
            "properties": {
                "accountType": "Standard_LRS"
            }
        },
        {
            "name": "myavailabilityset",
            "type": "Microsoft.Compute/availabilitySets",
            "apiVersion": "2016-03-30",
            "location": "[parameters('location')]",
            "properties": {
                "platformFaultDomainCount": 2,
                "platformUpdateDomainCount": 2
            }
        }
    ],
    "outputs": {}
}

Версия профиля API служит своего рода псевдонимом для отдельной версии API на каждый тип ресурсов, общий для Azure и Azure Stack.An API profile version acts as an alias for a single API version per resource type common to Azure and Azure Stack. Вместо указания версии API для каждого ресурса в шаблоне укажите только версию профиля API в новом корневом элементе apiProfile и не указывайте элемент apiVersion для отдельных ресурсов.Instead of specifying an API version for each resource in a template, you specify only the API profile version in a new root element called apiProfile and omit the apiVersion element for the individual resources.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "apiProfile": "2018–03-01-hybrid",
    "parameters": {
        "location": {
            "type": "string",
            "metadata": {
                "description": "Location the resources will be deployed to."
            },
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {},
    "resources": [
        {
            "name": "mystorageaccount",
            "type": "Microsoft.Storage/storageAccounts",
            "location": "[parameters('location')]",
            "properties": {
                "accountType": "Standard_LRS"
            }
        },
        {
            "name": "myavailabilityset",
            "type": "Microsoft.Compute/availabilitySets",
            "location": "[parameters('location')]",
            "properties": {
                "platformFaultDomainCount": 2,
                "platformUpdateDomainCount": 2
            }
        }
    ],
    "outputs": {}
}

Профиль API гарантирует, что версии API будут доступны в разных расположениях, поэтому вам не нужно вручную проверять значения apiVersion, доступные в определенном расположении.The API profile ensures that the API versions are available across locations, so you do not have to manually verify the apiVersions that are available in a specific location. Чтобы гарантировать, что версии API, на которые ссылается профиль API, присутствуют в среде Azure Stack, операторы Azure Stack должны поддерживать решение в актуальном состоянии (на основе политики поддержки).To ensure the API versions referenced by your API profile are present in an Azure Stack environment, the Azure Stack operators must keep the solution up-to-date based on the policy for support. Если система не обновлялась более шести месяцев, она считается несовместимой, и среду необходимо обновить.If a system is more than six months out of date, it is considered out of compliance, and the environment must be updated.

Профиль API не является обязательным элементом в шаблоне.The API profile isn't a required element in a template. Даже если вы добавили этот элемент, он будет использоваться только для ресурсов, для которых не указан apiVersion.Even if you add the element, it will only be used for resources for which no apiVersion is specified. Этот элемент позволяет выполнять постепенные изменения, но не требует вносить изменения в существующие шаблоны.This element allows for gradual changes but doesn't require any changes to existing templates.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "apiProfile": "2018–03-01-hybrid",
    "parameters": {
        "location": {
            "type": "string",
            "metadata": {
                "description": "Location the resources will be deployed to."
            },
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {},
    "resources": [
        {
            "name": "mystorageaccount",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2016-01-01",
            "location": "[parameters('location')]",
            "properties": {
                "accountType": "Standard_LRS"
            }
        },
        {
            "name": "myavailabilityset",
            "type": "Microsoft.Compute/availabilitySets",
            "location": "[parameters('location')]",
            "properties": {
                "platformFaultDomainCount": 2,
                "platformUpdateDomainCount": 2
            }
        }
    ],
    "outputs": {}
}

Проверка ссылок на конечные точкиCheck endpoint references

Ресурсы могут иметь ссылки на другие службы в платформе.Resources can have references to other services on the platform. Например, общедоступному IP-адресу может быть назначено общедоступное DNS-имя.For example, a public IP can have a public DNS name assigned to it. Общедоступное облако, национальные облака и решения Azure Stack имеют собственные различающиеся пространства имен конечной точки.The public cloud, the sovereign clouds, and Azure Stack solutions have their own distinct endpoint namespaces. В большинстве случаев ресурс требует только наличия префикса в качестве входных данных в шаблоне.In most cases, a resource requires only a prefix as input in the template. Во время выполнения Azure Resource Manager добавляет к нему значение конечной точки.During runtime, Azure Resource Manager appends the endpoint value to it. Некоторые значения конечных точек должны быть явно указаны в шаблоне.Some endpoint values need to be explicitly specified in the template.

Примечание

Чтобы разработать шаблоны для обеспечения согласованности в облаке, не следует жестко кодировать пространства имен конечных точек.To develop templates for cloud consistency, don't hardcode endpoint namespaces.

Следующие два примера — типичные пространства имен конечных точек, которые должны быть явно указаны при создании ресурса:The following two examples are common endpoint namespaces that need to be explicitly specified when creating a resource:

  • Учетные записи хранения (BLOB-объекты, очереди, таблицы и файлы)Storage accounts (blob, queue, table and file)
  • Строки подключения для баз данных и кэша Azure для RedisConnection strings for databases and Azure Cache for Redis

Пространства имен конечных точек также можно использовать в выходных данных шаблона как сведения для пользователя после завершения развертывания.Endpoint namespaces can also be used in the output of a template as information for the user when the deployment completes. Ниже приведено несколько типичных примеров.The following are common examples:

  • Учетные записи хранения (BLOB-объекты, очереди, таблицы и файлы)Storage accounts (blob, queue, table and file)
  • Строки подключения (MySql, SQLServer, SQLAzure, Custom, NotificationHub, ServiceBus, EventHub, ApiHub, DocDb, RedisCache, PostgreSQL)Connection strings (MySql, SQLServer, SQLAzure, Custom, NotificationHub, ServiceBus, EventHub, ApiHub, DocDb, RedisCache, PostgreSQL)
  • Диспетчер трафикаTraffic Manager
  • domainNameLabel для общедоступного IP-адресаdomainNameLabel of a public IP address
  • Облачные службыCloud services

Как правило, не рекомендуется использовать жестко заданные конечные точки в шаблоне.In general, avoid hardcoded endpoints in a template. Лучше всего использовать функцию шаблона reference для динамического получения конечных точек.The best practice is to use the reference template function to retrieve the endpoints dynamically. К распространенным примерам жестко задаваемой конечной точки относится пространство имен конечной точки для учетных записей хранения.For example, the endpoint most commonly hardcoded is the endpoint namespace for storage accounts. Каждой учетной записи хранения назначается уникальное полное доменное имя, сформированное путем объединения имени учетной записи хранения с пространством имен конечной точки.Each storage account has a unique FQDN that is constructed by concatenating the name of the storage account with the endpoint namespace. Учетная запись хранения BLOB-объектов с именем mystorageaccount1 получает разные полные доменные имена в зависимости от облака:A blob storage account named mystorageaccount1 results in different FQDNs depending on the cloud:

  • mystorageaccount1.blob.core.windows.net при создании в глобальном облаке Azure.mystorageaccount1.blob.core.windows.net when created on the global Azure cloud.
  • mystorageaccount1.blob.core.chinacloudapi.cn при создании в облаке Azure для Китая.mystorageaccount1.blob.core.chinacloudapi.cn when created in the Azure China cloud.

Следующая функция шаблона reference получает пространство имен конечной точки от поставщика ресурсов хранилища:The following reference template function retrieves the endpoint namespace from the storage resource provider:

"diskUri":"[concat(reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2015-06-15').primaryEndpoints.blob, 'container/myosdisk.vhd')]"

Благодаря замене жестко закодированного значения конечной точки учетной записи хранения функцией шаблона reference один шаблон можно использовать для успешного развертывания в разных средах без внесения изменений в ссылку на конечную точку.By replacing the hardcoded value of the storage account endpoint with the reference template function, you can use the same template to deploy to different environments successfully without making any changes to the endpoint reference.

Ссылка на существующие ресурсы по уникальному идентификаторуRefer to existing resources by unique ID

На существующий ресурс можно также ссылаться из той же или другой группы ресурсов, в той же или в другой подписке в одном клиенте в том же облаке.You can also refer to an existing resource from the same or another resource group, and within the same subscription or another subscription, within the same tenant in the same cloud. Чтобы получить свойства ресурса, необходимо использовать уникальный идентификатор для самого ресурса.To retrieve the resource properties, you must use the unique identifier for the resource itself. Функция шаблона resourceId извлекает уникальный идентификатор ресурса, например SQL Server, как показано в следующем коде:The resourceId template function retrieves the unique ID of a resource such as SQL Server as the following code shows:

"outputs": {
  "resourceId":{
    "type": "string",
    "value": "[resourceId('otherResourceGroup', 'Microsoft.Sql/servers', parameters('serverName'))]"
  }
}

Затем можно использовать функцию resourceId внутри функции шаблона reference для получения свойств базы данных.You can then use the resourceId function inside the reference template function to retrieve the properties of a database. Возвращаемый объект содержит свойство fullyQualifiedDomainName, которое содержит полное значение конечной точки.The return object contains the fullyQualifiedDomainName property that holds the full endpoint value. Это значение извлекается во время выполнения и предоставляет пространство имен конечной точки для конкретной облачной среды.This value is retrieved at runtime and provides the cloud environment-specific endpoint namespace. Чтобы определить строку подключения без жесткого задания пространства имен конечной точки, можно сослаться на свойство возвращаемого объекта напрямую в строке подключения, как показано ниже:To define the connection string without hardcoding the endpoint namespace, you can refer to the property of the return object directly in the connection string as shown:

"[concat('Server=tcp:', reference(resourceId('sql', 'Microsoft.Sql/servers', parameters('test')), '2015-05-01-preview').fullyQualifiedDomainName, ',1433;Initial Catalog=', parameters('database'),';User ID=', parameters('username'), ';Password=', parameters('pass'), ';Encrypt=True;')]"

Необходимость учитывать свойства ресурсаConsider resource properties

Определенные ресурсы в средах Azure Stack имеют уникальные свойства, которые необходимо учитывать в шаблоне.Specific resources within Azure Stack environments have unique properties you must consider in your template.

Проверка доступности образов виртуальных машинEnsure VM images are available

Azure предоставляет широкий выбор образов виртуальных машин.Azure provides a rich selection of VM images. Эти образы создаются и готовятся к развертыванию корпорацией Майкрософт и партнерами.These images are created and prepared for deployment by Microsoft and partners. Образы формируют основу для виртуальных машин на платформе.The images form the foundation for VMs on the platform. Тем не менее шаблон, согласованный с облаком, должен ссылаться только на параметры (в частности, издателя, предложение и SKU для образов виртуальных машин), доступные для глобальной среды Azure, национальных облаков Azure и решения Azure Stack.However, a cloud-consistent template should refer to available parameters only — in particular, the publisher, offer, and SKU of the VM images available to the global Azure, Azure sovereign clouds, or an Azure Stack solution.

Чтобы получить список доступных образов виртуальных машин в расположении, выполните следующую команду Azure CLI:To retrieve a list of the available VM images in a location, run the following Azure CLI command:

az vm image list -all

Тот же список можно получить с помощью командлета Azure PowerShell Get-AzureRmVMImagePublisher, указав расположение с помощью параметра -Location.You can retrieve the same list with the Azure PowerShell cmdlet Get-AzureRmVMImagePublisher and specify the location you want with the -Location parameter. Пример:For example:

Get-AzureRmVMImagePublisher -Location "West Europe" | Get-AzureRmVMImageOffer | Get-AzureRmVMImageSku | Get-AzureRmVMImage

Эта команда выполняется несколько минут и возвращает все доступные образы в регионе "Западная Европа" глобального облака Azure.This command takes a couple of minutes to return all the available images in the West Europe region of the global Azure cloud.

Если сделать эти образы виртуальных машин доступными для Azure Stack, будут использоваться все доступные хранилища.If you made these VM images available to Azure Stack, all the available storage would be consumed. Чтобы обеспечить гибкие возможности масштабирования, Azure Stack позволяет выбирать образы, которые вы хотите добавить в среду.To accommodate even the smallest scale unit, Azure Stack allows you to select the images you want to add to an environment.

В следующем примере кода показан последовательный подход для задания ссылок на параметры издателя, предложения и SKU в шаблонах Azure Resource Manager:The following code sample shows a consistent approach to refer to the publisher, offer, and SKU parameters in your Azure Resource Manager templates:

"storageProfile": {
    "imageReference": {
    "publisher": "MicrosoftWindowsServer",
    "offer": "WindowsServer",
    "sku": "2016-Datacenter",
    "version": "latest"
    }
}

Проверка размеров локальных виртуальных машинCheck local VM sizes

Чтобы разработать шаблон для обеспечения согласованности с облаком, необходимо убедиться, что нужный размер виртуальной машины доступен во всех целевых средах.To develop your template for cloud consistency, you need to make sure the VM size you want is available in all target environments. Размеры виртуальных машин — это группы характеристик производительности и возможностей.VM sizes are a grouping of performance characteristics and capabilities. Некоторые размеры виртуальных машин зависят от оборудования, на котором выполняется виртуальная машина.Some VM sizes depend on the hardware that the VM runs on. Например, если вы хотите развернуть виртуальную машину, оптимизированную для GPU, оборудование, на котором выполняется гипервизор, должно включать аппаратные графические процессоры.For example, if you want to deploy a GPU-optimized VM, the hardware that runs the hypervisor needs to have the hardware GPUs.

Когда корпорация Майкрософт выпускает новый размер виртуальной машины, имеющий определенные аппаратные зависимости, как правило, такой размер виртуальной машины сначала предоставляется в небольшом наборе регионов в облаке Azure.When Microsoft introduces a new size of VM that has certain hardware dependencies, the VM size is usually made available first in a small subset of regions in the Azure cloud. Позднее он становится доступным в других регионах и облаках.Later, it is made available to other regions and clouds. Чтобы убедиться, что размер виртуальной машины существует в каждом целевом облаке, можно получить доступные размеры с помощью следующей команды Azure CLI:To make sure the VM size exists in each cloud you deploy to, you can retrieve the available sizes with the following Azure CLI command:

az vm list-sizes --location "West Europe"

Для Azure PowerShell:For Azure PowerShell, use:

Get-AzureRmVMSize -Location "West Europe"

Полный список доступных служб см. на странице Доступность продуктов по регионам.For a full list of available services, see Products available by region.

Проверка использования управляемых дисков Azure в Azure StackCheck use of Azure Managed Disks in Azure Stack

Управляемые диски обрабатывают хранилища для клиента Azure.Managed disks handle the storage for an Azure tenant. Вместо явного создания учетной записи хранения и указания URI для виртуального жесткого диска (VHD) можно использовать управляемые диски для неявного выполнения этих действий при развертывании виртуальной машины.Instead of explicitly creating a storage account and specifying the URI for a virtual hard disk (VHD), you can use managed disks to implicitly perform these actions when you deploy a VM. Управляемые диски помогают повысить доступность благодаря размещению всех дисков из виртуальных машин в одной группе доступности в разных единицах хранения.Managed disks enhance availability by placing all the disks from VMs in the same availability set into different storage units. Кроме того, существующие виртуальные жесткие диски можно преобразовать из уровня хранилища "Стандартный" в уровень "Премиум", чтобы существенно сократить время простоя.Additionally, existing VHDs can be converted from Standard to Premium storage with significantly less downtime.

Несмотря на то, что управляемые диски включены в планы по выпуску для Azure Stack, в настоящее время они не поддерживаются.Although managed disks are on the roadmap for Azure Stack, they are currently not supported. Тем временем вы можете разрабатывать согласованные с облаком шаблоны для Azure Stack, явно указывая виртуальные жесткие диски с помощью элемента vhd в шаблоне для ресурса виртуальной машины, как показано ниже:Until they are, you can develop cloud-consistent templates for Azure Stack by explicitly specifying VHDs using the vhd element in the template for the VM resource as shown:

"storageProfile": {
  "imageReference": {
    "publisher": "MicrosoftWindowsServer",
    "offer": "WindowsServer",
    "sku": "[parameters('windowsOSVersion')]",
    "version": "latest"
  },
  "osDisk": {
    "name": "osdisk",
    "vhd": {
      "uri": "[concat(reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), '2015-06-15').primaryEndpoints.blob, 'vhds/osdisk.vhd')]"
    },
    "caching": "ReadWrite",
    "createOption": "FromImage"
  }
}

Напротив, чтобы указать конфигурацию управляемого диска в шаблоне, удалите элемент vhd из конфигурации диска.In contrast, to specify a managed disk configuration in a template, remove the vhd element from the disk configuration.

"storageProfile": {
  "imageReference": {
    "publisher": "MicrosoftWindowsServer",
    "offer": "WindowsServer",
    "sku": "[parameters('windowsOSVersion')]",
    "version": "latest"
  },
  "osDisk": {
    "caching": "ReadWrite",
    "createOption": "FromImage"
  }
}

Аналогичные изменения также применяются к дискам данных.The same changes also apply data disks.

Проверка доступности расширений виртуальной машины в Azure StackVerify that VM extensions are available in Azure Stack

Еще одним аспектом, который необходимо учитывать для обеспечения согласованности с облаком, является использование расширений виртуальных машин для настройки ресурсов в виртуальной машине.Another consideration for cloud consistency is the use of virtual machine extensions to configure the resources inside a VM. Не все расширения виртуальной машины доступны в Azure Stack.Not all VM extensions are available in Azure Stack. Шаблон может указывать ресурсы, выделенные для расширения виртуальной машины, путем создания зависимостей и условий в шаблоне.A template can specify the resources dedicated to the VM extension, creating dependencies and conditions within the template.

Например, если вы хотите настроить виртуальную машину под управлением Microsoft SQL Server, расширение виртуальной машины может настраивать SQL Server в процессе развертывания шаблона.For example, if you want to configure a VM running Microsoft SQL Server, the VM extension can configure SQL Server as part the template deployment. Рассмотрим, что произойдет, если шаблон развертывания также содержит сервер приложений, настроенный для создания базы данных на виртуальной машине под управлением SQL Server.Consider what happens if the deployment template also contains an application server configured to create a database on the VM running SQL Server. Помимо использования расширения виртуальной машины для серверов приложений, можно настроить зависимость сервера приложений от успешного возвращения ресурса расширения виртуальной машины SQL Server.Besides also using a VM extension for the application servers, you can configure the dependency of the application server on the successful return of the SQL Server VM extension resource. Такой подход гарантирует, что виртуальная машина под управлением SQL Server будет настроена и доступна на тот момент, когда сервер приложений получит указание создать базу данных.This approach ensures the VM running SQL Server is configured and available when the application server is instructed to create the database.

Декларативный подход к созданию шаблонов позволяет определять конечное состояние ресурсов и зависимостей между ними, тогда как платформа обеспечивает логику, необходимую для зависимостей.The declarative approach of the template allows you to define the end state of the resources and their inter-dependencies, while the platform takes care of the logic required for the dependencies.

Проверка доступности расширений виртуальной машиныCheck that VM extensions are available

Существует много типов расширений виртуальной машины.Many types of VM extensions exist. При разработке шаблона для обеспечения согласованности с облаком убедитесь, что используются только те расширения, которые доступны во всех регионах, для которых предназначен шаблон.When developing template for cloud consistency, make sure to use only the extensions that are available in all the regions the template targets.

Для получения списка расширений виртуальной машины, доступных для определенного региона (в этом примере myLocation), выполните следующую команду Azure CLI:To retrieve a list of the VM extensions that are available for a specific region (in this example, myLocation), run the following Azure CLI command:

az vm extension image list --location myLocation

Вы также можете выполнить командлет Azure PowerShell Get-AzureRmVmImagePublisher и использовать -Location для указания расположения образа виртуальной машины.You can also execute the Azure PowerShell Get-AzureRmVmImagePublisher cmdlet and use -Location to specify the location of the virtual machine image. Пример:For example:

Get-AzureRmVmImagePublisher -Location myLocation | Get-AzureRmVMExtensionImageType | Get-AzureRmVMExtensionImage | Select Type, Version

Проверка доступности версийEnsure that versions are available

Поскольку расширения виртуальной машины являются основными ресурсами Resource Manager, они имеют собственные версии API.Since VM extensions are first-party Resource Manager resources, they have their own API versions. Как показано в следующем примере кода, тип расширения виртуальной машины — это вложенный ресурс в поставщике ресурсов Microsoft.Compute.As the following code shows, the VM extension type is a nested resource in the Microsoft.Compute resource provider.

{
    "apiVersion": "2015-06-15",
    "type": "Microsoft.Compute/virtualMachines/extensions",
    "name": "myExtension",
    "location": "[parameters('location')]",
    ...

Версия API ресурса расширения виртуальной машины должна присутствовать во всех планируемых целевых расположениях шаблона.The API version of the VM extension resource must be present in all the locations you plan to target with your template. Зависимость расположений действует аналогично доступности версии API поставщика ресурсов, о которой говорилось выше в разделе "Проверка версии всех типов ресурсов".The location dependency works like the resource provider API version availability discussed earlier in the "Verify the version of all resource types" section.

Чтобы получить список доступных версий API для ресурса расширения виртуальной машины, используйте командлет Get-AzureRmResourceProvider с поставщиком ресурсов Microsoft.Compute, как показано ниже:To retrieve a list of the available API versions for the VM extension resource, use the Get-AzureRmResourceProvider cmdlet with the Microsoft.Compute resource provider as shown:

Get-AzureRmResourceProvider -ProviderNamespace "Microsoft.Compute" | Select-Object -ExpandProperty ResourceTypes | Select ResourceTypeName, Locations, ApiVersions | where {$_.ResourceTypeName -eq "virtualMachines/extensions"}

Расширения виртуальной машины также можно использовать в масштабируемых наборах виртуальных машин.You can also use VM extensions in virtual machine scale sets. Применяются такие же условия расположения.The same location conditions apply. При разработке шаблона для обеспечения согласованности с облаком убедитесь, что версии API доступны во всех расположениях, в которых планируется развертывание.To develop your template for cloud consistency, make sure the API versions are available in all the locations you plan on deploying to. Чтобы получить список версий API ресурса расширения виртуальной машины для масштабируемых наборов, используйте тот же командлет, что и выше, но укажите следующий тип ресурса для масштабируемых наборов виртуальных машин:To retrieve the API versions of the VM extension resource for scale sets, use the same cmdlet as before, but specify the virtual machine scale sets resource type as shown:

Get-AzureRmResourceProvider -ProviderNamespace "Microsoft.Compute" | Select-Object -ExpandProperty ResourceTypes | Select ResourceTypeName, Locations, ApiVersions | where {$_.ResourceTypeName -eq "virtualMachineScaleSets/extensions"}

Каждому конкретному расширению также назначается версия.Each specific extension is also versioned. Эта версия отображается в свойстве typeHandlerVersion расширения виртуальной машины.This version is shown in the typeHandlerVersion property of the VM extension. Убедитесь, что версия, указанная в элементе typeHandlerVersion расширений виртуальной машины в шаблоне, доступна в расположениях, где планируется развернуть шаблон.Make sure that the version specified in the typeHandlerVersion element of your template's VM extensions are available in the locations where you plan to deploy the template. Например, следующий код указывает версию 1.7:For example, the following code specifies version 1.7:

{
    "name": "MyCustomScriptExtension",
    "type": "extensions",
    "apiVersion": "2016-03-30",
    "location": "[parameters('location')]",
    "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/myVM', copyindex())]"
    ],
    "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.7",
        ...   

Чтобы получить список доступных версий для определенного расширения виртуальной машины, используйте командлет Get-AzureRmVMExtensionImage.To retrieve a list of the available versions for a specific VM extension, use the Get-AzureRmVMExtensionImage cmdlet. Следующий пример получает доступные версии расширения виртуальной машины PowerShell DSC (Desired State Configuration) из myLocation:The following example retrieves the available versions for the PowerShell DSC (Desired State Configuration) VM extension from myLocation:

Get-AzureRmVMExtensionImage -Location myLocation -PublisherName Microsoft.PowerShell -Type DSC | FT

Для получения списка издателей используйте командлет Get-AzureRmVMImagePublisher.To get a list of publishers, use the Get-AzureRmVmImagePublisher command. Чтобы запросить тип, используйте командлет Get-AzureRmVMExtensionImageType.To request type, use the Get-AzureRmVMExtensionImageType commend.

Советы по тестированию и автоматизацииTips for testing and automation

Отслеживание всех связанные параметров, возможностей и ограничений при создании шаблона представляет собой сложную задачу.It's a challenge to keep track of all related settings, capabilities, and limitations while authoring a template. Типичный подход включает разработку и проверку шаблонов в одном облаке.The common approach is to develop and test templates against a single cloud before other locations are targeted. Тем не менее, чем раньше в процессе разработки будут выполнены такие тесты, тем меньше усилий по поиску неполадок и повторному написанию кода потребуется от вашей команды разработчиков.However, the earlier that tests are performed in the authoring process, the less troubleshooting and code rewriting your development team will have to do. Поиск неполадок в развертываниях, которые завершаются сбоем из-за зависимостей расположений, может занять много времени.Deployments that fail because of location dependencies can be time-consuming to troubleshoot. Именно поэтому мы рекомендуем проводить автоматизированное тестирование как можно раньше в цикле разработки.That’s why we recommend automated testing as early as possible in the authoring cycle. В конечном счете вам потребуется меньше времени на разработку и меньше ресурсов, а ценность артефактов, согласованных с облаком, только возрастет.Ultimately, you'll need less development time and fewer resources, and your cloud-consistent artifacts will become even more valuable.

Ниже показан типичный пример процесса разработки для команды, использующей интегрированную среду разработки (IDE).The following image shows a typical example of a development process for a team using an integrated development environment (IDE). На разных этапах временной шкалы выполняются разные типы тестов.At different stages in the timeline, different test types are executed. Здесь два разработчика работают над одним решением, однако этот сценарий в равной степени применим к одному разработчику или большой рабочей группе.Here, two developers are working on the same solution, but this scenario applies equally to a single developer or a large team. Каждый разработчик, как правило, создает локальную копию центрального репозитория, что позволяет разработчикам работать со своей локальной копией, не пересекаясь с другими участниками команды, которые работают над теми же файлами.Each developer typically creates a local copy of a central repository, enabling each one to work on the local copy without impacting the others who may be working on the same files.

Рабочий процесс

Примите во внимание следующие советы по тестированию и автоматизации.Consider the following tips for testing and automation:

  • Используйте средства тестирования.Do make use of testing tools. Например, Visual Studio Code и Visual Studio включают IntelliSense и другие компоненты, которые помогут вам проверить шаблоны.For example, Visual Studio Code and Visual Studio include IntelliSense and other features that can help you validate your templates.
  • Чтобы повысить качество кода во время разработки в локальной интегрированной среде разработки, выполните статический анализ кода с помощью модульных тестов и тестов интеграции.To improve the code quality during development on the local IDE, perform static code analysis with unit tests and integration tests.
  • Для еще более эффективной работы в ходе начальной разработки модульные тесты и тесты интеграции должны выдавать предупреждения только при обнаружении ошибки и продолжать выполнение.For an even better experience during initial development, unit tests and integration tests should only warn when an issue is found and proceed with the tests. Таким образом, можно определить проблемы, требующие решения, а также приоритет вносимых изменений. Такой подход также называют разработкой на основе тестирования (TDD).That way, you can identify the issues to addressed and prioritize the order of the changes, also referred to as test-driven deployment (TDD).
  • Имейте в виду, что некоторые тесты могут выполняться без подключения к Azure Resource Manager.Be aware that some tests can be performed without being connected to Azure Resource Manager. Другие, такие как тестирование развертывания шаблона, требуют выполнения некоторых действий со стороны Resource Manager, которые не могут происходить в автономном режиме.Others, like testing template deployment, require Resource Manager to perform certain actions that cannot be performed offline.
  • Тестирование шаблона развертывания с использованием API проверки не тождественно фактическому развертыванию.Testing a deployment template against the validation API isn't equal to an actual deployment. Кроме того, даже при развертывании шаблона из локального файла все ссылки на вложенные шаблоны в шаблоне извлекаются Resource Manager напрямую, а артефакты, на которые ссылаются расширения виртуальной машины, извлекаются агентом виртуальной машины, работающим на развернутой виртуальной машине.Also, even if you deploy a template from a local file, any references to nested templates in the template are retrieved by Resource Manager directly, and artifacts referenced by VM extensions are retrieved by the VM agent running inside the deployed VM.

Дальнейшие действияNext steps