Přidání flexibility pomocí parametrů a proměnných

Dokončeno

Šablony jsou výkonné kvůli jejich opakované použitelnosti. Pomocí Bicep můžete psát šablony, které nasazují více prostředí nebo kopií vašich prostředků.

Vaše společnost toy pravidelně spouští nové produkty a musíte použít šablony Bicep k vytvoření prostředků Azure požadovaných pro každé spuštění produktu. Musíte se vyhnout použití pevných názvů prostředků. Mnoho typů prostředků Azure potřebuje jedinečné názvy, takže vkládání názvů do šablony znamená, že šablonu nemůžete znovu použít pro více spuštění produktů. Prostředky také musíte nasadit do různých umístění v závislosti na tom, kde se budou hračky spouštět, což znamená, že umístění prostředků nemůžete do šablony vložit.

V této lekci se dozvíte o parametrech a proměnných, což jsou dvě funkce Bicep, které umožňují flexibilní a opakovaně použitelné šablony. Seznámíte se také s výrazy.

Poznámka:

Příkazy v této lekci jsou znázorněny pro ilustraci konceptů. Zatím nespouštět příkazy. Brzy si procvičíte, co se tady naučíte.

Parametry a proměnné

Parametr umožňuje přenést hodnoty mimo soubor šablony. Pokud například šablonu ručně nasazujete pomocí Azure CLI nebo Azure PowerShellu, zobrazí se výzva k zadání hodnot pro každý parametr. Můžete také vytvořit soubor parametrů, který obsahuje všechny parametry a hodnoty, které chcete použít pro nasazení. Pokud je šablona nasazená z automatizovaného procesu, jako je kanál nasazení, může kanál poskytnout hodnoty parametrů.

Proměnná je definována a nastavena v rámci šablony. Proměnné umožňují ukládat důležité informace na jednom místě a odkazovat na ni v celé šabloně, aniž byste je museli kopírovat a vkládat.

Obvykle je vhodné použít parametry pro věci, které se mezi jednotlivými nasazeními změní, například:

  • Názvy prostředků, které musí být jedinečné.
  • Umístění, do kterých se mají prostředky nasadit.
  • Nastavení, která ovlivňují ceny prostředků, jako jsou jejich skladové položky, cenové úrovně a počty instancí.
  • Přihlašovací údaje a informace potřebné pro přístup k jiným systémům, které nejsou definované v šabloně.

Proměnné jsou obvykle dobrou volbou, když pro každé nasazení použijete stejné hodnoty, ale chcete, aby se hodnota v rámci šablony opakovaně používala, nebo když chcete použít výrazy k vytvoření komplexní hodnoty. Proměnné můžete použít také pro prostředky, které nepotřebují jedinečné názvy.

Tip

Je důležité použít dobré pojmenování parametrů a proměnných, takže šablony jsou snadno čitelné a srozumitelné. Ujistěte se, že používáte jasné, popisné a konzistentní názvy.

Přidání parametru

V Bicep můžete definovat parametr takto:

param appServiceAppName string

Pojďme se podívat, jak jednotlivé části této definice fungují:

  • param řekne Bicep, že definujete parametr.
  • appServiceAppName je název parametru. Pokud šablonu nasazujete ručně, může se zobrazit výzva k zadání hodnoty, takže je důležité, aby byl název jasný a srozumitelný. Název je také způsob, jakým odkazujete na hodnotu parametru v šabloně, stejně jako u symbolických názvů prostředků.
  • string je typ parametru. Pro parametry Bicep můžete zadat několik různých typů, včetně string textu, int čísel a bool logických hodnot true nebo false. Složitější parametry můžete předat také pomocí a array object typů.

Tip

Nepokoušejte se přeobecňovat šablony pomocí příliš mnoha parametrů. Pro váš obchodní scénář byste měli použít minimální počet parametrů, které potřebujete. Nezapomeňte, že pokud se vaše požadavky změní, můžete šablony v budoucnu kdykoli změnit.

Zadání výchozích hodnot

Volitelně můžete zadat výchozí hodnotu parametru. Když zadáte výchozí hodnotu, parametr se stane volitelným. Osoba, která šablonu nasazuje, může zadat hodnotu, pokud chce, ale pokud ne, použije Bicep výchozí hodnotu.

Tady je postup, jak přidat výchozí hodnotu:

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

Poznámka:

V tomto příkladu má název aplikace Aplikace Azure Service pevně zakódovanou výchozí hodnotu. To není dobrý nápad, protože aplikace App Service potřebují jedinečné názvy. Za chvíli to opravíte.

Použití hodnot parametrů v šabloně

Jakmile deklarujete parametr, můžete na něj odkazovat ve zbytku šablony. Pojďme se podívat, jak můžete použít nový parametr v definici prostředku:

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

Všimněte si, že šablona teď používá hodnotu parametru k nastavení názvu prostředku aplikace místo pevně zakódované hodnoty.

Tip

