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


Программное развертывание продуктов Microsoft Marketplace

В этой статье объясняется, как использовать Azure CLI, Azure PowerShell и Terraform для развертывания ресурсов продуктов Microsoft Marketplace в Azure.

Необходимые условия

Необходимо установить Azure PowerShell и подключиться к Azure:

Команды развертывания изменились в Azure CLI версии 2.2.0. Примеры в этой статье требуют Azure CLI версии 2.20.0 или более поздней версии.

Чтобы запустить этот пример, установите последнюю версию Azure CLI. Чтобы начать, запустите

az login

Создание подключения к Azure.

Поиск идентификаторов продуктов Microsoft Marketplace для издателя, предложения и плана

Для программного развертывания продукта Microsoft Marketplace необходимо сначала получить его уникальные идентификаторы.

Чтобы найти уникальные идентификаторы, выполните следующие действия.

  1. Откройте портал Azure и перейдите к интерфейсу Marketplace (Marketplace на портале Azure).

  2. Найдите продукт Microsoft Marketplace, который вы хотите развернуть.

  3. Откройте страницу сведений о продукте, выбрав имя продукта.

  4. Перейдите на вкладку Сведения об использовании и поддержке. В сведениях об использовании отображается идентификатор издателя, идентификатор продукта и идентификатор плана.

снимок экрана: страница идентификатора продукта, отображающая идентификатор издателя, идентификатор продукта и идентификатор плана.

Заметка

В некоторых API идентификатор продукта также называется идентификатором предложения, а идентификатор плана также называется идентификатором SKU.

Виртуальная машина из Microsoft Marketplace

Чтобы развернуть сторонние виртуальные машины из Microsoft Marketplace, сначала необходимо принять лицензионное соглашение конечного пользователя (EULA) для развернутого образа виртуальной машины. Как только лицензионное соглашение (EULA) принято в подписке Azure, вы сможете снова развернуть то же самое предложение виртуальной машины без необходимости повторного принятия условий. Если вы развертываете виртуальную машину с портала Azure (Marketplace на портале Azure), условия принимаются там. Однако при программном развертывании необходимо принять условия с помощью az vm image terms accept --publisher X --offer Y --plan Z или с помощью ARM.

Если условия еще не приняты, отображается следующая ошибка:

Code : MarketplacePurchaseEligibilityFailed
Message: Marketplace purchase eligibility check returned errors. See inner errors for details
Details: Offer with PublisherId: '<PublisherId>', OfferId: '<OfferId>' cannot be purchased due to validation errors. For more information see details. Correlation Id: 'aaaa0000-bb11-2222-33cc-444444dddddd' You have not accepted the legal terms on this subscription: 'aaaa0000-bb11-2222-33cc-444444dddddd' for this plan. Before the subscription can be used, you need to accept the legal terms of the image. To read and accept legal terms, use the Azure CLI commands described at https://go.microsoft.com/fwlink/?linkid=2110637 or the PowerShell commands available at https://go.microsoft.com/fwlink/?linkid=862451. Alternatively, deploying via the Azure portal provides a UI experience for reading and accepting the legal terms.

Развертывание виртуальной машины из Microsoft Marketplace с помощью Azure CLI

После принятия условий вы можете развернуть виртуальную машину с помощью обычных методов, таких как шаблон ARM/Bicep, Azure CLI, Terraform и т. д.

Дополнительные сведения о поиске образов виртуальных машин, принятии условий и развертывании виртуальной машины с помощью интерфейса командной строки см. в статье Поиск и использование сведений о плане приобретения Microsoft Marketplace с помощью ИНТЕРФЕЙСА командной строки.

Развертывание виртуальной машины из Microsoft Marketplace с помощью Terraform

Инструкции по развертыванию виртуальных машин с помощью Terraform для виртуальной машины Windows или виртуальной машины Linux.

Чтобы использовать Terraform для развертывания виртуальных машин Microsoft Marketplace, необходимо выполнить следующие действия:

  1. Примите юридические условия продукта виртуальной машины, используя azurerm_marketplace_agreement

  2. Укажите блок plan в провайдере azurerm_virtual_machine

Заметка

Если блок плана не указан, развертывание завершается сбоем со следующей ошибкой:

Code: VMMarketplaceInvalidInput Message: Creating a virtual machine from Marketplace image or a custom image sourced from a Marketplace image requires Plan information in the request. VM: '/subscriptions/<Subscription ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM

Заметка

azurerm_marketplace_agreement рассматривается как ресурс Terraform, в результате при первом создании определенного продукта виртуальной машины Marketplace создается уникальный ресурс, свидетельствующий о том, что юридические условия были приняты. Однако при следующем попытке развернуть другую виртуальную машину (с тем же идентификатором издателя и идентификатором предложения) в той же подписке Azure вы получите ошибку:

