ARM şablonları ve Python ile kaynakları dağıtma

Bu makalede, kaynaklarınızı Azure'a dağıtmak için Azure Resource Manager şablonlarıyla (ARM şablonları) Python'ın nasıl kullanılacağı açıklanmaktadır. Azure çözümlerinizi dağıtma ve yönetme kavramlarını bilmiyorsanız bkz . şablon dağıtımına genel bakış.

Önkoşullar

  • Dağıtılacak şablon. Henüz bir şablonunuz yoksa Azure Hızlı Başlangıç şablonları deposundan örnek bir şablon indirip kaydedin.

  • Python 3.8 veya üzeri yüklü. En son sürümü yüklemek için bkz. Python.org

  • Sanal ortamınızda yüklü Python için aşağıdaki Azure kitaplık paketleri. Paketlerden herhangi birini yüklemek için pip install {package-name} kullanın

    • Azure-Kimlik
    • azure-mgmt-resource

    Bu paketlerin daha eski sürümleri sanal ortamınızda zaten yüklüyse, bunları pip install --upgrade {package-name} ile güncellemeniz gerekebilir.

  • Bu makaledeki örneklerde CLI tabanlı kimlik doğrulaması (AzureCliCredential kullanılır). Ortamınıza bağlı olarak, kimlik doğrulaması yapmak için önce çalıştırmanız az login gerekebilir.

Gerekli izinler