Rozšíření Bicep pro Visual Studio Code zobrazuje vizuální indikátory, které vás upozorní, když neposouzujete doporučené postupy. Například vás upozorní, pokud definujete parametr, který nepoužíváte. Linter Bicep průběžně spouští tyto kontroly během práce.

Přidání proměnné

Proměnnou můžete definovat takto:

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

Proměnné jsou definovány podobným způsobem jako parametry, ale existuje několik rozdílů:

  • Pomocí klíčového var slova řekněte Bicep, že deklarujete proměnnou.
  • Je nutné zadat hodnotu proměnné.
  • Proměnné nepotřebují typy. Bicep může určit typ na základě nastavené hodnoty.

Výrazy

Při psaní šablon často nechcete pevně zakódovat hodnoty ani je žádat o zadání v parametru. Místo toho chcete zjistit hodnoty při spuštění šablony. Například pravděpodobně chcete nasadit všechny prostředky v šabloně do jedné oblasti Azure: oblast, ve které jste vytvořili skupinu prostředků. Nebo můžete chtít automaticky vytvořit jedinečný název prostředku na základě konkrétní strategie pojmenování, kterou vaše společnost používá.

Výrazy v Bicep jsou výkonnou funkcí, která vám pomůže zvládnout nejrůznější zajímavé scénáře. Pojďme se podívat na několik míst, kde můžete použít výrazy v šabloně Bicep.

Umístění prostředků

Při psaní a nasazování šablony často nechcete zadávat umístění každého prostředku jednotlivě. Místo toho můžete mít jednoduché obchodní pravidlo, které ve výchozím nastavení říká, nasaďte všechny prostředky do stejného umístění, ve kterém byla skupina prostředků vytvořena.

V Bicep můžete vytvořit parametr s názvem locationa pak pomocí výrazu nastavit jeho hodnotu:

param location string = resourceGroup().location

Podívejte se na výchozí hodnotu tohoto parametru. Používá funkci , resourceGroup() která poskytuje přístup k informacím o skupině prostředků, do které se šablona nasazuje. V tomto příkladu šablona používá location vlastnost. Tento přístup se běžně používá k nasazení prostředků do stejné oblasti Azure jako skupina prostředků.

Pokud někdo nasazuje tuto šablonu, může se rozhodnout, že tady přepíše výchozí hodnotu a použije jiné umístění.

Poznámka:

Některé prostředky v Azure je možné nasadit pouze do určitých umístění. K nastavení umístění těchto prostředků možná budete potřebovat samostatné parametry.

Teď můžete použít parametr umístění prostředku uvnitř šablony, například takto:

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

Názvy prostředků

Mnoho prostředků Azure potřebuje jedinečné názvy. Ve vašem scénáři máte dva prostředky, které potřebují jedinečné názvy: účet úložiště a aplikaci App Service. Když požádáte o nastavení těchto hodnot jako parametry, může být pro každého, kdo šablonu používá, obtížné, protože potřebují najít jméno, které nikdo jiný nepoužívá.

Bicep má další funkci, uniqueString() která se při vytváření názvů prostředků hodí. Při použití této funkce musíte zadat počáteční hodnotu, která by se měla lišit v různých nasazeních, ale konzistentní napříč všemi nasazeními pro stejné prostředky.

Pokud zvolíte dobrou počáteční hodnotu, můžete získat stejný název pokaždé, když nasadíte stejnou sadu prostředků, ale pokaždé, když nasadíte jinou sadu prostředků pomocí stejné šablony, získáte jiný název. Pojďme se podívat, jak můžete funkci použít uniqueString() :

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

Výchozí hodnota tohoto parametru resourceGroup() znovu používá funkci, jako jste to udělali při nastavování umístění prostředku. Tentokrát ale získáte ID skupiny prostředků. ID skupiny prostředků vypadá takto:

/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MyResourceGroup

ID skupiny prostředků zahrnuje ID předplatného Azure (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e) a název skupiny prostředků (MyResourceGroup). ID skupiny prostředků je často vhodným kandidátem na počáteční hodnotu pro názvy prostředků, protože:

  • Pokaždé, když nasadíte stejné prostředky, přejdou do stejné skupiny prostředků. Funkce uniqueString() vrátí stejnou hodnotu pokaždé.
  • Pokud nasadíte do dvou různých skupin prostředků v předplatném Azure, resourceGroup().id hodnota se bude lišit, protože názvy skupin prostředků se budou lišit. Funkce uniqueString() poskytne různé hodnoty pro každou sadu prostředků.
  • Pokud nasadíte do dvou různých předplatných Azure, i když použijete stejný název skupiny prostředků, hodnota se bude lišit, resourceGroup().id protože ID předplatného Azure se bude lišit. Funkce uniqueString() znovu poskytne různé hodnoty pro každou sadu prostředků.

Tip

Často je vhodné k vytváření názvů prostředků použít výrazy šablony. Mnoho typů prostředků Azure má pravidla týkající se povolených znaků a délky jejich názvů. Vložení vytváření názvů prostředků do šablony znamená, že každý, kdo šablonu používá, si nemusí pamatovat, že tato pravidla dodržuje sami.