A resource with the ID "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e /providers/Microsoft.MarketplaceOrdering/agreements/<Publisher ID>/offers/<Product ID>/plans/<Plan ID>" already exists - to be managed via Terraform this resource needs to be imported into the State. Please see the resource documentation for "azurerm_marketplace_agreement" for more information

Вам нужно запустить Terraform state list, чтобы проверить, имеется ли у вас состояние ресурса azurerm_marketplace_agreement. Если его нет, вам нужно импортировать состояние ресурса в ваше состояние Terraform.

terraform import azurerm_marketplace_agreement.<TerraformResourceName> /subscriptions/<AzureSubscriptionId>/providers/Microsoft.MarketplaceOrdering/agreements/<Publisher ID>/offers/<Product ID>/plans/<Plan ID>

Предложение SaaS из Microsoft Marketplace

Предложения SaaS обычно развертываются клиентами на портале Azure. После развертывания предложения SaaS с помощью портала Azure клиент использует кнопку "Настроить учетную запись сейчас", чтобы посетить целевую страницу SaaS ISV и завершить настройку предложения SaaS. После настройки предложения независимый поставщик программного обеспечения (SaaS ISV) активирует его с помощью API выполнения SaaS.

При развертывании предложения SaaS на портале Azure он создает шаблон ARM и назначает определенные значения параметров для развертывания. Одним из параметров является termId, определяющий термин подписки для предложения. Значение termId не является статическим, но зависит от конфигурации предложения и времени развертывания. Поэтому не удается использовать фиксированное значение для termId в шаблоне ARM. Вместо этого необходимо выяснить текущее значение termId, выполнив следующие действия:

  1. Разверните предложение вручную на портале Azure.
  2. Перейдите в группу ресурсов, в которой развернуто предложение.
  3. Выберите имя развертывания в разделе "Развертывания".
  4. Просмотрите входные параметры и скопируйте значение termId.

Если данное предложение SaaS никогда не было развернуто в подписке Azure, программное развертывание завершается ошибкой, как показано ниже:

code: DeploymentFailed

message: At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage

Details: Failed to process eligibility check with error Purchase has failed due to signature verification on Marketplace legal agreement. Please retry. If error persists use different Azure subscription, or contact support with correlation-id 'aaaa0000-bb11-2222-33cc-444444dddddd' and this error message

Развертывание предложения SaaS с помощью шаблона ARM и Azure CLI

См. пример шаблона ARM.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string"
        },
        "planId": {
            "type": "string"
        },
        "offerId": {
            "type": "string"
        },
        "publisherId": {
            "type": "string"
        },
        "quantity": {
            "type": "int"
        },
        "termId": {
            "type": "string"
        },
        "azureSubscriptionId": {
            "type": "string"
        },
        "publisherTestEnvironment": {
            "type": "string",
            "defaultValue": ""
        },
        "autoRenew": {
            "type": "bool"
        }
    },
    "resources": [
        {
            "type": "Microsoft.SaaS/resources",
            "apiVersion": "2018-03-01-beta",
            "name": "[parameters('name')]",
            "location": "global",
            "properties": {
                "saasResourceName": "[parameters('name')]",
                "publisherId": "[parameters('publisherId')]",
                "SKUId": "[parameters('planId')]",
                "offerId": "[parameters('offerId')]",
                "quantity": "[parameters('quantity')]",
                "termId": "[parameters('termId')]",
                "autoRenew": "[parameters('autoRenew')]",
                "paymentChannelType": "SubscriptionDelegated",
                "paymentChannelMetadata": {
                    "AzureSubscriptionId": "[parameters('azureSubscriptionId')]"
                },
                "publisherTestEnvironment": "[parameters('publisherTestEnvironment')]",
                "storeFront": "AzurePortal"
            }
        }
    ]
}

  • Сохраните приведенные выше данные как SaaS-ARM.json
  • Выполните следующие команды:
az group create --resource-group <ResourceGroupName> --location <Location>

az deployment group create --resource-group <Resource Group Name> --template-file ./SaaS-ARM.json --parameters name=<SaaS Resource Name> publisherId=<Publisher ID> offerId=<Product ID> planId=<Plan ID> termId=<termId> quantity=1 azureSubscriptionId=11111111-1111-1111-1111-11111111 autoRenew=true

После подготовки ресурса предложения SaaS можно вызвать следующий API ARM для просмотра его свойств:

az rest --method get --uri /subscriptions/<AzureSubscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.SaaS/resources/<SaaS Resource Name>?api-version=2018-03-01-beta -o json

Теперь вы можете выполнить вызов POST, чтобы получить маркер Marketplace и URL-адрес целевой страницы. Этот URL-адрес можно использовать для просмотра целевой страницы Поставщика программного обеспечения SaaS, чтобы завершить настройку и активацию предложения SaaS.

