Si jamais vous avez eu l'opportunité de travailler avec ARM Template (json files) vous savez de quoi je parle. On a suis l'agrandissement de Microsoft avec le format, dès le simple JSON file jusqu'aux actuels blueprints.

Le passage pour les Linkeds Templates c'était une 'révolution' aux moyens de faire le IaC.

Sinon, pour ceux que ne connaissent aussi très bien, on fait un résumé pour vous...

L'histoire...

L'Infrastructure as Code (IAC) est une façon de gérer l'infrascture en utilisant du code (et des outils) au lieu de CLI (Command Line Interfaces). La première fois à été faite par Amazon AWS pour la gestion de ses machines virtuelles, mais l'évolution c'était sûr. Microsoft et Heroku ont suivi bien que le reste du marché.

Microsoft, tout d'abord a lancé son ARM Template en utilisant JSON comme langage. Il était (e y'est encore) comme celui-ci:

Resource Manager template simplest structure

Le problème, au début, c'était qu’on ne pourrait que créer une ressource par fois et on n'avait pas des output. 

Imaginons un scénario en on voulait créer un site web et une base de données: On avait besoin de créer la BD avant, aller sur le ressource et prendre la connection string, par exemple. Et juste après ça que l'on pourrait créer notre site web (avec la connString de la BD).

En pensant à ça, Microsoft a publié les Linked Templates. Avec ça on avait la possibilité de lier les outputs d'un ARM Template avec le prochain, en créant une chaîne. Super!

Même avec ses limitations, l'ARM Template a fait son job. 

Au milieu de ça, Terraform est né et a changé le game. Plusieurs personnes ont trouvé ça plus facile de travailler avec un langage différent.

Microsoft a suivi le marché et elle a vu qu'elle avait besoin aussi d'un changement... et voici le BICEP!

BICEP

Bicep est un langage DSL (Domain Specific Language) pour le déploiement de ressources Azure de manière déclarative. Il vise à simplifier considérablement l'expérience de création avec une syntaxe plus propre et une meilleure prise en charge de la modularité et de la réutilisation du code. Bicep est une abstraction transparente sur les ARM Templates et ARM, ce qui signifie que tout ce qui peut être fait dans un modèle ARM peut être fait en biceps (en dehors des limitations temporaires connues). Tous les types de ressources, apiVersions et propriétés valides dans un modèle ARM sont également valides dans Bicep dès le premier jour.

 

Bicep se compile en fichiers JSON de modèle ARM standard, ce qui signifie que le JSON ARM est effectivement traité comme un langage intermédiaire (IL).

 

Il faut dire: C'est encore un langage expérimental!

 

Voici une comparaison entre un ARM Template et un BICEP:

 

BICEP file:

param location string = resourceGroup().location
param namePrefix string = 'stg'
param globalRedundancy bool = true

var storageAccountName = '${namePrefix}${uniqueString(resourceGroup().id)}'

resource stg 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: storageAccountName
  location: location
  kind: 'Storage'
  sku: {
      name: globalRedundancy ? 'Standard_GRS' : 'Standard_LRS'
  }
}

resource blob 'Microsoft.Storage/storageAccounts/blobServices/containers@2019-06-01' = {
  name: '${stg.name}/default/logs'
  // dependsOn will be added when the template is compiled
}


output storageId string = stg.id // output resourceId of storage account
output computedStorageName string = stg.name
output blobEndpoint string = stg.properties.primaryEndpoints.blob

 

ARM Template:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "namePrefix": {
      "type": "string",
      "defaultValue": "stg"
    },
    "globalRedundancy": {
      "type": "bool",
      "defaultValue": true
    }
  },
  "functions": [],
  "variables": {
    "storageAccountName": "[format('{0}{1}', parameters('namePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "kind": "Storage",
      "sku": {
        "name": "[if(parameters('globalRedundancy'), 'Standard_GRS', 'Standard_LRS')]"
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
      "apiVersion": "2019-06-01",
      "name": "[format('{0}/default/logs', variables('storageAccountName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ],
  "outputs": {
    "storageId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
    },
    "computedStorageName": {
      "type": "string",
      "value": "[variables('storageAccountName')]"
    },
    "blobEndpoint": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]"
    }
  }
}

 

 

Pour en savoir plus, suivez le GitHub du projet BICEP.

 

Salut à tous, n'hesitez pas de me poser de questions et à la prochaine!

 

Comments

Be the first to post a comment

Post a comment