Steigern der Flexibilität mithilfe von Parametern und Variablen

Abgeschlossen

Vorlagen bieten aufgrund ihrer Wiederverwendbarkeit sehr viele Leistungsvorteile. Sie können mit Bicep Vorlagen schreiben, die mehrere Umgebungen oder Kopien Ihrer Ressourcen bereitstellen.

Ihr Spielzeugunternehmen führt regelmäßig neue Produkte im Markt ein, und Sie müssen die Bicep-Vorlagen verwenden, um die für die einzelnen Produktstarts erforderlichen Azure-Ressourcen zu erstellen. Sie müssen die Verwendung fester Ressourcennamen vermeiden. Für viele Azure-Ressourcen sind Namen erforderlich, sodass eingebettete Namen in Ihrer Vorlage dazu führen, dass Sie die Vorlage nicht für die Einführungen mehrerer Produkte wiederverwenden können. Außerdem müssen Sie die Ressourcen auch an verschiedenen Standorten bereitstellen, die davon abhängig sind, wo das Spielzeug eingeführt wird. Daher können Sie auch die Ressourcenstandorte nicht fest in Ihre Vorlage einbetten.

In dieser Lerneinheit erfahren Sie mehr über Parameter und Variablen, zwei Bicep-Features, mit denen Sie Ihre Vorlagen flexibel und wiederverwendbar machen können. Außerdem erhalten Sie eine Einführung in Ausdrücke.

Hinweis

Die Befehle in dieser Lerneinheit dienen der Veranschaulichung der Konzepte. Führen Sie die Befehle jetzt noch nicht aus. Sie können das Erlernte in Kürze üben.

Parameter und Variablen

Mit einem Parameter können Sie Werte von außerhalb der Vorlagendatei einbringen. Wenn Sie beispielsweise die Vorlage manuell mithilfe der Azure-Befehlszeilenschnittstelle oder von Azure PowerShell bereitstellen, werden Sie aufgefordert, Werte für jeden Parameter bereitzustellen. Sie können auch eine Parameterdatei erstellen, die alle Parameter und Werte auflistet, die Sie für die Bereitstellung verwenden wollen. Wenn die Vorlage über einen automatisierten Prozess wie eine Bereitstellungspipeline bereitgestellt wird, können die Parameterwerte auch über die Pipeline bereitgestellt werden.

Eine Variable wird innerhalb der Vorlage definiert und festgelegt. Mit Variablen können Sie wichtige Informationen an einem Ort speichern und in der gesamten Vorlage darauf verweisen, ohne sie kopieren und einfügen zu müssen.

Es hat sich bewährt, Parameter für Dinge zu verwenden, die sich zwischen den einzelnen Bereitstellungen ändern, z. B.:

  • Ressourcennamen, die eindeutig sein müssen.
  • Standorte für die Ressourcenbereitstellung.
  • Einstellungen, die sich auf die Preise von Ressourcen auswirken, z. B. SKUs, Tarife und Anzahl der Instanzen
  • Anmeldeinformationen und Informationen für den Zugriff auf andere Systeme, die nicht in der Vorlage definiert sind

Variablen sind in der Regel eine gute Option, wenn Sie für jede Bereitstellung die gleichen Werte verwenden, aber einen Wert innerhalb der Vorlage wiederverwendbar machen wollen, oder wenn Sie Ausdrücke verwenden wollen, um einen komplexen Wert zu erstellen. Sie können Variablen auch für Ressourcen verwenden, die keine eindeutigen Namen erfordern.

Tipp

Es ist wichtig, für Parameter und Variablen eine durchdachte Benennung anzuwenden, damit Ihre Vorlagen einfach zu lesen und zu verstehen sind. Verwenden Sie klare, aussagekräftige und konsistente Namen.

Hinzufügen eines Parameters

In Bicep können Sie Parameter wie folgt definieren:

param appServiceAppName string