az rest --method post --uri /subscriptions/<AzureSubscriptionId>/resourceGroups/<ResourceGroupName> /providers/Microsoft.SaaS/resources/<SaaS Resource Name>/listAccessToken?api-version=2018-03-01-beta -o json

Более подробная информация доступна здесь — в спецификации поставщика ресурсов Microsoft.SaaS .

Развертывание предложения SaaS из Microsoft Marketplace с помощью Terraform

В приведенном выше разделе описывается, как развернуть предложение SaaS с помощью ARM, поскольку развертывание с помощью Terraform будет использовать тот же подход, что и при использовании шаблона ARM.

Приложение Azure из Microsoft Marketplace

Тип продукта приложения Azure — это уникальное предложение, позволяющее издателю создать шаблон ARM, который включает набор ресурсов Azure и продуктов Marketplace, объединённых и настроенных для обеспечения полнофункциональных приложений с несколькими ресурсами. Приложение Azure имеет три типа плана:

  • Шаблон решения — бесплатное предложение, развертывание шаблона ARM
  • Управляемые приложения — бесплатное или платное предложение, которое создает тип ресурса Microsoft.Solutions/applications.

Портал Azure создает шаблон ARM для развертывания приложения Azure (управляемого приложения). Этот шаблон ARM создает ресурс типа Microsoft.Solutions/applications который указывает на конкретный план и передает параметры для конкретного приложения из полей пользовательского интерфейса, которые клиент заполняет на портале Azure.

Принятие условий управляемого приложения Azure

Как и в случае с предложением Виртуальной Машины, для программного развертывания Управляемого Приложения Azure с помощью ARM-шаблона в подписке Azure, необходимо, чтобы подписка приняла условия плана Управляемого Приложения Azure. При развертывании с помощью портала Azure принятие условий происходит неявно, и последующие программные развертывания одного плана в той же подписке Azure выполняются без проблем.

Кроме того, можно также принять условия предложения приложения Azure (управляемого приложения) с использованием того же az vm image terms accept, как указано в описании виртуальной машины выше.

Если продукт приложения Azure (управляемое приложение) является платным продуктом (например, использует ежемесячное или оплачиваемое выставление счетов), подписка Azure, используемая для развертывания, должна быть связана с допустимым методом оплаты (например, не может быть бесплатной или спонсируемой подпиской).

Развертывание приложения Azure (управляемого приложения) с помощью шаблона ARM и Azure CLI

