Dela via


Programmatisk distribution av Marketplace-produkter

Den här artikeln beskriver hur du använder Azure CLI, Azure PowerShell och Terraform för att distribuera Marketplace-produktresurser till Azure.

Förutsättningar

Du måste installera Azure PowerShell och ansluta till Azure:

Distributionskommandona har ändrats i Azure CLI version 2.2.0. Exemplen i den här artikeln kräver Azure CLI version 2.20.0 eller senare.

Om du vill köra det här exemplet installerar du den senaste versionen av Azure CLI-. För att starta, kör

az login

för att skapa en anslutning med Azure.

Så här hittar du Marketplace-produktidentifierare för utgivare, erbjudande och abonnemang

Om du vill distribuera Marketplace-produkten programmatiskt måste du först skaffa unika identifierare för en Marketplace-produkt.

Så här hittar du de unika identifierarna:

  1. Öppna Azure-portalen och gå till Marketplace-upplevelsen.

  2. Sök efter den Marketplace-produkt som du vill distribuera

  3. Öppna sidan med produktinformation genom att välja produktnamnet.

  4. Gå till fliken användningsinformation + support. I Användningsinformation visas utgivar-ID, produkt-ID och plan-ID.

Skärmbild av produkt-ID-sidan.

Obs

I vissa API:er kallas produkt-ID även erbjudande-ID och plan-ID kallas även SKU-ID.

Virtuell dator från Azure Marketplace

Om du vill distribuera virtuella datorer från tredje part från Azure Marketplace måste du först acceptera licensavtalet för slutanvändare (EULA) för den vm-avbildning som distribueras. När licensavtalet har godkänts en gång i en Azure-prenumeration bör du kunna distribuera samma VM-erbjudande igen utan att behöva acceptera villkoren igen. Om du distribuerar den virtuella datorn från Azure-portalen godkänns villkoren där. Men när du gör distributionen programmatiskt måste du acceptera villkoren med hjälp av az vm image terms accept --publisher X --offer Y --plan Z eller med hjälp av ARM.

Om villkoren inte godkänns ännu visas följande fel:

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.

Distribuera en virtuell dator från Azure Marketplace med Hjälp av Azure CLI

När villkoren har godkänts kan du distribuera den virtuella datorn med hjälp av vanliga metoder som ARM/Bicep-mall, Azure CLI, Terraform osv.

För att lära dig mer om att hitta VM-avbildningar, acceptera villkoren och distribuera VM med CLI, se Hitta och använda marketplace-inköpsplansinformation med CLI.

Distribuera en virtuell dator från Azure Marketplace med Terraform

Instruktioner om hur du distribuerar virtuella maskiner med Terraform för Windows-VM eller Linux-VM.

Om du vill använda Terraform för att distribuera virtuella Marketplace-datorer måste du utföra följande åtgärder:

  1. Godkänn de juridiska villkoren för VM-produkten med azurerm_marketplace_agreement

  2. Ange det plan blocket i azurerm_virtual_machine-providern

Notera

Om planblocket inte har angetts kommer distributionen att misslyckas med följande fel:

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

Notera

sv-SE: azurerm_marketplace_agreement behandlas som en Terraform-resurs, därför skapas en unik resurs första gången du skapar en specifik produkt för virtuella Marketplace-datorer för att representera det faktum att de juridiska villkoren accepterades. Nästa gång du försöker distribuera en annan virtuell dator (med samma utgivar-ID och erbjudande-ID) under samma Azure-prenumeration får du dock ett felmeddelande:

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

Du måste köra Terraform state list för att se om du har azurerm_marketplace_agreement resurstillstånd, och om inte måste du importera resurstillståndet till ditt terraformtillstånd.

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

SaaS-erbjudande från Azure Marketplace

SaaS-erbjudanden distribueras vanligtvis av kunder via Azure-portalen. När SaaS-erbjudandet har distribuerats med Azure-portalen använder kunden knappen "Konfigurera konto nu" för att besöka SaaS ISV:s landningssida och slutföra konfigurationen av SaaS-erbjudandet. När erbjudandet har konfigurerats aktiverar SaaS ISV det med hjälp av SaaS Fulfillment-API:et.

När du distribuerar ett SaaS-erbjudande via Azure-portalen skapas en ARM-mall och specifika parametervärden tilldelas för distributionen. En av parametrarna är termId, som identifierar prenumerationsperioden för erbjudandet. TermId-värdet är inte statiskt, men beror på erbjudandekonfigurationen och tidpunkten för distributionen. Därför kan du inte använda ett fast värde för termId i ARM-mallen. I stället måste du ta reda på det aktuella termId-värdet genom att följa dessa steg:

  1. Distribuera erbjudandet manuellt via Azure-portalen.
  2. Gå till resursgruppen där erbjudandet distribueras.
  3. Välj distributionsnamnet under avsnittet Distributioner.
  4. Visa indataparametrarna och kopiera värdet för termId.

