Erőforrások üzembe helyezése ARM-sablonokkal és Pythonnal

Ez a cikk bemutatja, hogyan használhatja a Pythont Azure Resource Manager-sablonokkal (ARM-sablonokkal) az erőforrások Azure-ban való üzembe helyezéséhez. Ha nem ismeri az Azure-megoldások üzembe helyezésének és kezelésének alapelveit, tekintse meg a sablon üzembe helyezésének áttekintését.

Előfeltételek

  • Üzembe helyezendő sablon. Ha még nem rendelkezik ilyen sablonnal, töltsön le és mentsen egy példasablont az Azure Gyorsindítási sablonok adattárából.

  • A Python 3.8 vagy újabb verziója telepítve van. Az új verzió telepítéséhez lásd: Python.org

  • A következő Azure-kódtárcsomagok a Pythonhoz telepítve vannak a virtuális környezetben. Bármelyik csomag telepítéséhez használja a pip install {package-name}

    • azure-identity
    • azure erőforráskezelés

    Ha ezeknek a csomagoknak a régebbi verziói már telepítve vannak a virtuális környezetben, előfordulhat, hogy frissítenie kell őket a következővel: pip install --upgrade {package-name}

  • A cikkben szereplő példák parancssori felületi hitelesítést (CLI-alapú hitelesítést)AzureCliCredential használnak. A környezettől függően előfordulhat, hogy először futtatnia az login kell a hitelesítéshez.

Szükséges engedélyek

