Share via


Market ürünlerinin programlı dağıtımı

Bu makalede, Market ürünleri kaynaklarını Azure'a dağıtmak için Azure CLI, Azure PowerShell ve Terraform'un nasıl kullanılacağı açıklanmaktadır.

Önkoşullar

Azure PowerShell'i yüklemeniz ve Azure'a bağlanmanız gerekir:

Azure CLI sürüm 2.2.0'da dağıtım komutları değiştirildi. Bu makaledeki örneklerde Azure CLI sürüm 2.20.0 veya üzeri gerekir.

Bu örneği çalıştırmak için Azure CLI'nın en son sürümünü yükleyin. Başlamak için az sign-in komutunu çalıştırarak Azure ile bağlantı oluşturun.

Yayımcı, teklif ve plan için Market ürün tanımlayıcılarını bulma

Market ürününü program aracılığıyla dağıtmak için önce bir Market ürününün benzersiz tanımlayıcılarını almanız gerekir.

Benzersiz tanımlayıcıları bulmak için:

  1. Azure portalını açın ve Market deneyimine gidin.
  2. Dağıtmak istediğiniz Market ürününü arayın
  3. Ürün adını seçerek ürün ayrıntıları sayfasını açın.
  4. Kullanım Bilgileri + Destek sekmesine gidin. Kullanım Bilgileri'nde Yayımcı Kimliği, Ürün Kimliği ve Plan Kimliği görüntülenir.

Ürün kimliği sayfasının ekran görüntüsü.

Not

Bazı API'lerde Ürün Kimliği Teklif Kimliği ve Plan Kimliği de SKU Kimliği olarak bilinir.

Azure Market'den Sanal Makine

üçüncü taraf VM'leri Azure Market dağıtmak için, önce dağıtılmakta olan VM görüntüsü için Son Kullanıcı Lisans Sözleşmesi'ni (EULA) kabul etmeniz gerekir. Azure aboneliğinde EULA bir kez kabul edildikten sonra, koşulları yeniden kabul etmenize gerek kalmadan aynı VM teklifini yeniden dağıtabilmeniz gerekir. VM'yi Azure portalından dağıtıyorsanız, koşullar burada kabul edilir. Ancak, dağıtımı program aracılığıyla yaptığınızda, veya kullanarak ARM kullanarak az vm image terms accept --publisher X --offer Y --plan Z koşulları kabul etmeniz gerekir.

Koşullar henüz kabul edilmediyse aşağıdaki hata gösterilir:

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.

Azure CLI kullanarak vm'yi Azure Market dağıtma

Koşullar kabul edildikten sonra ARM/Bicep şablonu, Azure CLI, Terraform vb. gibi normal yöntemleri kullanarak VM'yi dağıtabilirsiniz.

VM görüntülerini bulma, Koşulları kabul etme ve CLI kullanarak VM'yi dağıtma hakkında daha fazla bilgi edinmek için bkz . CLI kullanarak market satın alma planı bilgilerini bulma ve kullanma.

Terraform kullanarak vm'yi Azure Market dağıtma

Windows VM veya Linux VM için Terraform kullanarak Sanal Makineler dağıtma yönergeleri.

Terraform kullanarak Market VM'lerini dağıtmak için aşağıdaki eylemleri gerçekleştirmeniz gerekir:

  1. azurerm_marketplace_agreement kullanarak VM ürün yasal koşullarını kabul etme

  2. plan azurerm_virtual_machine sağlayıcısındaki bloğu belirtin

Not

Plan bloğu belirtilmezse dağıtım aşağıdaki hatayla başarısız olur:

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

Not

azurerm_marketplace_agreement Bir Terraform kaynağı olarak kabul edilir, bu nedenle, belirli bir Market VM ürününü ilk kez oluşturduğunuzda, yasal koşulların kabul edildiği gerçeğini temsil eden benzersiz bir kaynak oluşturulur. Ancak, aynı Azure Aboneliği altında başka bir VM (aynı Yayımcı Kimliği ve Teklif Kimliği ile) dağıtmaya çalıştığınızda bir hata alırsınız:

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

azurerm_marketplace_agreement kaynak durumunuz olup olmadığını görmek için komutunu çalıştırmanız Terraform state list ve yoksa kaynak durumunu Terraform durumunuzla içeri aktarmanız gerekir.

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

Azure Market'dan SaaS teklifi

SaaS Teklifleri genellikle müşteriler tarafından Azure portalı üzerinden dağıtılır. SaaS teklifi Azure portalı kullanılarak dağıtıldıktan sonra müşteri" Hesabı şimdi yapılandır" düğmesini kullanarak SaaS ISV'nin giriş sayfasını ziyaret eder ve SaaS teklifini yapılandırmayı tamamlar. Teklif yapılandırıldıktan sonra SaaS ISV, SaaS Fulfillment API'sini kullanarak bu teklifi etkinleştirir.

Azure portalı aracılığıyla bir SaaS teklifi dağıttığınızda, bir ARM şablonu oluşturulur ve dağıtım için belirli parametre değerleri atanır. Parametrelerden biri, teklifin abonelik terimini tanımlayan termId değeridir. termId değeri statik değildir, ancak teklif yapılandırmasına ve dağıtım zamanına bağlıdır. Bu nedenle, ARM şablonunuzda termId için sabit bir değer kullanamazsınız. Bunun yerine, şu adımları izleyerek geçerli termId değerini bulmanız gerekir:

  1. Teklifi Azure portalı üzerinden el ile dağıtın.
  2. Teklifin dağıtıldığı kaynak grubuna gidin.
  3. Dağıtımlar bölümünün altında dağıtım adını seçin.
  4. Giriş parametrelerini görüntüleyin ve termId değerini kopyalayın.

