Delen via


Programmatische implementatie van Marketplace-producten

In dit artikel wordt uitgelegd hoe u Azure CLI, Azure PowerShell en Terraform gebruikt om Marketplace-producten te implementeren in Azure.

Vereisten

U moet Azure PowerShell installeren en verbinding maken met Azure:

De implementatieopdrachten zijn gewijzigd in Azure CLI versie 2.2.0. Voor de voorbeelden in dit artikel is Azure CLI versie 2.20.0 of hoger vereist.

Als u dit voorbeeld wilt uitvoeren, installeert u de nieuwste versie van de Azure CLI. Voer az sign-in uit om een verbinding met Azure te maken om te beginnen.

Marketplace-product-id's zoeken voor uitgevers, aanbiedingen en abonnementen

Als u een Marketplace-product programmatisch wilt implementeren, moet u eerst de unieke id's van een Marketplace-product verkrijgen.

De unieke id's zoeken:

  1. Open Azure Portal en navigeer naar de Marketplace-ervaring.
  2. Zoek naar het Marketplace-product dat u wilt implementeren
  3. Open de pagina met productdetails door de productnaam te selecteren.
  4. Navigeer naar het tabblad Gebruiksgegevens en ondersteuning . In gebruiksgegevens worden de uitgevers-id, product-id en abonnements-id weergegeven.

Schermopname van de pagina product-id.

Notitie

In sommige API's wordt product-id ook wel aanbiedings-id genoemd en wordt plan-id ook wel SKU-id genoemd.

Virtuele machine van Azure Marketplace

Als u VM's van derden wilt implementeren vanuit Azure Marketplace, moet u eerst de gebruiksrechtovereenkomst (EULA) accepteren voor de VM-installatiekopie die wordt geïmplementeerd. Zodra de gebruiksrechtovereenkomst eenmaal is geaccepteerd in een Azure-abonnement, moet u dezelfde VM-aanbieding opnieuw kunnen implementeren zonder dat u de voorwaarden opnieuw hoeft te accepteren. Als u de VIRTUELE machine implementeert vanuit Azure Portal, worden de voorwaarden daar geaccepteerd. Wanneer u de implementatie echter programmatisch uitvoert, moet u de voorwaarden accepteren met behulp van de az vm image terms accept --publisher X --offer Y --plan Z of met arm.

Als de voorwaarden nog niet worden geaccepteerd, wordt de volgende fout weergegeven:

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.

Vm implementeren vanuit Azure Marketplace met behulp van Azure CLI

Zodra de voorwaarden zijn geaccepteerd, kunt u de virtuele machine implementeren met behulp van de reguliere methoden zoals ARM/Bicep-sjabloon, Azure CLI, Terraform, enzovoort.

Voor meer informatie over het vinden van VM-installatiekopieën, accepteert u de voorwaarden en implementeert u de VM met behulp van CLI. Zie Marketplace-aankoopplangegevens zoeken en gebruiken met behulp van de CLI.

Vm implementeren vanuit Azure Marketplace met behulp van Terraform

Instructies voor het implementeren van virtuele machines met Behulp van Terraform voor Windows-VM of Linux-VM.

Als u Terraform wilt gebruiken om Marketplace-VM's te implementeren, moet u de volgende acties uitvoeren:

  1. Accepteer de juridische voorwaarden van het VM-product met behulp van azurerm_marketplace_agreement

  2. plan Het blok opgeven in de azurerm_virtual_machine-provider

Notitie

Als het planblok niet is opgegeven, mislukt de implementatie met de volgende fout:

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

Notitie

azurerm_marketplace_agreement wordt behandeld als een Terraform-resource, dus de eerste keer dat u een specifiek Marketplace-VM-product maakt, wordt er een unieke resource gemaakt om het feit te vertegenwoordigen dat de juridische voorwaarden zijn geaccepteerd. De volgende keer dat u probeert een andere VIRTUELE machine te implementeren (met dezelfde uitgever-id en aanbiedings-id) onder hetzelfde Azure-abonnement, krijgt u echter een foutmelding:

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

U moet uitvoeren Terraform state list om te zien of u azurerm_marketplace_agreement resourcestatus hebt en als u de resourcestatus niet moet importeren in de Terraform-status.

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

SaaS-aanbieding van Azure Marketplace

SaaS-aanbiedingen worden meestal geïmplementeerd door klanten via Azure Portal. Nadat de SaaS-aanbieding is geïmplementeerd met behulp van Azure Portal, gebruikt de klant de knop Nu account configureren om de landingspagina van SaaS ISV te bezoeken en de configuratie van de SaaS-aanbieding te voltooien. Nadat de aanbieding is geconfigureerd, activeert de SaaS ISV deze met behulp van de SaaS Fulfillment-API.

Wanneer u een SaaS-aanbieding implementeert via Azure Portal, wordt er een ARM-sjabloon gemaakt en worden specifieke parameterwaarden voor de implementatie toegewezen. Een van de parameters is termId, waarmee de abonnementsperiode voor de aanbieding wordt geïdentificeerd. De waarde van de termId is niet statisch, maar is afhankelijk van de configuratie van de aanbieding en de tijd van de implementatie. Daarom kunt u geen vaste waarde gebruiken voor termId in uw ARM-sjabloon. In plaats daarvan moet u de huidige termId-waarde achterhalen door de volgende stappen uit te voeren:

  1. Implementeer de aanbieding handmatig via Azure Portal.
  2. Ga naar de resourcegroep waarin de aanbieding is geïmplementeerd.
  3. Selecteer de implementatienaam onder de sectie Implementaties.
  4. Bekijk de invoerparameters en kopieer de waarde van termId.

