Share via


Programmgesteuerte Bereitstellung von Marketplace-Produkten

In diesem Artikel wird erläutert, wie Sie Azure CLI, Azure PowerShell und Terraform verwenden, um Marketplace-Produktressourcen für Azure bereitzustellen.

Voraussetzungen

Sie müssen Azure PowerShell installieren und eine Verbindung zu Azure herstellen:

Die Bereitstellungsbefehle wurden in Version 2.2.0 der Azure CLI geändert. Die Beispiele in diesem Artikel erfordern Version 2.20.0 oder höher der Azure CLI.

Installieren Sie zum Ausführen dieses Beispiels die aktuelle Version der Azure-Befehlszeilenschnittstelle. Führen Sie zunächst az-Anmeldung aus, um eine Verbindung mit Azure zu erstellen.

So finden Sie Marketplace-Produkt-IDs für Herausgeber, Angebot und Plan

Um Marketplace-Produkte programmgesteuert bereitzustellen, müssen Sie zuerst die eindeutigen IDs eines Marketplace-Produkts abrufen.

So suchen Sie die eindeutigen Bezeichner:

  1. Öffnen Sie die Azure-Portal, und navigieren Sie zur Marketplace-Oberfläche.
  2. Suchen Sie nach dem Marketplace-Produkt, das Sie bereitstellen möchten.
  3. Öffnen Sie die Produktdetailseite, indem Sie den Produktnamen auswählen.
  4. Navigieren Sie zur Registerkarte "Nutzungsinformationen + Support ". In "Nutzungsinformationen" werden die Herausgeber-ID, die Produkt-ID und die Plan-ID angezeigt.

Screenshot der Seite

Hinweis

In einigen APIs wird die Produkt-ID auch als Angebots-ID bezeichnet, und die Plan-ID wird auch als SKU-ID bezeichnet.

Virtueller Computer aus Azure Marketplace

Um VMs von Drittanbietern aus Azure Marketplace bereitzustellen, müssen Sie zuerst den Endbenutzer-Lizenzvertrag (EULA) für das bereitgestellte VM-Image akzeptieren. Sobald die EULA einmal in einem Azure-Abonnement akzeptiert wird, sollten Sie das gleiche VM-Angebot erneut bereitstellen können, ohne die Bedingungen erneut akzeptieren zu müssen. Wenn Sie den virtuellen Computer aus Azure-Portal bereitstellen, werden die Bedingungen dort akzeptiert. Wenn Sie die Bereitstellung jedoch programmgesteuert ausführen, müssen Sie die Bedingungen akzeptieren, die die az vm image terms accept --publisher X --offer Y --plan Z ARM-Verwendung verwenden.

Wenn die Begriffe noch nicht akzeptiert werden, wird der folgende Fehler angezeigt:

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: '11111111-1111-1111-1111-111111111111' You have not accepted the legal terms on this subscription: '11111111-1111-1111-1111-111111111111' 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.

Bereitstellen eines virtuellen Computers über Azure Marketplace mithilfe der Azure CLI

Sobald die Bedingungen akzeptiert wurden, können Sie den virtuellen Computer mithilfe der regulären Methoden wie ARM/Bicep-Vorlage, Azure CLI, Terraform usw. bereitstellen.

Weitere Informationen zum Auffinden von VM-Images finden Sie unter Finden und Verwenden des Marketplace-Einkaufsplans mithilfe der CLI, indem Sie die Bedingungen akzeptieren und die VM mithilfe der CLI bereitstellen.

Bereitstellen eines virtuellen Computers aus Azure Marketplace mithilfe von Terraform

Anweisungen zum Bereitstellen virtueller Computer mithilfe von Terraform für Windows-VM oder Linux-VM.

Um Terraform zum Bereitstellen von Marketplace-VMs zu verwenden, müssen Sie die folgenden Aktionen ausführen:

  1. Akzeptieren Sie die rechtlichen Bedingungen für das VM-Produkt mithilfe von azurerm_marketplace_agreement

  2. Angeben des plan Blocks im azurerm_virtual_machine-Anbieter

Hinweis