Belirli bir SaaS teklifi Azure aboneliğinde hiç dağıtılmadıysa, programlı dağıtım aşağıdaki gibi bir hatayla başarısız olur:

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

ARM şablonunu ve Azure CLI'yi kullanarak SaaS teklifini dağıtma

ARM örnek şablonuna bakın.

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

  • Yukarıdakini farklı kaydedin SaaS-ARM.json
  • Aşağıdaki komutları çalıştırın:
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 teklifi kaynağı sağlandıktan sonra özelliklerini görüntülemek için aşağıdaki ARM API'sini çağırabilirsiniz:

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

Artık market belirtecini ve giriş sayfası URL'sini almak için bir POST arama yapabilirsiniz. Bu URL, SaaS teklifini yapılandırmayı ve etkinleştirmeyi tamamlamak için SaaS ISV'nin giriş sayfasına göz atmak için kullanılabilir.

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 kaynak sağlayıcısının belirtimi gibi daha fazla bilgiyi burada bulabilirsiniz.

Terraform kullanarak Azure Market'dan SaaS teklifi dağıtma

Terraform dağıtımı ARM şablonuyla aynı şekilde kullanacağı için ARM kullanarak SaaS teklifinin nasıl dağıtılacağına ilişkin yukarıdaki bölümü gözden geçirin.

Azure Market'dan Azure Uygulaması

Azure Uygulaması lication ürün türü, yayımcının tam işlevsel çok kaynaklı uygulamalar sağlamak üzere paketlenmiş ve yapılandırılmış bir dizi Azure kaynağı ve Market ürünü içeren bir ARM şablonu oluşturmasına olanak tanıyan benzersiz bir tekliftir Azure Uygulaması lication üç plan türüne sahiptir:

  • Çözüm Şablonu - ücretsiz teklif, ARM şablonu dağıtımı
  • Yönetilen Uygulamalar - ücretsiz veya ücretli teklif, bir Microsoft.Solutions/applications kaynak türü oluşturur

Azure portal, Azure Uygulaması lication (Yönetilen Uygulama) dağıtımı için bir ARM şablonu oluşturur. Bu ARM şablonu, belirli bir plana işaret eden türde Microsoft.Solutions/applications bir kaynak oluşturur ve müşterinin Azure portalında doldurduğu kullanıcı arabirimi alanlarından uygulamaya özgü parametreleri geçirir.

Azure Yönetilen Uygulama koşullarını kabul etme

Sanal Makine teklifi gibi, ARM şablonunu kullanarak Azure Uygulaması lication'ı (Yönetilen Uygulama) bir Azure aboneliğine program aracılığıyla dağıtmak için aboneliğin Azure Yönetilen Uygulama planına ilişkin koşulları kabul etmesi gerekir. Azure portalı aracılığıyla dağıtıldığında kabul koşulları, aynı Azure aboneliğindeki aynı planın örtülü ve daha sonraki programlı dağıtımları sorunsuz bir şekilde kullanılmaktadır.

Ayrıca, yukarıda VM bölümünde açıklandığı gibi kullanarak az vm image terms accept bir Azure Uygulaması lication (Yönetilen Uygulama) teklifinin koşullarını kabul etmek de mümkündür.

Azure Uygulaması lication (Yönetilen Uygulama) ürünü ücretli bir ürünse (örneğin, aylık veya tarifeli faturalama kullanıyorsa), dağıtmak için kullandığınız Azure aboneliği geçerli bir ödeme yöntemiyle ilişkilendirilmelidir (örneğin, ücretsiz veya sponsorlu bir abonelik olamaz).

ARM şablonu ve Azure CLI kullanarak Azure Uygulaması'yi (Yönetilen Uygulama) dağıtma

Aşağıda Yönetilen Uygulamayı dağıtmaya yönelik bir ARM şablonu örneği verilmiştir.

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

Sonra aşağıdaki komutları çalıştırın:

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>

Terraform kullanarak azure yönetilen uygulamasını Azure Market dağıtma

Terraform dağıtımı aynı ARM şablonunu kullanacağı için ARM kullanarak Azure Yönetilen Uygulama teklifinin nasıl dağıtılacağına ilişkin yukarıdaki bölümü gözden geçirin.

Azure Market Çözüm Şablonu

Çözüm Şablonu (Azure Yönetilen Uygulama değil) tekliflerini Azure Market dağıtırken, dağıtım yalnızca ISV'nin parametre olarak geçirilen ilgili kullanıcı arabirimi alanlarıyla yayımladığı ARM şablonudur. Çözüm şablonu teklifini program aracılığıyla dağıtmak için Azure portalını kullanarak dağıtımı gerçekleştirin, ARM şablonunu kopyalayın ve sonraki dağıtımlarda kullanın. Çözüm Şablonları "ücretli" teklifler olmadığından kabul edilmesi gereken özel koşullar yoktur. Ancak Çözüm Şablonu ARM şablonu Azure Market bir VM görüntüsüne başvuruda bulunuluyorsa, önce VM teklifi için açıklandığı gibi VM teklifinin koşullarını kabul etmeniz gerekir.

Sonraki adımlar