Kombinované řetězce

Pokud funkci použijete uniqueString() jenom k nastavení názvů prostředků, pravděpodobně získáte jedinečné názvy, ale nebudou smysluplné. Dobrý název prostředku by měl být také popisný, aby bylo jasné, k čemu prostředek slouží. Často budete chtít vytvořit název zkombinováním smysluplného slova nebo řetězce s jedinečnou hodnotou. Tímto způsobem budete mít prostředky, které mají smysluplné i jedinečné názvy.

Bicep má funkci označovanou jako interpolace řetězců, která umožňuje kombinovat řetězce. Pojďme se podívat, jak to funguje:

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

Výchozí hodnota parametru storageAccountName má teď dvě části:

  • toylaunch je pevně zakódovaný řetězec, který pomáhá každému, kdo se podívá na nasazený prostředek v Azure, aby porozuměl účelu účtu úložiště.
  • ${uniqueString(resourceGroup().id)} je způsob, jak bicep instruovat, aby vyhodnotil výstup uniqueString(resourceGroup().id) funkce, a pak ho zřetězením do řetězce.

Tip

uniqueString() Někdy funkce vytvoří řetězce, které začínají číslem. Některé prostředky Azure, jako jsou účty úložiště, neumožňují jejich názvy začínat čísly. To znamená, že je vhodné použít interpolaci řetězců k vytvoření názvů prostředků, jako je v předchozím příkladu.

Výběr skladových položek pro prostředky

Ostatní členové vašeho týmu jsou ohromeni kódem Bicep, který jste zatím vytvořili. Rozhodli jste se společně, že pomocí šablony nasadíte prostředky pro podporu všech nových spuštění toy.

Jeden z vašich kolegů navrhl, abyste pro každé uvedení produktů vytvořili neprodukční prostředí, aby marketingovému týmu pomohli weby otestovat, než budou zákazníkům k dispozici. Chcete se ale ujistit, že netratíte příliš mnoho peněz na neprodukční prostředí, takže se rozhodnete o některých zásadách společně:

  • V produkčních prostředích se účty úložiště nasadí na Standard_GRS skladovou položku (geograficky redundantní úložiště) pro zajištění vysoké odolnosti. Plány služby App Service se nasadí na skladovou P2v3 položku pro zajištění vysokého výkonu.
  • V neprodukčním prostředí se účty úložiště nasadí na skladovou Standard_LRS položku (místně redundantní úložiště). Plány služby App Service se nasadí na bezplatnou F1 skladovou položku.

Jedním ze způsobů implementace těchto obchodních požadavků je použití parametrů k určení jednotlivých skladových položek. Zadání každé skladové položky jako parametru ale může být obtížné spravovat, zejména pokud máte větší šablony. Další možností je vložit obchodní pravidla do šablony pomocí kombinace parametrů, proměnných a výrazů.

Nejprve můžete zadat parametr, který určuje, jestli je nasazení určené pro produkční nebo neprodukční prostředí:

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

Všimněte si, že tento kód používá k zadání seznamu povolených hodnot parametru environmentType novou syntaxi. Bicep nedovolí, aby šablonu nasadili nikdo, pokud nezadá některou z těchto hodnot.

Dále můžete vytvořit proměnné, které určují skladové položky, které se mají použít pro účet úložiště a plán služby App Service na základě prostředí:

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

Všimněte si také nové syntaxe. Pojďme si ho rozdělit:

  • (environmentType == 'prod') v závislosti na tom, která povolená hodnota se používá pro environmentType parametr, se vyhodnotí jako logická hodnota (pravda nebo nepravda).
  • ? se nazývá ternární operátor a vyhodnocuje if/then příkaz. Hodnota za operátorem ? se použije, pokud je výraz pravdivý. Pokud se výraz vyhodnotí jako nepravda, použije se hodnota za dvojtečku (:).

Tato pravidla můžeme přeložit na:

  • Pro proměnnou storageAccountSkuName , pokud environmentType je parametr nastaven na prod, pak použijte skladovou Standard_GRS položku. V opačném případě použijte skladovou Standard_LRS položku.
  • Pro proměnnou appServicePlanSkuName , pokud environmentType je parametr nastaven na prod, pak použijte skladovou P2V3 položku a PremiumV3 úroveň. V opačném případě použijte skladovou F1 položku.

Tip

Když vytváříte výrazy s více částmi, je vhodné místo vložení výrazů přímo do vlastností prostředku použít proměnné. Díky tomu jsou šablony přehlednější a srozumitelnější, protože se tím vyhnete nepotřebným definicím prostředků pomocí logiky.

Při použití parametrů, proměnných a výrazů v šabloně můžete šablonu znovu použít a rychle nasadit novou sadu prostředků. Například pokaždé, když marketingové oddělení požádá o nasazení nového webu pro další spuštění toy, zadáte nové hodnoty parametrů pro každé prostředí, které nasadíte, a budete nastaveni.