Wenn der Planblock nicht angegeben ist, schlägt die Bereitstellung mit dem folgenden Fehler fehl:

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

Hinweis

azurerm_marketplace_agreement wird als Terraform-Ressource behandelt, daher wird beim ersten Erstellen eines bestimmten Marketplace-VM-Produkts eine eindeutige Ressource erstellt, um die Tatsache darzustellen, dass die rechtlichen Bedingungen akzeptiert wurden. Wenn Sie jedoch das nächste Mal versuchen, eine andere VM (mit derselben Herausgeber-ID und Angebots-ID) unter demselben Azure-Abonnement bereitzustellen, erhalten Sie eine Fehlermeldung:

A resource with the ID "/subscriptions/11111111-1111-1111-1111-111111111111 /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

Sie müssen ausgeführt Terraform state list werden, um festzustellen, ob Sie über azurerm_marketplace_agreement Ressourcenstatus verfügen, und wenn sie nicht den Ressourcenstatus in Ihren Terraform-Zustand importieren müssen.

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

SaaS-Angebot aus Azure Marketplace

SaaS-Angebote werden in der Regel von Kunden über die Azure-Portal bereitgestellt. Nachdem das SaaS-Angebot mit Azure-Portal bereitgestellt wurde, verwendet der Kunde die Schaltfläche "Konto jetzt konfigurieren", um die Startseite des SaaS ISV zu besuchen und die Konfiguration des SaaS-Angebots abzuschließen. Nachdem das Angebot konfiguriert wurde, aktiviert der SaaS ISV sie mithilfe der SaaS-Erfüllungs-API.

Wenn Sie ein SaaS-Angebot über die Azure-Portal bereitstellen, wird eine ARM-Vorlage erstellt und der Bereitstellung spezifische Parameterwerte zugewiesen. Einer der Parameter ist termId, die den Abonnementtermin für das Angebot identifiziert. Der TermId-Wert ist nicht statisch, hängt aber von der Angebotskonfiguration und der Bereitstellungszeit ab. Daher können Sie keinen festen Wert für "termId" in Ihrer ARM-Vorlage verwenden. Stattdessen müssen Sie den aktuellen TermId-Wert anhand der folgenden Schritte ermitteln:

  1. Stellen Sie das Angebot manuell über die Azure-Portal bereit.
  2. Wechseln Sie zu der Ressourcengruppe, in der das Angebot bereitgestellt wird.
  3. Wählen Sie den Bereitstellungsnamen unter dem Abschnitt "Bereitstellungen" aus.
  4. Zeigen Sie die Eingabeparameter an, und kopieren Sie den Wert der termId.

Wenn ein bestimmtes SaaS-Angebot nie im Azure-Abonnement bereitgestellt wurde, schlägt die programmgesteuerte Bereitstellung mit einem Fehler wie der folgenden fehl:

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 '11111111-1111-1111-1111-111111111111' and this error message

Bereitstellen des SaaS-Angebots mit ARM-Vorlage und Azure CLI

Siehe die ARM-Beispielvorlage.

{
    "$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"
            }
        }
    ]
}

  • Speichern Sie die oben aufgeführten Dateien unter SaaS-ARM.json
  • Führen Sie die folgenden Befehle aus:
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

Nachdem die SaaS-Angebotsressource bereitgestellt wurde, können Sie die folgende ARM-API aufrufen, um seine Eigenschaften anzuzeigen:

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

Jetzt können Sie einen POST Aufruf tätigen, um das Marketplace-Token und die Url der Startseite abzurufen. Diese URL kann verwendet werden, um die Startseite von SaaS ISV zu durchsuchen, um die Konfiguration und Aktivierung des SaaS-Angebots abzuschließen.

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

Weitere Informationen finden Sie hier – Spezifikation des Microsoft.SaaS-Ressourcenanbieters.

Bereitstellen eines SaaS-Angebots von Azure Marketplace mithilfe von Terraform

Lesen Sie den Abschnitt oben, in dem beschrieben wird, wie SaaS-Angebot mit ARM bereitgestellt wird, da terraform-Bereitstellung die gleiche Verwendung wie die ARM-Vorlage verwenden würde.