Sehen Sie sich an, wie die einzelnen Teile dieser Definition funktionieren:

  • param teilt Bicep mit, dass Sie einen Parameter definieren.
  • appServiceAppName ist der Name des Parameters. Wenn Sie die Vorlage manuell bereitstellen, werden Sie möglicherweise aufgefordert, einen Wert einzugeben, daher ist es wichtig, dass der Name klar und verständlich ist. Mit diesem Namen verweisen Sie auch in der Vorlage auf den Parameterwert, genau wie bei symbolischen Ressourcennamen.
  • string ist der Typ des Parameters. Sie können verschiedene Typen als Bicep-Parameter angeben, einschließlich string für Text, int für Zahlen und bool für die booleschen Werte TRUE/FALSE. Sie können auch komplexere Parameter übergeben, indem Sie die Typen array und object verwenden.

Tipp

Versuchen Sie jedoch nicht, Vorlagen durch zu viele Parameter zu stark zu generalisieren. Sie sollten die kleinstmögliche Anzahl von Parametern verwenden, die Sie für Ihr Geschäftsszenario benötigen. Denken Sie daran, dass Sie Vorlagen in Zukunft jederzeit ändern können, wenn sich Ihre Anforderungen ändern.

Angeben von Standardwerten

Sie können optional einen Standardwert für einen Parameter angeben. Wenn Sie einen Standardwert angeben, wird der Parameter optional. Die Person, die die Vorlage bereitstellt, kann bei Bedarf einen Wert angeben. Wenn keine Angabe gemacht wird, verwendet Bicep den Standardwert.

So können Sie einen Standardwert hinzufügen

param appServiceAppName string = 'toy-product-launch-1'

Hinweis

In diesem Beispiel hat der Name der Azure App Service-App einen hartcodierten Standardwert. Dies ist keine gute Idee, da für App Service-Apps eindeutige Namen erforderlich sind. Sie werden dies in Kürze korrigieren.

Verwenden von Parameterwerten in der Vorlage

Nachdem Sie einen Parameter deklariert haben, können Sie in der restlichen Vorlage darauf verweisen. Sehen Sie sich einmal an, wie Sie Ihren neuen Parameter innerhalb der Ressourcendefinition verwenden können:

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: 'eastus'
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

Beachten Sie, dass die Vorlage jetzt anstelle eines hartcodierten Werts den Parameterwert verwendet, um den Ressourcennamen für die App-Ressource festzulegen.

Tipp

Mit der Bicep-Erweiterung für Visual Studio Code werden visuelle Indikatoren angezeigt, wenn Sie nicht die empfohlenen Methoden anwenden. Beispielsweise werden Sie gewarnt, wenn Sie einen Parameter definieren, den Sie nicht verwenden. Der Bicep-Linter führt diese Überprüfungen kontinuierlich aus, während Sie Ihre Aufgaben ausführen.

Hinzufügen einer Variablen

Sie können eine Variable wie folgt definieren:

var appServicePlanName = 'toy-product-launch-plan'

Variablen werden ähnlich wie Parameter definiert, es gibt jedoch einige Unterschiede:

  • Sie verwenden das Schlüsselwort var, um Bicep zu informieren, dass Sie eine Variable deklarieren.
  • Sie müssen einen Wert für die Variable angeben.
  • Für Variablen sind keine Typen erforderlich. Bicep kann den Typ basierend auf dem von Ihnen festgelegten Wert ermitteln.

Ausdrücke

Wenn Sie Vorlagen schreiben, möchten Sie Werte häufig nicht hartcodieren, oder Sie auch nur als Parameter erfragen. Stattdessen möchten Sie die Werte ermitteln, wenn die Vorlage ausgeführt wird. Beispielsweise möchten Sie höchstwahrscheinlich alle Ressourcen in einer Vorlage in derselben Azure-Region bereitstellen, in der Sie die Ressourcengruppe erstellt haben. Oder Sie möchten anhand einer bestimmten Benennungsstrategie in Ihrem Unternehmen automatisch einen eindeutigen Namen für eine Ressource erstellen.

