Använda mallfunktioner för att göra Azure Resource Manager-mallen mer flexibel

Slutförd

I det här scenariot vill du distribuera din Azure Resource Manager-mall (ARM) till olika miljöer så smidigt som möjligt. En viktig uppgift är att välja ett unikt namn för Azure-lagringskontot.

Du bestämmer dig för att lösa det här problemet genom att skapa ett uttryck med hjälp av ARM-mallfunktioner.

Vad är ARM-mallfunktioner?

ARM-mallfunktioner gör ARM-mallen mer flexibel genom att hämta värden dynamiskt under distributionen.

För att förstå funktioner måste du förstå uttryck. Uttryck är värden som utvärderas när mallen distribueras. De börjar och slutar med hakparenteser []och kan returnera en sträng, ett heltal, booleskt värde, en matris eller ett objekt.

I föregående modul i den här utbildningsvägen har du redan arbetat med uttryck i Resource Manager-mallen. Du använde till exempel:

"parameters": {
  "location": {
    "type": "string",
    "defaultValue": "[resourceGroup().location]"
  }
},

Uttrycket är defaultValue:-attributets värde. Observera att det här uttrycket innehåller funktionenresourceGroup() ARM-mall. Den här funktionen returnerar information om resursgruppen som den här mallen distribuerar till. .location hämtar en egenskap från objektet som returneras av funktionen. Med funktioner kan du skapa de värden som du behöver dynamiskt.

Hur gör jag för att arbeta med funktioner i ARM-mallar?

Det finns några regler som du måste följa när du arbetar med funktioner:

  • Använd enkla citattecken när du skickar ett strängvärde till en funktion. Här följer ett exempel: concat('storage',uniqueString(resourceGroup().id)). Funktionen är concat, och strängen som du skickar in till funktionen är 'storage'.

  • När du arbetar med literalvärden i mallfunktioner måste du använda escape-tecken. Escape-tecknet varierar beroende på vad du använder det för.

  • Om du vill ange en egenskap till null kan du använda null eller [json('null')]. JSON-funktionen returnerar ett tomt objekt när du anger null som parameter.

    "stringValue": null,
    "objectValue": "[json('null')]"
    

Med Resource Manager har du tillgång till flera ARM-mallar. Funktionerna visas i grupper baserat på deras typ:

  • Matrisfunktioner för att arbeta med matriser. Till exempel first och last.
  • Jämförelsefunktioner för att göra jämförelser i mallar. Till exempel equals och greater.
  • Datumfunktioner för att arbeta med datum. Till exempel utcNow och dateTimeAdd.
  • Funktioner för distributionsvärden för att hämta värden från avsnitt i mallen och värden relaterade till distributionen. Till exempel environment och parameters.
  • Logiska funktioner för att arbeta med logiska villkor. Till exempel if och not.
  • Numeriska funktioner för att arbeta med heltal. Till exempel max och mod.
  • Objektfunktioner för att arbeta med objekt. Till exempel contains och length.
  • Resursfunktioner för att hämta resursvärden. Till exempel resourceGroup och subscription.
  • Strängfunktioner för att arbeta med strängar. Till exempel length och startsWith.

Hur kan jag använda flera funktioner i samma uttryck?

Du kan använda flera mallfunktioner tillsammans för att skapa egna uttryck. I det här scenariot måste du skapa ett uttryck som skapar ett unikt namn för varje resursgrupp genom att kombinera ett angivet prefix med en hash-sträng för resursgruppens ID. Det här uttrycket resulterar i lagringskontonamn som dev2hu6fktr577wh och staging5his8hgr67tt5. Du kan skapa det här strängvärdet med fyra funktioner. Till exempel:

"[toLower(concat('Storage',uniqueString(resourceGroup().id)))]"

Nu ska vi titta närmare på uttrycket.

Från och med concat tar den här funktionen valfritt antal argument och kan acceptera antingen strängar eller matriser för parametrarna. Här använder du en literalsträng, "Storage", och sammanfogar den med resultatet från en annan funktion, uniqueString. Funktionen uniqueString skapar en deterministisk hash-sträng baserat på parametrarna. I det här uttrycket skapar du en hash-sträng av den aktuella resursgruppens ID med hjälp av en annan funktion, resourceGroup.

Här är utdata från det vi har diskuterat hittills:

Picture of a string created by concatenating the word Storage with a 13-character hash that contains both uppercase and lowercase letters.

Namngivningskonventionerna kräver att strängen endast innehåller gemener. Här lägger du till funktionen toLower som outer-funktionen.

Så här ser den resulterande strängen ut:

Picture of a string created by concatenating the word Storage with a 13-character hash, and then converting all letters to lowercase.