Als een bepaalde SaaS-aanbieding nooit is geïmplementeerd in het Azure-abonnement, mislukt de programmatische implementatie met een fout zoals hieronder:

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-aanbieding implementeren met behulp van EEN ARM-sjabloon en Azure CLI

Zie de ARM-voorbeeldsjabloon.

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

  • Sla het bovenstaande op als SaaS-ARM.json
  • Voer de volgende opdrachten uit:
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

Nadat de SaaS-aanbiedingsresource is ingericht, kunt u de volgende ARM-API aanroepen om de eigenschappen ervan weer te geven:

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

U kunt nu een POST aanroep doen om het Marketplace-token en de URL van de landingspagina op te halen. Deze URL kan worden gebruikt om door de landingspagina van SaaS ISV te bladeren om het configureren en activeren van de SaaS-aanbieding te voltooien.

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

Meer informatie vindt u hier: specificatie van de Microsoft.SaaS-resourceprovider.

SaaS-aanbieding implementeren vanuit Azure Marketplace met behulp van Terraform

Raadpleeg de bovenstaande sectie waarin wordt beschreven hoe u een SaaS-aanbieding implementeert met ARM, omdat terraform-implementatie hetzelfde zou gebruiken als het gebruik van de ARM-sjabloon.

Azure-toepassing van Azure Marketplace

Azure-toepassing producttype is een unieke aanbieding waarmee de uitgever een ARM-sjabloon kan maken die een set Azure-resources en Marketplace-producten bevat die zijn gebundeld en geconfigureerd om volledig functionele multi-resourcetoepassingen te bieden, Azure-toepassing drie abonnementstypen heeft:

  • Oplossingssjabloon - gratis aanbieding, ARM-sjabloonimplementatie
  • Beheerde toepassingen - gratis of betaalde aanbieding, maakt een Resourcetype Microsoft.Solutions/toepassingen

Azure Portal genereert een ARM-sjabloon voor implementatie van Azure-toepassing (beheerde toepassing). Met deze ARM-sjabloon wordt een resource van het type Microsoft.Solutions/applications gemaakt die verwijst naar een specifiek plan en de toepassingsspecifieke parameters doorgeeft op basis van de ui-velden die de klant in de Azure-portal invult.

Voorwaarden voor beheerde Azure-apps accepteren

Net als bij de aanbieding voor virtuele machines, moet het abonnement de voorwaarden voor het plan van de beheerde Azure-app accepteren om de Azure-toepassing (Managed Application) programmatisch te implementeren met behulp van de ARM-sjabloon in een Azure-abonnement. Wanneer deze wordt geïmplementeerd via Azure Portal, gebeurt de acceptatie van de voorwaarden impliciet en later programmatische implementaties van hetzelfde plan in hetzelfde Azure-abonnement zonder problemen.

Het is ook mogelijk om de voorwaarden van een aanbieding voor Azure-toepassing (beheerde toepassing) te accepteren met behulp van hetzelfde az vm image terms accept als hierboven beschreven in de sectie VM.

Als het product Azure-toepassing (Beheerde toepassing) een betaald product is (bijvoorbeeld dat het gebruikmaakt van maandelijkse of gefactureerde facturering), moet het Azure-abonnement dat u gebruikt om het te implementeren, zijn gekoppeld aan een geldige betalingswijze (het kan bijvoorbeeld geen gratis of gesponsord abonnement zijn).

Implementeer Azure-toepassing (beheerde toepassing) met behulp van een ARM-sjabloon en Azure CLI

Hieronder ziet u een ARM-sjabloonvoorbeeld voor het implementeren van een beheerde toepassing.

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

Voer vervolgens de volgende opdrachten uit:

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>

Beheerde Azure-app implementeren vanuit Azure Marketplace met behulp van Terraform

Raadpleeg de bovenstaande sectie waarin wordt beschreven hoe u azure Managed App-aanbieding implementeert met ARM, omdat terraform-implementatie dezelfde ARM-sjabloon zou gebruiken.

Oplossingssjabloon van Azure Marketplace

Wanneer u oplossingssjabloon (niet azure managed app) implementeert vanuit Azure Marketplace, is de implementatie gewoon de ARM-sjabloon die de ISV heeft gepubliceerd met de bijbehorende UI-velden die als parameters zijn doorgegeven. Als u een oplossingssjabloon programmatisch wilt implementeren, gebruikt u Azure Portal om de implementatie uit te voeren, kopieert u de ARM-sjabloon en gebruikt u deze in de volgende implementaties. Omdat oplossingssjablonen geen 'betaalde' aanbiedingen zijn, zijn er geen speciale voorwaarden die moeten worden geaccepteerd. Als de ARM-sjabloon voor oplossingssjablonen echter verwijst naar een VM-installatiekopieën van Azure Marketplace, moet u eerst de voorwaarden van de VM-aanbieding accepteren zoals beschreven voor de VM-aanbieding.