Ausdrücke stellen ein leistungsstarkes Feature in Bicep dar, mit dem Sie alle möglichen interessanten Szenarien behandeln können. Sehen Sie sich einige Stellen an, an denen Sie Ausdrücke in einer Bicep-Vorlage verwenden können.

Ressourcenstandorte

Wenn Sie eine Vorlage schreiben und bereitstellen, möchten Sie häufig nicht den Standort jeder Ressource einzeln angeben. Stattdessen verfügen Sie vielleicht über eine einfache Geschäftsregel, die besagt: Standardmäßig werden alle Ressourcen im gleichen Ort bereitgestellt, an dem die Ressourcengruppe erstellt wurde.

In Bicep können Sie einen Parameter mit dem Namen location erstellen und dann einen Ausdruck verwenden, um seinen Wert festzulegen:

param location string = resourceGroup().location

Sehen Sie sich den Standardwert dieses Parameters an. Er verwendet eine Funktion namens resourceGroup(), die Ihnen Zugriff auf Informationen zur Ressourcengruppe gibt, in der die Vorlage bereitgestellt wird. In diesem Beispiel verwendet die Vorlage die location-Eigenschaft. Es ist üblich, diesen Ansatz zu verwenden, um Ihre Ressourcen in derselben Azure-Region wie die Ressourcengruppe bereitzustellen.

Wenn eine Person diese Vorlage bereitstellt, kann sie den Standardwert hier überschreiben und einen anderen Standort verwenden.

Hinweis

Einige Ressourcen in Azure können nur an bestimmten Standorten bereitgestellt werden. Möglicherweise benötigen Sie separate Parameter, um die Standorte dieser Ressourcen festzulegen.

Sie können nun den Parameter für den Ressourcenstandort in der Vorlage wie folgt verwenden:

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

Ressourcennamen

Für viele Azure-Ressourcen sind eindeutige Namen erforderlich. In Ihrem Szenario sind zwei Ressourcen vorhanden, für die eindeutige Namen erforderlich sind: das Speicherkonto und die App Service-App. Wenn Sie zur Angabe der Werte als Parameter auffordern, ist die Verwendung Ihrer Vorlage für andere Personen schwierig, da sie einen Namen finden müssen, den bisher noch niemand verwendet hat.

Bicep verfügt über eine weitere Funktion namens uniqueString(), die beim Erstellen von Ressourcennamen nützlich ist. Wenn Sie diese Funktion verwenden, müssen Sie einen Seedwert angeben, der für verschiedene Bereitstellungen unterschiedlich, aber für alle Bereitstellungen derselben Ressourcen konsistent sein sollte.

Wenn Sie einen guten Seedwert auswählen, können Sie bei jeder Bereitstellung derselben Gruppe von Ressourcen den gleichen Namen erhalten, aber Sie werden immer einen anderen Namen erhalten, wenn Sie eine unterschiedliche Gruppe von Ressourcen mithilfe derselben Vorlage bereitstellen. Sehen Sie sich an, wie Sie die uniqueString()-Funktion verwenden können:

param storageAccountName string = uniqueString(resourceGroup().id)

Der Standardwert dieses Parameters verwendet die resourceGroup()-Funktion erneut, genau wie Sie beim Festlegen des Ressourcenspeicherorts vorgegangen sind. Dieses Mal erhalten Sie jedoch die ID einer Ressourcengruppe. So sieht eine Ressourcengruppen-ID aus:

/subscriptions/3e57e557-826f-460b-8f1c-4ce38fd53b32/resourceGroups/MyResourceGroup