Azure-Anwendung aus Azure Marketplace

Azure-App lizenzierungsprodukttyp ist ein einzigartiges Angebot, das es dem Herausgeber ermöglicht, eine ARM-Vorlage zu erstellen, die eine Reihe von Azure-Ressourcen und Marketplace-Produkten enthält, die gebündelt und so konfiguriert sind, dass voll funktionsfähige Multiressourcenanwendungen bereitgestellt werden, Azure-App lizenzierung drei Plantypen hat:

  • Lösungsvorlage – kostenloses Angebot, ARM-Vorlagenbereitstellung
  • Verwaltete Anwendungen – kostenloses oder kostenpflichtiges Angebot, erstellt einen Ressourcentyp "Microsoft.Solutions/Applications".

Azure-Portal generiert eine ARM-Vorlage für Azure-App lication (Managed Application)-Bereitstellung. Diese ARM-Vorlage erstellt eine Ressource vom TypMicrosoft.Solutions/applications, die auf einen bestimmten Plan verweist und die anwendungsspezifischen Parameter aus den Ui-Feldern übergibt, die der Kunde in Azure-Portal ausfüllt.

Akzeptieren von Azure Managed App-Bedingungen

Wie das Angebot virtueller Computer, um die Azure-App lizenzierung (verwaltete Anwendung) programmgesteuert mithilfe der ARM-Vorlage in einem Azure-Abonnement bereitzustellen, muss das Abonnement die Bedingungen für den Plan der azure Managed App akzeptieren. Bei der Bereitstellung über die Azure-Portal erfolgt die Annahme der Bedingungen implizit und später programmgesteuerte Bereitstellungen desselben Plans im selben Azure-Abonnement ohne Probleme.

Es ist auch möglich, die Bedingungen eines Azure-App lizenzierungsangebots (verwaltete Anwendung) mit dem gleichen az vm image terms accept wie oben im Abschnitt "VM" beschrieben zu akzeptieren.

Wenn das produkt für die Azure-App lizenzierung (verwaltete Anwendung) ein kostenpflichtiges Produkt ist (z. B. monatliche oder getaktete Abrechnung), muss das Azure-Abonnement, das Sie für die Bereitstellung verwenden, einer gültigen Zahlungsmethode zugeordnet sein (z. B. kein kostenloses oder gesponsertes Abonnement).

Bereitstellen Azure-App lizenzierung (verwaltete Anwendung) mithilfe der ARM-Vorlage und der Azure CLI

Nachfolgend finden Sie ein ARM-Vorlagenbeispiel für die Bereitstellung verwalteter Anwendungen.

{
    "$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
            }
        }
    ]
}

Führen Sie anschließend die folgenden Befehle aus:

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>

Bereitstellen von Azure Managed App über Azure Marketplace mithilfe von Terraform

Lesen Sie den Abschnitt oben, in dem beschrieben wird, wie Sie das Azure Managed App-Angebot mit ARM bereitstellen, da die Terraform-Bereitstellung dieselbe ARM-Vorlage verwenden würde.

Lösungsvorlage aus Azure Marketplace

Bei der Bereitstellung von Lösungsvorlagen (keine Azure Managed App) von Azure Marketplace ist die Bereitstellung einfach die ARM-Vorlage, die der ISV mit den entsprechenden UI-Feldern veröffentlicht hat, die als Parameter übergeben werden. Um lösungsvorlagen programmgesteuert bereitzustellen, verwenden Sie Azure-Portal, um die Bereitstellung durchzuführen, kopieren Sie die ARM-Vorlage, und verwenden Sie sie in den nachfolgenden Bereitstellungen. Da Lösungsvorlagen keine "kostenpflichtigen" Angebote sind, gibt es keine besonderen Bedingungen, die akzeptiert werden müssen. Wenn die Arm-Vorlage für Lösungsvorlagen jedoch auf ein VM-Image von Azure Marketplace verweist, müssen Sie zunächst die Bedingungen des VM-Angebots akzeptieren, wie für das VM-Angebot beschrieben.

Nächste Schritte