Auf Englisch lesen

Freigeben über


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 mit Azure herstellen:

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

Um dieses Beispiel auszuführen, installieren Sie die neueste Version der Azure CLI. Führen Sie zuerst den folgenden Befehl aus:

az login

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.

Um die eindeutigen Bezeichner zu finden:

  1. Öffnen Sie das 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 über das Azure-Portal bereitstellen, werden die Bedingungen dort akzeptiert. Wenn Sie die Bereitstellung jedoch programmgesteuert durchführen, müssen Sie die Bedingungen mit dem Befehl az vm image terms accept --publisher X --offer Y --plan Z oder über ARM akzeptieren.

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: '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.

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 Suchen nach VM-Images, Akzeptieren der Bedingungen und Bereitstellung des virtuellen Computers mit CLI finden Sie unter Suchen und Verwenden von Marketplace-Einkaufsplaninformationen mithilfe der CLI-.

Bereitstellen eines virtuellen Computers aus Azure Marketplace mithilfe von Terraform

Anweisungen zum Bereitstellen virtueller Computer mit 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 mit azurerm_marketplace_agreement

  2. Geben Sie den plan-Block im azurerm_virtual_machine-Anbieter an.

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 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/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

Sie müssen Terraform state list ausführen, um festzustellen, ob Sie den Ressourcenzustand für azurerm_marketplace_agreement haben. Wenn nicht, müssen Sie den Ressourcenzustand in Ihren Terraform-Zustand importieren.

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 das Azure-Portal bereitgestellt. Nachdem das SaaS-Angebot über das 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 es mit der SaaS-Erfüllungs-API.

Wenn Sie ein SaaS-Angebot über das Azure-Portal bereitstellen, wird eine ARM-Vorlage erstellt und der Bereitstellung bestimmte 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 das 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 'aaaa0000-bb11-2222-33cc-444444dddddd' 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 das Obige als 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 ausführen, um das Marketplace-Token und die Startseiten-URL 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

Sehen Sie sich den Abschnitt oben an, in dem die Bereitstellung des SaaS-Angebots mithilfe von ARM beschrieben wird, da die Terraform-Bereitstellung der Verwendung der ARM-Vorlage entspricht.

Azure-Anwendung aus Azure Marketplace

Der Produkttyp der Azure-Anwendung 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 Application hat drei Plantypen:

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

Das Azure-Portal generiert eine ARM-Vorlage für die Bereitstellung von Azure-Anwendungen (verwaltete Anwendung). Diese ARM-Vorlage erstellt eine Ressource vom Typ Microsoft.Solutions/applications, die auf einen bestimmten Plan verweist und die anwendungsspezifischen Parameter aus den Ui-Feldern übergibt, die der Kunde im Azure-Portal ausfüllt.

Akzeptieren von Azure Managed App-Bedingungen

Wie beim VM-Angebot muss das Abonnement die Bedingungen für den Plan der verwalteten Azure App akzeptieren, um die Azure-Anwendung (verwaltete Anwendung) programmgesteuert mithilfe der ARM-Vorlage in einem Azure-Abonnement bereitzustellen. Bei der Bereitstellung über das 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-Anwendungsangebots (verwaltete Anwendung) mit demselben az vm image terms accept zu akzeptieren, wie oben im Abschnitt "VM" beschrieben.

Wenn das Azure-Anwendungsprodukt (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 von Azure-Anwendung (verwaltete Anwendung) mit ARM-Vorlage und 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 dann 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 Angeboten mit Lösungsvorlage (keine verwaltete Azure-App) aus Azure Marketplace ist die Bereitstellung einfach die ARM-Vorlage, die der ISV mit den entsprechenden UI-Feldern, die als Parameter übergeben werden, veröffentlicht hat. Um Lösungsvorlagen programmgesteuert bereitzustellen, verwenden Sie das 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 sich die ARM-Vorlage für Lösungsvorlagen jedoch auf ein VM-Image aus Azure Marketplace bezieht, müssen Sie zunächst die Bedingungen des VM-Angebots akzeptieren, wie für das VM-Angebot beschrieben.