Om ett visst SaaS-erbjudande aldrig distribuerades i Azure-prenumerationen misslyckas den programmatiska distributionen med ett fel som liknar följande:

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

Distribuera SaaS-erbjudandet med hjälp av ARM-mallen och Azure CLI

Se exemplet på ARM-mallen.

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

  • Spara ovanstående som SaaS-ARM.json
  • Kör följande kommandon:
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

När SaaS-erbjudanderesursen har etablerats kan du anropa följande ARM-API för att visa dess egenskaper:

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

Nu kan du göra ett POST-anrop för att hämta marketplace-token och url:en för landningssidan. Den här URL:en kan användas för att bläddra på SaaS ISV:s landningssida för att slutföra konfigurationen och aktiveringen av SaaS-erbjudandet.

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

Mer information finns här – specifikation av Microsoft.SaaS-resursprovidern.

Distribuera SaaS-erbjudande från Azure Marketplace med Terraform

Läs avsnittet ovan som beskriver hur du distribuerar SaaS-erbjudandet med ARM eftersom Terraform-distributionen skulle använda samma som med ARM-mallen.

Azure-program från Azure Marketplace

Produkttypen Azure-program är ett unikt erbjudande som gör att utgivaren kan skapa en ARM-mall som innehåller en uppsättning Azure-resurser och Marketplace-produkter som paketeras och konfigureras för att tillhandahålla fullt fungerande program för flera resurser. Azure-programmet har tre plantyper:

  • Lösningsmall – kostnadsfri erbjudande, distribution av ARM-mallar
  • Hanterade program – kostnadsfritt eller betalt erbjudande, skapar en resurstyp för Microsoft.Solutions/program

Azure-portalen genererar en ARM-mall för distribution av Azure-program (hanterat program). Den här ARM-mallen skapar en resurs av typen Microsoft.Solutions/applications som pekar på en specifik plan och skickar in de programspecifika parametrarna från användargränssnittsfälten som kunden fyller i i Azure-portalen.

Acceptera villkor för Azure Managed App

För att distribuera Azure-programmet (hanterat program) programmatiskt med hjälp av ARM-mallen till en Azure-prenumeration, måste prenumerationen godkänna villkoren för planen för Azure-hanterad app, precis som Virtual Machine-erbjudandet. När villkoren accepteras implicit via Azure-portalen, fungerar senare programmatiska distributioner av samma plan i samma Azure-prenumeration utan problem.

Det är också möjligt att acceptera villkoren för ett Azure Application-erbjudande (hanterad applikation) med samma az vm image terms accept som beskrivs ovan i avsnittet om virtuell dator (VM).

Om Produkten För Azure-program (hanterat program) är en betald produkt (till exempel använder den månadsbaserad eller avgiftsbelagd fakturering) måste den Azure-prenumeration som du använder för att distribuera den vara associerad med en giltig betalningsmetod (det kan till exempel inte vara en kostnadsfri eller sponsrad prenumeration).

Distribuera en Azure-applikation (hanterad applikation) med hjälp av en ARM-mall och Azure CLI.

Nedan visas ett ARM-mallexempel för distribution av hanterat program.

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

Kör sedan följande kommandon:

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>

Distribuera Azure Managed App från Azure Marketplace med Terraform

Läs avsnittet ovan som beskriver hur du distribuerar Azure Managed App-erbjudandet med ARM eftersom Terraform-distributionen använder samma ARM-mall.

Lösningsmall från Azure Marketplace

När du distribuerar lösningsmall (inte Azure Managed App)-erbjudanden från Azure Marketplace, är distributionen helt enkelt den ARM-mall som ISV publicerade, med motsvarande UI-fält som skickas som parametrar. Om du vill distribuera lösningsmallserbjudandet programmatiskt använder du Azure-portalen för att utföra distributionen, kopiera ARM-mallen och använda den i efterföljande distributioner. Eftersom lösningsmallar inte är "betalda" erbjudanden finns det inga särskilda villkor som måste godkännas. Men om lösningsmallen (ARM-mall) refererar till en VM-avbildning från Azure Marketplace måste du först acceptera villkoren i VM-erbjudandet som beskrivs för VM-erbjudandet.