Die Ressourcengruppen-ID enthält die Azure-Abonnement-ID (3e57e557-826f-460b-8f1c-4ce38fd53b32) und den Ressourcengruppennamen (MyResourceGroup). Die Ressourcengruppen-ID ist häufig ein guter Kandidat für den Startwert von Ressourcennamen. Dies hat folgende Gründe:

  • Jedes Mal, wenn Sie die gleichen Ressourcen bereitstellen, erfolgt die Bereitstellung in derselben Ressourcengruppe. Die Funktion uniqueString() gibt jedes Mal denselben Wert zurück.
  • Wenn Sie in zwei verschiedenen Ressourcengruppen im Azure-Abonnement bereitstellen, ist der Wert resourceGroup().id unterschiedlich, da sich die Ressourcengruppennamen unterscheiden. Die Funktion uniqueString() gibt für jeden Ressourcensatz unterschiedliche Werte an.
  • Wenn Sie in zwei verschiedenen Azure-Abonnements bereitstellen, ist der Wert resourceGroup().id auch dann unterschiedlich, wenn Sie denselben Ressourcengruppennamen verwenden, da sich die Azure-Abonnement-ID unterscheidet. Die Funktion uniqueString() gibt erneut für jeden Ressourcensatz unterschiedliche Werte an.

Tipp

Es ist häufig sinnvoll, für das Erstellen von Ressourcennamen Vorlagenausdrücke zu verwenden. Viele Azure-Ressourcentypen weisen Regeln für die zulässigen Zeichen und die Länge der Namen auf. Das Einbetten der Erstellung von Ressourcennamen in die Vorlage bedeutet, dass sich Personen, die die Vorlage verwenden, nicht selbst um die Einhaltung der Regeln kümmern müssen.

Kombinierte Zeichenfolgen

Wenn Sie nur die uniqueString()-Funktion zum Festlegen von Ressourcennamen verwenden, erhalten Sie wahrscheinlich eindeutige Namen, die aber möglicherweise nicht sehr aussagekräftig sind. Ein guter Ressourcenname sollte auch beschreibend sein, damit klar ist, wofür die Ressource vorgesehen ist. Oftmals erstellen Sie einen Namen, indem Sie ein aussagekräftiges Wort oder eine Zeichenfolge mit einem eindeutigen Wert kombinieren. Auf diese Weise verfügen Ihre Ressourcen über aussagekräftige und eindeutige Namen.

Bicep enthält ein Feature namens Zeichenfolgeninterpolation, mit dem Sie Zeichenfolgen kombinieren können. Sehen Sie selbst, wie es funktioniert:

param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'

Der Standardwert für den storageAccountName-Parameter besteht jetzt aus zwei Teilen:

  • toylaunch ist eine hartcodierte Zeichenfolge, mit der jede Person, die sich die bereitgestellte Ressource in Azure ansieht, den Zweck dieses Speicherkonto verstehen kann.
  • ${uniqueString(resourceGroup().id)} weist Bicep an, die Ausgabe der uniqueString(resourceGroup().id)-Funktion auszuwerten und das Ergebnis dann mit der Zeichenfolge zu verketten.

Tipp

Manchmal erstellt die uniqueString()-Funktion Zeichenfolgen, die mit einer Zahl beginnen. Bei einigen Azure-Ressourcen (z. B. Speicherkonten) dürfen die Namen nicht mit Zahlen beginnen. Daher eignet sich die Zeichenfolgeninterpolation gut für das Erstellen von Ressourcennamen, wie im vorherigen Beispiel gezeigt.

Auswählen von SKUs für Ressourcen

Die anderen Mitglieder Ihres Teams sind von Ihrem bisher erstellten Bicep-Code beeindruckt. Sie haben gemeinsam entschieden, dass Sie Ihre Vorlage für die Bereitstellung der Ressourcen verwenden, um die Markteinführung all Ihrer Spielzeuge zu unterstützen.

