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


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

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

Необходимые компоненты

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

  • Установите командлеты Azure PowerShell на локальном компьютере. Дополнительные сведения см. в статье Начало работы с Azure PowerShell.

  • Подключитесь к Azure с помощью Connect-AZAccount.

    Если у вас несколько подписок Azure, выполните также командлет Set-AzContext.

    См. дополнительные сведения в статье Use multiple Azure subscriptions (Использование нескольких подписок Azure).

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

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

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

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

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

  1. Откройте портал Azure и перейдите к интерфейсу Marketplace.
  2. Поиск продукта Marketplace, который требуется развернуть
  3. Откройте страницу сведений о продукте, выбрав имя продукта.
  4. Перейдите на вкладку "Сведения об использовании и поддержка ". В сведениях об использовании отображается идентификатор издателя, идентификатор продукта и идентификатор плана.

Снимок экрана: страница идентификатора продукта.

Примечание.

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

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

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

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

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

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

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

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

Чтобы использовать Terraform для развертывания виртуальных машин 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 из Azure Marketplace

Предложения SaaS обычно развертываются клиентами через портал Azure. После развертывания предложения SaaS с помощью портал Azure клиент использует кнопку "Настроить учетную запись сейчас", чтобы посетить целевую страницу SaaS ISV и завершить настройку предложения SaaS. После настройки предложения isV SaaS активирует его с помощью 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

Теперь вы можете вызвать маркер Marketplace и URL-адрес целевой POST страницы. Этот 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 из Azure Marketplace с помощью Terraform

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

приложение Azure из Azure 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 из Azure Marketplace с помощью Terraform

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

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

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