Ниже приведен пример шаблона ARM для развертывания управляемого приложения.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "allowedValues": [
                "westus2",
                "westeurope",
                "eastus",
                "northeurope",
                "centralus",
                "eastus2",
                "francecentral",
                "uksouth"
            ]
        },
        "applicationResourceName": {
            "type": "string"
        },
        "managedResourceGroupId": {
            "type": "string",
            "defaultValue": ""
        },
        "managedIdentity": {
            "type": "object",
            "defaultValue": {}
        },
        "initialConsulVersion": {
            "type": "string",
            "defaultValue": "v1.11.2"
        },
        "storageAccountName": {
            "type": "string",
            "defaultValue": "[concat('storage', uniqueString(resourceGroup().id, deployment().name))]"
        },
        "blobContainerName": {
            "type": "string",
            "defaultValue": "[concat('blob', uniqueString(resourceGroup().id, deployment().name))]"
        },
        "identityName": {
            "type": "string",
            "defaultValue": "[concat(parameters('clusterName'), '-identity')]"
        },
        "clusterMode": {
            "type": "string",
            "defaultValue": "PRODUCTION",
            "allowedValues": [
                "PRODUCTION",
                "DEVELOPMENT"
            ]
        },
        "clusterName": {
            "type": "string",
            "defaultValue": "cluster"
        },
        "consulDataCenter": {
            "type": "string",
            "defaultValue": "dc1"
        },
        "numServers": {
            "type": "string",
            "defaultValue": "3"
        },
        "numServersDevelopment": {
            "type": "string",
            "defaultValue": "1"
        },
        "automaticUpgrades": {
            "type": "string",
            "defaultValue": "disabled"
        },
        "consulConnect": {
            "type": "string",
            "defaultValue": "enabled"
        },
        "externalEndpoint": {
            "type": "string",
            "defaultValue": "enabled"
        },
        "snapshotInterval": {
            "type": "string",
            "defaultValue": "1d"
        },
        "snapshotRetention": {
            "type": "string",
            "defaultValue": "1m"
        },
        "consulVnetCidr": {
            "type": "string",
            "defaultValue": "172.25.16.0/24"
        },
        "providerBaseURL": {
            "defaultValue": "https://ama-api.hashicorp.cloud/consulama/2021-04-23",
            "type": "String",
            "metadata": {
                "description": "The URI of the custom provider API"
            }
        },
        "email": {
            "type": "string"
        },
        "federationToken": {
            "type": "string",
            "defaultValue": ""
        },
        "sourceChannel": {
            "type": "string",
            "defaultValue": "azure-portal"
        },
        "auditLoggingEnabled": {
            "type": "string",
            "defaultValue": "disabled",
            "allowedValues": [
                "enabled",
                "disabled"
            ]
        },
        "auditLogStorageContainerURL": {
            "type": "string",
            "defaultValue": ""
        }
    },
    "variables": {
    },
    "resources": [
        {
            "type": "Microsoft.Solutions/applications",
            "apiVersion": "2017-09-01",
            "name": "[parameters('applicationResourceName')]",
            "location": "[parameters('location')]",
            "kind": "MarketPlace",
            "identity": "[if(empty(parameters('managedIdentity')),json('null'),parameters('managedIdentity'))]",
            "plan": {
                "name": "<Plan ID>",
                "product": "<Product ID>",
                "publisher": "<Publisher ID>",
                "version": "<Version>"
            },
            "properties": {
                "managedResourceGroupId": "[parameters('managedResourceGroupId')]",
                "parameters": {
                    "initialConsulVersion": {
                        "value": "[parameters('initialConsulVersion')]"
                    },
                    "storageAccountName": {
                        "value": "[parameters('storageAccountName')]"
                    },
                    "blobContainerName": {
                        "value": "[parameters('blobContainerName')]"
                    },
                    "identityName": {
                        "value": "[parameters('identityName')]"
                    },
                    "clusterMode": {
                        "value": "[parameters('clusterMode')]"
                    },
                    "clusterName": {
                        "value": "[parameters('clusterName')]"
                    },
                    "consulDataCenter": {
                        "value": "[parameters('consulDataCenter')]"
                    },
                    "numServers": {
                        "value": "[parameters('numServers')]"
                    },
                    "numServersDevelopment": {
                        "value": "[parameters('numServersDevelopment')]"
                    },
                    "automaticUpgrades": {
                        "value": "[parameters('automaticUpgrades')]"
                    },
                    "consulConnect": {
                        "value": "[parameters('consulConnect')]"
                    },
                    "externalEndpoint": {
                        "value": "[parameters('externalEndpoint')]"
                    },
                    "snapshotInterval": {
                        "value": "[parameters('snapshotInterval')]"
                    },
                    "snapshotRetention": {
                        "value": "[parameters('snapshotRetention')]"
                    },
                    "consulVnetCidr": {
                        "value": "[parameters('consulVnetCidr')]"
                    },
                    "location": {
                        "value": "[parameters('location')]"
                    },
                    "providerBaseURL": {
                        "value": "[parameters('providerBaseURL')]"
                    },
                    "email": {
                        "value": "[parameters('email')]"
                    },
                    "federationToken": {
                        "value": "[parameters('federationToken')]"
                    },
                    "sourceChannel": {
                        "value": "[parameters('sourceChannel')]"
                    },
                    "auditLoggingEnabled": {
                        "value": "[parameters('auditLoggingEnabled')]"
                    },
                    "auditLogStorageContainerURL": {
                        "value": "[parameters('auditLogStorageContainerURL')]"
                    }
                },
                "jitAccessPolicy": null
            }
        }
    ]
}

Затем выполните следующие команды:

az group create --resource-group <Resource Group Name> --location <location>

az deployment group create --resource-group avmanagedapp100 --template-file <ARM Template JSON file> --parameters location=<location> applicationResourceName=<Resource Group Name> managedResourceGroupId=/subscriptions/<Subscription ID>/resourceGroups/<Resource Group Name>  email=<email address>

Развертывание управляемого приложения Azure из Microsoft Marketplace с помощью Terraform

Ознакомьтесь с приведенным выше разделом, описывающим, как развернуть предложение управляемого приложения Azure с помощью ARM, так как развертывание Terraform будет использовать тот же шаблон ARM.

Шаблон решения из Microsoft Marketplace

При развертывании предложений шаблона решения (а не управляемого приложения Azure) из Microsoft Marketplace развертывание — это просто шаблон ARM, опубликованный поставщиком программного обеспечения с соответствующими полями пользовательского интерфейса, переданными в качестве параметров. Чтобы программным способом развернуть шаблон решения, используйте портал Azure для развертывания, скопируйте шаблон ARM и используйте его в последующих развертываниях. Так как шаблоны решений не являются платными предложениями, нет специальных условий, которые необходимо принять. Однако если шаблон ARM шаблона решения ссылается на образ виртуальной машины из Microsoft Marketplace, необходимо сначала принять условия предложения виртуальной машины, как описано для предложения виртуальной машины.