Einer Ihrer Kollegen hat vorgeschlagen, für jeden Produktstart eine Nicht-Produktionsumgebung zu erstellen, damit das Marketingteam die Websites testen kann, bevor sie für Kund*innen bereitgestellt werden. Sie möchten jedoch sicherstellen, dass Sie nicht zu viel Geld für Ihre Nichtproduktionsumgebungen ausgeben, daher entscheiden Sie sich gemeinsam für einige Richtlinien:

  • In Produktionsumgebungen werden Speicherkonten in der SKU Standard_GRS (georedundanter Speicher) bereitgestellt, um eine hohe Resilienz sicherzustellen. App Service-Pläne werden in der SKU P2v3 bereitgestellt, um eine hohe Leistung zu erzielen.
  • In Nicht-Produktionsumgebungen werden Speicherkonten in der SKU Standard_LRS (lokal redundanter Speicher) bereitgestellt. App Service-Pläne werden in der kostenlosen SKU F1 bereitgestellt.

Eine Möglichkeit, diese Geschäftsanforderungen zu implementieren, stellt die Verwendung von Parametern dar, in denen die einzelnen SKUs angegeben werden. Die Angabe jeder SKU als Parameter ist jedoch mitunter schwierig zu verwalten – insbesondere bei größeren Vorlagen. Eine weitere Möglichkeit besteht darin, die Geschäftsregeln mithilfe einer Kombination aus Parametern, Variablen und Ausdrücken in die Vorlage einzubetten.

Zunächst können Sie einen Parameter angeben, der angibt, ob die Bereitstellung für eine Produktionsumgebung oder eine Nicht-Produktionsumgebung vorgesehen ist:

@allowed([
  'nonprod'
  'prod'
])
param environmentType string

Beachten Sie, dass in diesem Code eine neue Syntax verwendet wird, um eine Liste der zulässigen Werte für den environmentType-Parameter anzugeben. Bicep lässt eine Bereitstellung der Vorlage nur dann zu, wenn einer dieser Werte angegeben wurde.

Als Nächstes können Sie Variablen erstellen, die basierend auf der Umgebung die SKUs festlegen, die für das Speicherkonto und den App Service-Plan verwendet werden:

var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2V3' : 'F1'

Beachten Sie auch hier die neue Syntax. Folgende Schritte werden hier ausgeführt:

  • (environmentType == 'prod') wird zu einem booleschen Wert (TRUE/FALSE) ausgewertet, abhängig davon, welcher zulässige Wert für den Parameter environmentType verwendet wird.
  • ? wird als ternärer Operator bezeichnet, der eine if/then-Anweisung auswertet. Der Wert hinter dem Operator ? wird verwendet, wenn der Ausdruck TRUE ist. Bei einer Auswertung des Ausdrucks als FALSE wird der Wert nach dem Doppelpunkt (:) verwendet.

Wir können diese Regeln übersetzen in:

  • Wenn der environmentType-Parameter für die Variable storageAccountSkuName auf prod festgelegt ist, wird die SKU Standard_GRS verwendet. Andernfalls wird die SKU Standard_LRS verwendet.
  • Wenn der environmentType-Parameter für die Variable appServicePlanSkuName auf prod festgelegt ist, werden die SKU P2V3 und der Tarif PremiumV3 verwendet. Andernfalls wird die SKU F1 verwendet.

Tipp

Wenn Sie mehrteilige Ausdrücke wie diesen erstellen, ist es am besten, Variablen zu verwenden, anstatt die Ausdrücke direkt in die Ressourceneigenschaften einzubetten. Dies vereinfacht das Lesen und Verstehen Ihrer Vorlagen, da die Ressourcendefinitionen nicht mit Logik überladen sind.

Wenn Sie Parameter, Variablen und Ausdrücke in Ihrer Vorlage verwenden, können Sie Ihre Vorlage wiederverwenden und schnell eine Gruppe neuer Ressourcen bereitstellen. Beispielsweise jedes Mal, wenn Ihre Marketingabteilung Sie bittet, eine neue Website für die nächste Einführung eines Spielzeugs bereitzustellen, geben Sie für jede Umgebung, die Sie bereitstellen, neue Parameterwerte an, und alles ist bereit.