Zum Hauptinhalt springen

Bicep

  • Vereinfachung der Erstellung einer Infrastruktur mit Hilfe von Code → Infrastructure-as-Code (IaC)

  • Domain-spezifische Sprache

  • nutzt deklarative Syntax, um Azure Ressourcen / eine bestimmte Cloud-Landschaft zu deployen

  • durch .bicep-Datei

  • Microsoft Learn - Bicep documentation - What is Bicep?

  • Aktionen des Azure Resource Manager durch .bicep-Datei

    • Ressourcen deployen, wenn man neue Komponenten in .bicep-Datei hinzufügt
    • Ressourcen umkonfigurieren, wenn sich Parameter ändern
    • Ressourcen löschen, wenn man Komponenten aus .bicep-Datei entfernt
  • vergleicht aktuellen Zustand der Azure-Ressourcen mit Zustand im Code → keine Zustandsverwaltung

  • Funktionsweise

    • automatische Konvertierung von Bicep zu JSON für Azure Resource Manager
    • Azure Resource Manager untersucht Unterschiede und behebt diese
  • Workflow

  • Bicep Plugin in Visual Studio Code

Installation

Version prüfen:

az bicep version

Installieren:

az bicep install

Aufbau .bicep-Datei

siehe Microsoft Learn Azure - Bicep documentation - Bicep file structure and syntax

@<decorator>(<argument>)
metadata <metadata-name> = ANY

targetScope = '<scope>'

@<decorator>(<argument>)
type <user-defined-data-type-name> = <type-expression>

@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>

// parameters that can be transfered through the deployment command
@<decorator>(<argument>)
param <parameter-name> <parameter-data-type> = <default-value>

@<decorator>(<argument>)
var <variable-name> = <variable-value>

// creation of a resource
@<decorator>(<argument>)
resource <resource-symbolic-name> '<resource-type>@<api-version>' = {
<resource-properties>
}

@<decorator>(<argument>)
module <module-symbolic-name> '<path-to-file>' = {
name: '<linked-deployment-name>'
params: {
<parameter-names-and-values>
}
}

@<decorator>(<argument>)
output <output-name> <output-data-type> = <output-value>

Resource Groups

  • benötigen targetScope-Einstellung (auf subscription), damit der Resource Group Name nicht mit anderen Azure-Benutzern kollidiert
    • subscription oder global
targetScope = 'subscription'

// param with default value
param location string = deployment().location
param name string

resource rg 'Microsoft.Resources/resourceGroups@2018-05-01' = {
location: location
name: name
}

Container Instance

param name string = 'azure-studle'
param location string = resourceGroup().location
param image string
param registry string
param username string

@secure()
param password string

resource containerGroups_azure_studle_name_resource 'Microsoft.ContainerInstance/containerGroups@2022-10-01-preview' = {
name: name
location: location
// ...
}

Deployment

Links

Vorgehen

  1. bei Azure CLI anmelden

    • lokal

      • per Browser anmelden
      az login
    • CI/CD

      • in automatisierten Skripts kann man sich nicht per Browser anmelden → Headless-Lösung für CI-Skripts
      • Vorgehen
        1. Service Principal auf Subscription-Scope mit Rolle Owner erstellen: az ad sp - Service Principal

        2. Output mit AppId, Passwort und Tenant merken

        3. mit Daten anmelden:

          az login --service-principal -u <app-id> -p <password> --tenant <tenant>
  2. Umgebung deployen

  • az deployment sub - Ressource in Subscription erstellen
  • az deployment group - Ressource in Resource Group erstellen
  • Parameter können mit --parameters value1=key1 value2=key2 übergeben werden

Beispiel:

az login --service-principal -u <app-id> -p <password> --tenant <tenant>
az deployment sub create --location switzerlandnorth --template-file template.bicep --parameters name=uek-210