Bicep-fájl vagy Azure Resource Manager-sablon üzembe helyezéséhez írási hozzáférésre van szüksége az üzembe helyezendő erőforrásokhoz, és hozzá kell férnie az Microsoft.Resources/deployments erőforrástípus összes műveletéhez. Egy virtuális gép üzembe helyezéséhez például szükség van Microsoft.Compute/virtualMachines/write és Microsoft.Resources/deployments/* engedélyekre. A what-if műveletnek ugyanazok az engedélykövetelményei vannak.

Az Azure CLI 2.76.0-s vagy újabb verziója, valamint az Azure PowerShell 13.4.0-s vagy újabb verziója bevezeti az ValidationLevel kapcsolót annak megállapításához, hogy az ARM milyen alaposan ellenőrzi a Bicep-sablont a folyamat során. További információ: What-if parancsok

A szerepkörök és engedélyek listáját megtalálja a Beépített Azure-szerepkörök című cikkben.

Üzembe helyezési hatókör

Az üzembe helyezést egy erőforráscsoportra, előfizetésre, felügyeleti csoportra vagy bérlőre célozhatja. Az üzembe helyezés hatókörétől függően különböző módszereket használ.

A sablont üzembe helyező felhasználónak minden hatókörhöz rendelkeznie kell az erőforrások létrehozásához szükséges engedélyekkel.

Telepítés neve

ARM-sablon üzembe helyezésekor nevet adhat az üzembe helyezésnek. Ez a név segíthet visszakeresni a telepítést a telepítési előzményekből. Ha nem adja meg az üzembe helyezés nevét, a rendszer a sablonfájl nevét használja. Ha például egy névvel ellátott azuredeploy.json sablont helyez üzembe, és nem ad meg üzembe helyezési nevet, az üzembe helyezés neve el lesz nevezve azuredeploy.

Minden alkalommal, amikor futtat egy telepítést, a rendszer hozzáad egy bejegyzést az erőforráscsoport telepítési előzményeihez a telepítés nevével. Ha egy másik üzembe helyezést futtat, és ugyanazt a nevet adja neki, a korábbi bejegyzést a rendszer lecseréli az aktuális üzembe helyezésre. Ha egyedi bejegyzéseket szeretne fenntartani az üzembe helyezési előzményekben, adjon egyedi nevet az egyes üzemelő példányoknak.

Egyedi név létrehozásához véletlenszerű számot rendelhet hozzá.

import random

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

Vagy adjon hozzá egy dátumértéket.

from datetime import datetime

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

Ha ugyanabban az erőforráscsoportban futtat egyidejű központi telepítéseket ugyanazzal az üzembe helyezési névvel, csak az utolsó üzembe helyezés fejeződik be. Az azonos névvel rendelkező, még nem befejezett üzembe helyezéseket az utolsó telepítés váltja fel. Ha például egy olyan üzembe helyezést newStorage futtat, amely egy névvel ellátott storage1tárfiókot helyez üzembe, és ugyanakkor futtat egy másik, egy elnevezett newStoragetárfiókot üzembe helyező üzembe storage2 helyezést, akkor csak egy tárfiókot helyez üzembe. Az eredményként kapott tárfiók neve storage2.

Ha azonban egy olyan üzembe helyezést newStorage futtat, amely egy nevű storage1tárfiókot helyez üzembe, és közvetlenül a befejezése után futtat egy másik üzembe helyezést newStorage , amely egy nevű storage2tárfiókot helyez üzembe, akkor két tárfiókja van. Az egyik neve storage1, a másik neve pedig .storage2 Az üzembe helyezési előzményekben azonban csak egy bejegyzés szerepel.

Ha egyedi nevet ad meg az egyes üzemelő példányoknak, egyidejűleg, ütközés nélkül futtathatja őket. Ha egy olyan üzembe helyezést newStorage1 futtat, amely egy névvel ellátott storage1tárfiókot helyez üzembe, és ugyanakkor futtat egy másik üzembe helyezést newStorage2 , amely egy elnevezett storage2tárfiókot helyez üzembe, akkor két tárfiókja és két bejegyzése van az üzembe helyezési előzményekben.

Az egyidejű üzembe helyezésekkel való ütközések elkerülése és az üzembe helyezési előzmények egyedi bejegyzéseinek biztosítása érdekében adjon egyedi nevet minden üzembe helyezésnek.

Helyi sablon üzembe helyezése

A helyi gépről vagy külsőleg tárolt sablont is üzembe helyezhet. Ez a szakasz egy helyi sablon üzembe helyezését ismerteti.

Ha olyan erőforráscsoportba kíván telepíteni, amely nem létezik, hozza létre az erőforráscsoportot. Az erőforráscsoport neve csak alfanumerikus karaktereket, pontokat, aláhúzásjeleket, kötőjeleket és zárójeleket tartalmazhat. Legfeljebb 90 karakter hosszúságú lehet. A név nem végződhet ponttal.

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-sablon üzembe helyezéséhez használja a ResourceManagementClient.deployments.begin_create_or_update. Az alábbi példához egy helyi sablonra van storage.jsonszükség.

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
        }
    }
)

Az üzembe helyezés végrehajtása több percet is igénybe vehet.

Távoli sablon üzembe helyezése

Ahelyett, hogy ARM-sablonokat tárol a helyi gépen, érdemes lehet külső helyen tárolni őket. Sablonokat tárolhat egy olyan verziókövetési rendszer adattárában is, mint a GitHub. Tárolhatja azokat egy Azure-tárfiókban is, ahol megosztva érhető el a vállalat számára.

Ha olyan erőforráscsoportba kíván telepíteni, amely nem létezik, hozza létre az erőforráscsoportot. Az erőforráscsoport neve csak alfanumerikus karaktereket, pontokat, aláhúzásjeleket, kötőjeleket és zárójeleket tartalmazhat. Legfeljebb 90 karakter hosszúságú lehet. A név nem végződhet ponttal.

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}")

Az ARM-sablon üzembe helyezéséhez használja a ResourceManagementClient.deployments.begin_create_or_update. Az alábbi példa egy távoli sablont helyez üzembe. Ez a sablon létrehoz egy tárfiókot.

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
        }
    }
)

Az előző példához nyilvánosan elérhető URI szükséges a sablonhoz, amely a legtöbb forgatókönyv esetében működik, mert a sablonnak nem szabad bizalmas adatokat tartalmaznia. Ha bizalmas adatokat (például rendszergazdai jelszót) kell megadnia, adja át ezt az értéket biztonságos paraméterként. Ha a sablonokat olyan tárfiókban tartja, amely nem teszi lehetővé a névtelen hozzáférést, meg kell adnia egy SAS-jogkivonatot.

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
        }
    }
)

További információ: Relatív elérési út használata csatolt sablonokhoz.

Sablon specifikáció üzembe helyezése

Helyi vagy távoli sablon üzembe helyezése helyett létrehozhat egy sablon-specifikációt. A sablon specifikációja egy erőforrás az Azure-előfizetésben, amely arm-sablont tartalmaz. Ez megkönnyíti a sablon biztonságos megosztását a szervezet felhasználóival. Az Azure szerepköralapú hozzáférés-vezérlés (Azure RBAC) használatával biztosít hozzáférést a sablon specifikációihoz.

Az alábbi példák bemutatják, hogyan hozhat létre és helyezhet üzembe sablon-specifikációkat.

Először hozza létre a sablon specifikációját az ARM-sablon megadásával.

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}")

Ezután kérje le a sablon specifikációjának azonosítóját, és telepítse azt.

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
        }
    }
)

További információkért tekintse meg az Azure Resource Manager-sablon specifikációit.

Módosítások előnézete

A sablon üzembe helyezése előtt megtekintheti a sablon által a környezetében végzett módosításokat. A lehetőségelemzési művelettel ellenőrizze, hogy a sablon végrehajtja-e a várt módosításokat. A What-if a sablont is ellenőrzi a hibák esetén.

Következő lépések

  • Ha hiba esetén szeretne visszatérni egy sikeres üzembe helyezéshez, tekintse meg a sikeres üzembe helyezésre vonatkozó hiba visszaállítása című témakört.
  • Az erőforráscsoportban található, de a sablonban nem definiált erőforrások kezelésének módjáról az Azure Resource Manager üzembe helyezési módjaiban olvashat.
  • Ha szeretné megtudni, hogyan definiálhat paramétereket a sablonban, olvassa el az ARM-sablonok szerkezetének és szintaxisának ismertetése című témakört.
  • Az SAS-jogkivonatot igénylő sablon üzembe helyezésével kapcsolatos információkért lásd : Privát ARM-sablon üzembe helyezése SAS-jogkivonattal.