Exercice - Refactoriser le fichier Bicep
Dans l’exercice précédent, vous avez créé un fichier Bicep initial qui contient la machine virtuelle dédiée au camion jouet et les ressources associées. Le modèle Bicep ne suit cependant pas les bonnes pratiques et il est un peu difficile à lire. Dans cette unité, vous allez refactoriser le fichier.
Au cours du processus de refactorisation, vous allez :
- Mettre à jour les noms symboliques pour vos ressources et vos paramètres.
- Supprimer les paramètres, les ressources et les propriétés redondants.
- Ajouter des variables et des paramètres pour rendre votre fichier Bicep réutilisable.
Mettre à jour les noms symboliques des ressources
Dans Visual Studio Code, ouvrez le fichier main.bicep.
Sélectionnez le nom symbolique de la ressource de groupe de sécurité réseau, qui est
networkSecurityGroups_ToyTruckServer_nsg_name_resource
ou un nom similaire.Renommez le nom symbolique. Vous pouvez sélectionner F2 ou cliquez avec le bouton droit, puis sélectionnez Renommer le symbole.
Entrez le nom
networkSecurityGroup
, puis appuyez sur Entrée. Visual Studio Code met à jour le nom et toutes les références dans le fichier.Répétez ce processus pour chaque ressource. Renommez les ressources comme illustré dans le tableau suivant.
Remarque
Les noms des ressources dans votre déploiement seront légèrement différents des noms du tableau. Recherchez les ressources dont le nom est proche de ces noms.
Type de ressource Nom symbolique actuel Nouveau nom symbolique Adresse IP publique publicIPAddresses_ToyTruckServer_ip_name_resource
publicIPAddress
Machine virtuelle virtualMachines_ToyTruckServer_name_resource
virtualMachine
Réseau virtuel virtualNetworks_ToyTruck_vnet_name_resource
virtualNetwork
Subnet virtualNetworks_ToyTruck_vnet_name_default
defaultSubnet
interface réseau networkInterfaces_toytruckserver890_name_resource
networkInterface
Supprimer la ressource de sous-réseau redondante
Le sous-réseau du réseau virtuel est actuellement défini deux fois. Il est défini une fois dans la ressource virtualNetwork
et une fois comme sa propre ressource enfant nommée defaultSubnet
. Cela n’a aucun intérêt de définir le sous-réseau deux fois.
Supprimez la ressource
defaultSubnet
.Notez que la ressource
networkInterface
signale maintenant un problème parce qu’elle fait référence à l’ID de ressource du sous-réseau par défaut :Mettez à jour la ressource
virtualNetwork
de façon à inclure une référenceexisting
au sous-réseau. Si vous ajoutez la référenceexisting
, vous pouvez faire à nous référence au sous-réseau dans votre code Bicep sans le redéfinir :resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-05-01' = { name: virtualNetworks_ToyTruck_vnet_name location: 'westus' properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: 'default' properties: { addressPrefix: '10.0.0.0/24' delegations: [] privateEndpointNetworkPolicies: 'Enabled' privateLinkServiceNetworkPolicies: 'Enabled' } } ] virtualNetworkPeerings: [] enableDdosProtection: false } resource defaultSubnet 'subnets' existing = { name: 'default' } }
Mettez à jour la ressource
networkInterface
de façon à faire référence à l’ID de ressource du sous-réseau :resource networkInterface 'Microsoft.Network/networkInterfaces@2024-05-01' = { name: networkInterfaces_toytruckserver890_name location: 'westus3' properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { privateIPAddress: '10.0.0.4' privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: publicIPAddress.id } subnet: { id: virtualNetwork::defaultSubnet.id } primary: true privateIPAddressVersion: 'IPv4' } } ] dnsSettings: { dnsServers: [] } enableAcceleratedNetworking: true enableIPForwarding: false disableTcpStateTracking: false networkSecurityGroup: { id: networkSecurityGroup.id } nicType: 'Standard' } }
Vous remarquez une erreur indiquant que l’expression est impliquée dans un cycle. Vous corrigerez cela à l’étape suivante.
Accédez à la propriété
subnets
de la ressourcevirtualNetwork
et supprimezid: defaultSubnet.id
pour résoudre l’erreur.
Changer les paramètres en variables
Les paramètres dans le modèle n’ont pas besoin d’être des paramètres. Vous allez maintenant renommer les paramètres en noms plus explicites et les convertir en variables.
Sélectionnez le nom symbolique pour le paramètre
virtualNetworks_ToyTruck_vnet_name
. Renommez-levirtualNetworkName
.Changez le paramètre en une variable. N’oubliez pas de supprimer le type parce que les définitions de variables n’incluent pas les types :
var virtualNetworkName = 'ToyTruck-vnet'
Répétez le processus pour chaque paramètre. Renommez les paramètres comme indiqué dans le tableau suivant.
Notez que la valeur de
networkInterfaceName
comprend un nombre à trois chiffres. Le nombre diffère pour les différents déploiements. Veillez à copier la valeur de la variable à partir de votre modèle de référence.Nom actuel du paramètre Nom de la nouvelle variable virtualMachines_ToyTruckServer_name
virtualMachineName
networkInterfaces_toytruckserver890_name
networkInterfaceName
publicIPAddresses_ToyTruckServer_ip_name
publicIPAddressName
networkSecurityGroups_ToyTruckServer_nsg_name
networkSecurityGroupName
Vérifiez que vos déclarations de variables ressemblent à l’exemple suivant :
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg'
Mettre à jour les emplacements des ressources
Toutes les ressources utilisent actuellement un emplacement codé en dur. Vous allez maintenant ajouter un paramètre pour améliorer la réutilisation du modèle.
En haut du fichier, ajoutez un nouveau paramètre et un élément décoratif de description pour clarifier l’objectif du paramètre :
@description('The location where resources are deployed.') param location string = resourceGroup().location
Mettez à jour chaque ressource de façon à ce qu’elle utilise le paramètre
location
au lieu de l’emplacementwestus3
codé en dur.
Ajouter des paramètres et des variables
Votre modèle contient des valeurs codées en dur, là où des paramètres ou des variables seraient plus appropriés. Vous allez maintenant ajouter des paramètres pour les propriétés susceptibles de changer entre les déploiements et des variables pour les valeurs qui ne changeront pas.
En haut du fichier main.bicep, sous le paramètre
location
, ajoutez les paramètres suivants :@description('The name of the size of the virtual machine to deploy.') param virtualMachineSizeName string = 'Standard_D2s_v3' @description('The name of the storage account SKU to use for the virtual machine\'s managed disk.') param virtualMachineManagedDiskStorageAccountType string = 'Premium_LRS' @description('The administrator username for the virtual machine.') param virtualMachineAdminUsername string = 'toytruckadmin' @description('The administrator password for the virtual machine.') @secure() param virtualMachineAdminPassword string @description('The name of the SKU of the public IP address to deploy.') param publicIPAddressSkuName string = 'Standard' @description('The virtual network address range.') param virtualNetworkAddressPrefix string @description('The default subnet address range within the virtual network') param virtualNetworkDefaultSubnetAddressPrefix string
Certains des paramètres ont des valeurs par défaut et d’autres non. Plus tard, vous allez créer un fichier de paramètres pour définir la plupart de ces valeurs.
Ajoutez les nouvelles déclarations de variables suivantes sous la variable
networkSecurityGroupName
:var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' }
Ajoutez la déclaration de variable suivante. Remplacez la valeur par le nom de disque du système d’exploitation provenant de votre propre modèle de référence.
var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
La valeur de
virtualMachineOSDiskName
est unique. La valeur diffère pour chaque déploiement. Veillez à copier la valeur de la variable à partir de votre modèle de référence.Avertissement
Veillez à copier correctement les bonnes valeurs pour les variables
virtualMachineOSDiskName
etnetworkInterfaceName
. Sinon, Azure ne détecte pas que vous déclarez des ressources existantes et risque d’essayer de créer de nouvelles ressources.Vos déclarations de variables doivent maintenant ressembler à cet exemple :
var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg' var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' } var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME'
Mettez à jour la ressource
publicIPAddress
pour faire référence à un paramètre :Propriété Paramètre sku.name
publicIPAddressSkuName
Mettez à jour la ressource
virtualMachine
de façon à faire référence aux paramètres et aux variables :Propriété Paramètre ou variable hardwareProfile.vmSize
virtualMachineSizeName
storageProfile.imageReference
virtualMachineImageReference
Utilisez le nom de la variable pour remplacer les valeurs de l’objet, notamment les accolades.storageProfile.osDisk.name
virtualMachineOSDiskName
storageProfile.osDisk.managedDisk.storageAccountType
virtualMachineManagedDiskStorageAccountType
osProfile.adminUsername
virtualMachineAdminUsername
osProfile.adminPassword
Ajoutez cette propriété sousosProfile.adminUsername
.virtualMachineAdminPassword
Mettez à jour la ressource
virtualNetwork
de façon à faire référence aux paramètres et aux variables :Propriété Paramètre ou variable addressSpace.addressPrefixes
virtualNetworkAddressPrefix
subnets.name
virtualNetworkDefaultSubnetName
subnets.addressPrefix
virtualNetworkDefaultSubnetAddressPrefix
Mettez à jour la ressource imbriquée
defaultSubnet
de la ressourcevirtualNetwork
:Propriété Variable name
virtualNetworkDefaultSubnetName
Supprimer les propriétés inutiles
Le processus d’exportation ajoute des propriétés redondantes à de nombreuses ressources. Effectuez les étapes suivantes pour supprimer les propriétés inutiles.
Dans la ressource
networkSecurityGroup
, supprimezproperties
car la propriétésecurityRules
est vide.Dans la ressource
publicIPAddress
, supprimez les propriétés suivantes :- La propriété
ipAddress
, car elle est automatiquement définie par Azure - La propriété
ipTags
car elle est vide
- La propriété
Dans la ressource
virtualMachine
, supprimez les propriétés suivantes :La propriété
storageProfile.osDisk.managedDisk.id
, car Azure la détermine automatiquement quand la machine virtuelle est déployéeImportant
Si vous ne supprimez pas cette propriété, votre modèle ne se déploie pas correctement.
La propriété
storageProfile.dataDisks
car elle est videLa propriété
osProfile.secrets
car elle est videLa propriété
osProfile.requireGuestProvisionSignal
car Azure la définit automatiquement
Dans la ressource
virtualNetwork
, supprimez les propriétés suivantes :- Les propriétés
delegations
etvirtualNetworkPeerings
car elles sont vides. - La ligne pour
type: 'Microsoft.Network/virtualNetworks/subnets'
- Les propriétés
Dans la ressource
networkInterface
, supprimez les propriétés suivantes :La propriété
kind
Dans
ipConfigurations
:id
,etag
,type
etprivateIPAddress
, car elle est automatiquement définie par Azure et la méthode d’allocation est DynamiqueÀ partir de
ipConfigurations.properties
:provisioningState
De
publicIPAddress
,name
,properties
,type
etsku
dnsSettings
car la propriétédnsServers
est vide
Conseil
Quand vous travaillez avec vos propres modèles, vous devez déterminer s’il existe des propriétés qui doivent être supprimées comme vous l’avez fait ici.
Dans Visual Studio Code, l’extension Bicep vous permet de définir les propriétés minimales pour une ressource. Quand vous ajoutez un espace après le signe égal dans la définition de la ressource, Visual Studio Code vous invite à sélectionner des propriétés obligatoires :
Quand vous sélectionnez required-properties, Visual Studio Code remplit la définition des ressources avec les propriétés qui sont obligatoires. Vous pouvez vous référer à required-properties pour déterminer si les propriétés de votre modèle converti doivent toutes être présentes.
Le référentiel Modèles de démarrage rapide Azure est également utile pour cette tâche. Recherchez un modèle de démarrage rapide qui fait à peu près ce que vous essayez de faire, puis examinez les propriétés qu’il définit sur la ressource.
Créer un fichier de paramètres
Vos paramètres sont actuellement définis comme valeurs par défaut dans votre modèle. Pour que votre modèle fonctionne bien dans tous les environnements, il est judicieux de créer un fichier de paramètres et de supprimer les valeurs par défaut des paramètres qui doivent changer pour chaque environnement.
Créez un fichier nommé main.parameters.production.json.
Collez le code JSON suivant dans le fichier main.parameters.production.json :
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "virtualMachineSizeName": { "value": "Standard_D2s_v3" }, "virtualMachineManagedDiskStorageAccountType": { "value": "Premium_LRS" }, "virtualMachineAdminUsername": { "value": "toytruckadmin" }, "virtualNetworkAddressPrefix": { "value": "YOUR-VIRTUAL-NETWORK-ADDRESS-PREFIX" }, "virtualNetworkDefaultSubnetAddressPrefix": { "value": "YOUR-SUBNET-ADDRESS-PREFIX" } } }
Mettez à jour les valeurs pour les paramètres
virtualNetworkAddressPrefix
etvirtualNetworkDefaultSubnetAddressPrefix
pour les faire correspondre aux plages d’adresses IP spécifiées dans la ressource de réseau virtuel de votre modèle de référence.Par exemple, voici comment les valeurs sont spécifiées dans un modèle de référence. Vos adresses IP peuvent être différentes des adresses IP qui sont utilisées dans cet exemple.
resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2024-05-01' = { name: virtualNetworks_ToyTruck_vnet_name location: 'westus3' properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: 'default' id: virtualNetworks_ToyTruck_vnet_name_default.id properties: { addressPrefix: '10.0.0.0/24' delegations: [] privateEndpointNetworkPolicies: 'Disabled' privateLinkServiceNetworkPolicies: 'Enabled' } type: 'Microsoft.Network/virtualNetworks/subnets' } ] virtualNetworkPeerings: [] enableDdosProtection: false } }
Mettez à jour votre fichier main.bicep en supprimant les valeurs par défaut des paramètres que vous avez spécifiées dans le fichier des paramètres.
virtualMachineSizeName
virtualMachineManagedDiskStorageAccountType
virtualMachineAdminUsername
Ne changez pas les valeurs par défaut pour les paramètres location
et publicIPAddressSkuName
, car elles sont probablement identiques pour tous vos environnements.
Vérification du modèle
À la fin de la phase de refactorisation, votre fichier main.bicep doit être similaire à l’exemple suivant :
@description('The location where resources are deployed.') param location string = resourceGroup().location @description('The name of the size of the virtual machine to deploy.') param virtualMachineSizeName string @description('The name of the storage account SKU to use for the virtual machine\'s managed disk.') param virtualMachineManagedDiskStorageAccountType string @description('The administrator username for the virtual machine.') param virtualMachineAdminUsername string @description('The administrator password for the virtual machine.') @secure() param virtualMachineAdminPassword string @description('The name of the SKU of the public IP address to deploy.') param publicIPAddressSkuName string = 'Standard' @description('The virtual network address range.') param virtualNetworkAddressPrefix string @description('The default subnet address range within the virtual network') param virtualNetworkDefaultSubnetAddressPrefix string var virtualNetworkName = 'ToyTruck-vnet' var virtualMachineName = 'ToyTruckServer' var networkInterfaceName = 'YOUR-NETWORK-INTERFACE-NAME' var publicIPAddressName = 'ToyTruckServer-ip' var networkSecurityGroupName = 'ToyTruckServer-nsg' var virtualNetworkDefaultSubnetName = 'default' var virtualMachineImageReference = { publisher: 'canonical' offer: '0001-com-ubuntu-server-focal' sku: '20_04-lts-gen2' version: 'latest' } var virtualMachineOSDiskName = 'YOUR-OS-DISK-NAME' resource networkSecurityGroup 'Microsoft.Network/networkSecurityGroups@2024-05-01' = { name: networkSecurityGroupName location: location } resource publicIPAddress 'Microsoft.Network/publicIPAddresses@2024-05-01' = { name: publicIPAddressName location: location sku: { name: publicIPAddressSkuName tier: 'Regional' } properties: { publicIPAddressVersion: 'IPv4' publicIPAllocationMethod: 'Static' idleTimeoutInMinutes: 4 } } resource virtualMachine 'Microsoft.Compute/virtualMachines@2024-07-01' = { name: virtualMachineName location: location properties: { hardwareProfile: { vmSize: virtualMachineSizeName } storageProfile: { imageReference: virtualMachineImageReference osDisk: { osType: 'Linux' name: virtualMachineOSDiskName createOption: 'FromImage' caching: 'ReadWrite' managedDisk: { storageAccountType: virtualMachineManagedDiskStorageAccountType } deleteOption: 'Delete' diskSizeGB: 30 } } osProfile: { computerName: virtualMachineName adminUsername: virtualMachineAdminUsername adminPassword: virtualMachineAdminPassword linuxConfiguration: { disablePasswordAuthentication: false provisionVMAgent: true patchSettings: { patchMode: 'ImageDefault' assessmentMode: 'ImageDefault' } enableVMAgentPlatformUpdates: false } allowExtensionOperations: true } networkProfile: { networkInterfaces: [ { id: networkInterface.id properties: { deleteOption: 'Detach' } } ] } diagnosticsProfile: { bootDiagnostics: { enabled: true } } } } resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-05-01' = { name: virtualNetworkName location: location properties: { addressSpace: { addressPrefixes: [ virtualNetworkAddressPrefix ] } subnets: [ { name: virtualNetworkDefaultSubnetName properties: { addressPrefix: virtualNetworkDefaultSubnetAddressPrefix privateEndpointNetworkPolicies: 'Disabled' privateLinkServiceNetworkPolicies: 'Enabled' } } ] enableDdosProtection: false } resource defaultSubnet 'subnets' existing = { name: virtualNetworkDefaultSubnetName } } resource networkInterface 'Microsoft.Network/networkInterfaces@2024-05-01' = { name: networkInterfaceName location: location properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: publicIPAddress.id } subnet: { id: virtualNetwork::defaultSubnet.id } primary: true privateIPAddressVersion: 'IPv4' } } ] enableAcceleratedNetworking: true enableIPForwarding: false disableTcpStateTracking: false networkSecurityGroup: { id: networkSecurityGroup.id } nicType: 'Standard' } }
Votre fichier main.parameters.production.json devrait être similaire au fichier suivant, même si vous avez probablement des plages d’adresses IP différentes :
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "virtualMachineSizeName": { "value": "Standard_D2s_v3" }, "virtualMachineManagedDiskStorageAccountType": { "value": "Premium_LRS" }, "virtualMachineAdminUsername": { "value": "toytruckadmin" }, "virtualNetworkAddressPrefix": { "value": "10.0.0.0/16" }, "virtualNetworkDefaultSubnetAddressPrefix": { "value": "10.0.0.0/24" } } }
Sélectionnez Afficher>Problèmes pour afficher le volet des problèmes.
Aucun problème n’est indiqué.
Conseil
Quand vous travaillez avec vos propres modèles, vous pouvez faire des choix différents quant aux propriétés à paramétrer et à d’autres personnalisations. Nous donnons dans tout ce module des recommandations générales pour vous aider à démarrer, mais vous devez prendre en compte votre propre environnement et la façon dont vous voulez réutiliser vos modèles quand vous décidez comment refactoriser vos propres fichiers Bicep.