Bicep dosyası veya Azure Resource Manager (ARM) şablonu dağıtmak için, dağıtacağınız kaynaklar üzerinde yazma erişimine ve kaynak türü Microsoft.Resources/deployments üzerindeki tüm işlemlere erişiminizin olması gerekir. Örneğin, bir sanal makine dağıtmak için Microsoft.Compute/virtualMachines/write ve Microsoft.Resources/deployments/* izinlerine ihtiyacınız vardır. What-if işlemi aynı izin gereksinimlerine sahiptir.

Azure CLI sürüm 2.76.0 veya üzeri ve Azure PowerShell sürüm 13.4.0 veya üzeri , ARM'nin bu işlem sırasında Bicep şablonunu nasıl kapsamlı bir şekilde doğruladığını belirlemek için ValidationLevel anahtarını tanıtır. Daha fazla bilgi için Olası Durum Komutları kısmına bakın.

Rol ve izinlerin bir listesi için Azure yerleşik roller'ine bakın.

Dağıtım kapsamı

Dağıtımınızı bir kaynak grubuna, aboneliğe, yönetim grubuna veya kiracıya hedefleyebilirsiniz. Dağıtımın kapsamına bağlı olarak farklı yöntemler kullanırsınız.

Her kapsam için şablonu dağıtan kullanıcının kaynak oluşturmak için gerekli izinlere sahip olması gerekir.

Dağıtım adı

ARM şablonu dağıtırken dağıtıma bir ad verebilirsiniz. Bu isim, dağıtımı dağıtım geçmişinden geri almanıza yardımcı olabilir. Dağıtım için bir ad sağlamazsanız şablon dosyasının adı kullanılır. Örneğin, adlı azuredeploy.json bir şablon dağıtırsanız ve dağıtım adı belirtmezseniz, dağıtım olarak adlandırılır azuredeploy.

Bir dağıtımı her çalıştırdığınızda, kaynak grubunun dağıtım geçmişine dağıtım adıyla bir giriş eklenir. Başka bir dağıtım çalıştırır ve aynı adı verirseniz, önceki girdi geçerli dağıtımla değiştirilir. Dağıtım geçmişinde benzersiz girdiler tutmak istiyorsanız, her dağıtıma benzersiz bir ad verin.

Benzersiz bir ad oluşturmak için rastgele bir sayı atayabilirsiniz.

import random

suffix = random.randint(1, 1000)
deployment_name = f"ExampleDeployment{suffix}"

Veya bir tarih değeri ekleyin.

from datetime import datetime

today = datetime.now().strftime("%m-%d-%Y")
deployment_name = f"ExampleDeployment{today}"

Aynı kaynak grubuna aynı dağıtım adıyla eşzamanlı dağıtımlar çalıştırırsanız, yalnızca son dağıtım tamamlanır. Aynı adı taşıyan henüz tamamlanmamış dağıtımlar en son yapılan dağıtımla değiştirilir. Örneğin, adlı newStoragebir depolama hesabı dağıtan adlı storage1 bir dağıtım çalıştırırsanız ve aynı zamanda adlı newStoragebir depolama hesabı dağıtan adlı storage2 başka bir dağıtımı çalıştırırsanız, yalnızca bir depolama hesabı dağıtırsınız. Elde edilen depolama hesabı, storage2 olarak adlandırılır.

Ancak adlı newStorage bir depolama hesabı storage1dağıtan adlı bir dağıtım çalıştırırsanız ve tamamlandıktan hemen sonra adlı newStoragebir depolama hesabı dağıtan adlı storage2 başka bir dağıtım çalıştırırsanız iki depolama hesabınız olur. Biri olarak adlandırılır storage1, diğeri ise olarak adlandırılır storage2. Ancak dağıtım geçmişinde yalnızca bir kaydınız vardır.

Her dağıtım için benzersiz bir ad belirttiğinizde, bunları çakışma olmadan eşzamanlı olarak çalıştırabilirsiniz. adlı newStorage1 bir depolama hesabı dağıtan ve aynı zamanda adlı storage1bir depolama hesabı dağıtan başka bir dağıtım newStorage2 çalıştırırsanız, dağıtım geçmişinde iki depolama hesabınız storage2ve iki girdiniz vardır.

Eşzamanlı dağıtımlarla çakışmaları önlemek ve dağıtım geçmişinde benzersiz girdiler sağlamak için her dağıtıma benzersiz bir ad verin.

Yerel şablonu dağıtma

Yerel makinenizden veya harici olarak depolanan bir şablondan şablon dağıtabilirsiniz. Bu bölümde yerel şablon dağıtma açıklanmaktadır.

Mevcut olmayan bir kaynak grubuna dağıtıyorsanız kaynak grubunu oluşturun. Kaynak grubunun adı yalnızca alfasayısal karakterler, nokta, alt çizgi, kısa çizgi ve parantez içerebilir. En fazla 90 karakter olabilir. Ad bir noktayla bitemez.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

rg_result = resource_client.resource_groups.create_or_update(
    "exampleGroup",
    {
        "location": "Central US"
    }
)

print(f"Provisioned resource group with ID: {rg_result.id}")

ARM şablonu dağıtmak için ResourceManagementClient.deployments.begin_create_or_update kullanın. Aşağıdaki örnekte adlı storage.jsonyerel bir şablon gerekir.

import os
import json
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.resource.resources.models import DeploymentMode

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

with open("storage.json", "r") as template_file:
    template_body = json.load(template_file)

rg_deployment_result = resource_client.deployments.begin_create_or_update(
    "exampleGroup",
    "exampleDeployment",
    {
        "properties": {
            "template": template_body,
            "parameters": {
                "storagePrefix": {
                    "value": "demostore"
                },
            },
            "mode": DeploymentMode.incremental
        }
    }
)

Dağıtımın tamamlanması birkaç dakika sürebilir.

Uzak şablonu dağıt

ARM şablonlarını yerel makinenizde depolamak yerine bunları bir dış konumda depolamayı tercih edebilirsiniz. Şablonları bir kaynak denetimi deposunda (GitHub gibi) saklayabilirsiniz. İsterseniz kuruluşunuzda paylaşılan erişim sağlamak için bir Azure depolama hesabı kullanabilirsiniz.

Mevcut olmayan bir kaynak grubuna dağıtıyorsanız kaynak grubunu oluşturun. Kaynak grubunun adı yalnızca alfasayısal karakterler, nokta, alt çizgi, kısa çizgi ve parantez içerebilir. En fazla 90 karakter olabilir. Ad bir noktayla bitemez.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

rg_result = resource_client.resource_groups.create_or_update(
    "exampleGroup",
    {
        "location": "Central US"
    }
)

print(f"Provisioned resource group with ID: {rg_result.id}")

ARM şablonu dağıtmak için ResourceManagementClient.deployments.begin_create_or_update kullanın. Aşağıdaki örnekte uzak şablon dağıtılır. Bu şablon bir depolama hesabı oluşturur.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.resource.resources.models import DeploymentMode

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

resource_group_name = "exampleGroup"
location = "westus"
template_uri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.storage/storage-account-create/azuredeploy.json"

rg_deployment_result = resource_client.deployments.begin_create_or_update(
    resource_group_name,
    "exampleDeployment",
    {
        "properties": {
            "templateLink": {
                "uri": template_uri
            },
            "parameters": {
                "location": {
                    "value": location
                }
            },
            "mode": DeploymentMode.incremental
        }
    }
)

Yukarıdaki örnek, şablon için genel olarak erişilebilen bir URI gerektirir. Bu, şablonunuzun hassas veriler içermemesi gerektiğinden çoğu senaryoda çalışır. Hassas verileri (yönetici parolası gibi) belirtmeniz gerekiyorsa bu değeri güvenli bir parametre olarak geçirin. Şablonlarınızı anonim erişime izin vermeyen bir depolama hesabında tutarsanız sas belirteci sağlamanız gerekir.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.resource.resources.models import DeploymentMode

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]
sas_token = os.environ["SAS_TOKEN"]

resource_client = ResourceManagementClient(credential, subscription_id)

resource_group_name = "exampleGroup"
location = "westus"
template_uri = f"https://stage20230425.blob.core.windows.net/templates/storage.json?{sas_token}"

rg_deployment_result = resource_client.deployments.begin_create_or_update(
    resource_group_name,
    "exampleDeployment",
    {
        "properties": {
            "templateLink": {
                "uri": template_uri
            },
            "parameters": {
                "location": {
                    "value": location
                }
            },
            "mode": DeploymentMode.incremental
        }
    }
)

Daha fazla bilgi için Bağlı şablonlar için göreli yolu kullanma bölümüne bakın.

Şablon belirtimini kullanıma al

Yerel veya uzak şablon dağıtmak yerine bir şablon belirtimi oluşturabilirsiniz. Şablon belirtimi, Azure aboneliğinizde ARM şablonu içeren bir kaynaktır. Şablonu kuruluşunuzdaki kullanıcılarla güvenli bir şekilde paylaşmayı kolaylaştırır. Şablon belirtimine erişim vermek için Azure rol tabanlı erişim denetimini (Azure RBAC) kullanırsınız.

Aşağıdaki örneklerde şablon belirtiminin nasıl oluşturulacağı ve dağıtılacağı gösterilmektedir.

İlk olarak, ARM şablonunu sağlayarak şablon belirtimini oluşturun.

import os
import json
from azure.identity import AzureCliCredential
from azure.mgmt.resource.templatespecs import TemplateSpecsClient
from azure.mgmt.resource.templatespecs.models import TemplateSpecVersion, TemplateSpec

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

template_specs_client = TemplateSpecsClient(credential, subscription_id)

template_spec = TemplateSpec(
    location="westus2",
    description="Storage Spec"
)

template_specs_client.template_specs.create_or_update(
    "templateSpecsRG",
    "storageSpec",
    template_spec
)

with open("storage.json", "r") as template_file:
    template_body = json.load(template_file)

version = TemplateSpecVersion(
    location="westus2",
    description="Storage Spec",
    main_template=template_body
)

template_spec_result = template_specs_client.template_spec_versions.create_or_update(
     "templateSpecsRG",
    "storageSpec",
    "1.0.0",
    version
)

print(f"Provisioned template spec with ID: {template_spec_result.id}")

Ardından, şablon belirtiminin kimliğini alın ve dağıtımını gerçekleştirin.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.resource.resources.models import DeploymentMode
from azure.mgmt.resource.templatespecs import TemplateSpecsClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)
template_specs_client = TemplateSpecsClient(credential, subscription_id)

template_spec = template_specs_client.template_spec_versions.get(
    "templateSpecsRg",
    "storageSpec",
    "1.0.0"
)

rg_deployment_result = resource_client.deployments.begin_create_or_update(
    "exampleGroup",
    "exampleDeployment",
    {
        "properties": {
            "template_link": {
                "id": template_spec.id
            },
            "mode": DeploymentMode.incremental
        }
    }
)

Daha fazla bilgi için bkz . Azure Resource Manager şablonu belirtimleri.

Değişiklikleri önizle

Şablonunuzu dağıtmadan önce, şablonun ortamınızda yapacağı değişikliklerin önizlemesini görebilirsiniz. Şablonun beklediğiniz değişiklikleri yaptığını doğrulamak için durum işlemini kullanın. What-if analizi, şablonu hatalara karşı da doğrular.

Sonraki Adımlar