Distribuzione condizionale nei modelli di ARM
A volte è necessario distribuire facoltativamente una risorsa in un modello di Azure Resource Manager (modello di ARM). Usare l'elemento condition
per specificare se la risorsa viene distribuita. Il valore della condizione viene risolto in true o false. Quando il valore è true, la risorsa viene creata. Quando il valore è false, la risorsa non viene creata. Il valore può essere applicato solo all'intera risorsa.
Nota
La distribuzione condizionale non si propaga alle risorse figlio. Per distribuire in modo condizionale una risorsa e le relative risorse figlio, è necessario applicare la stessa condizione a ogni tipo di risorsa.
Suggerimento
È consigliabile Bicep perché offre le stesse funzionalità dei modelli di ARM e la sintassi è più semplice da usare. Per saperne di più, vedi Distribuzioni condizionali.
Condizione di distribuzione
Puoi passare un valore di parametro che indica se una risorsa viene distribuita. L'esempio seguente distribuisce una zona DNS in modo condizionale.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"deployZone": {
"type": "bool"
}
},
"functions": [],
"resources": [
{
"condition": "[parameters('deployZone')]",
"type": "Microsoft.Network/dnsZones",
"apiVersion": "2018-05-01",
"name": "myZone",
"location": "global"
}
]
}
Per un esempio più complesso, vedi Server logico Azure SQL.
Risorsa nuova o esistente
È possibile usare la distribuzione condizionale per creare una nuova risorsa o usarne una esistente. L'esempio seguente mostra come distribuire un nuovo account di archiviazione o usare un account di archiviazione esistente.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
},
"newOrExisting": {
"type": "string",
"defaultValue": "new",
"allowedValues": [
"new",
"existing"
]
}
},
"resources": [
{
"condition": "[equals(parameters('newOrExisting'), 'new')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
},
{
"condition": "[equals(parameters('newOrExisting'), 'existing')]",
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-09-01",
"name": "[parameters('storageAccountName')]"
}
],
"outputs": {
"storageAccountId": {
"type": "string",
"value": "[if(equals(parameters('newOrExisting'), 'new'), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')))]"
}
}
}
Quando il parametro newOrExisting
è impostato su nuovo, la condizione restituisce true. L'account di archiviazione viene distribuito. In caso contrario, viene usato l'account di archiviazione esistente.
Per un modello di esempio completo che usa l'elemento condition
, vedere Macchina virtuale con una Rete virtuale nuova o esistente, archiviazione e indirizzo IP pubblico.
Funzioni di runtime
Se si usa la funzione reference o list con una risorsa distribuita in modo condizionale, la funzione viene valutata anche se la risorsa non viene distribuita. Se la funzione fa riferimento a una risorsa che non esiste, viene generato un errore.
Usare la funzione if per assicurarsi che la funzione venga valutata per le condizioni solo se la risorsa è distribuita. Vedi la funzione if per un modello di esempio che usa if
e reference
con una risorsa distribuita in modo condizionale.
Puoi impostare una risorsa come dipendente da una risorsa condizionale esattamente come qualsiasi altra risorsa. Quando una risorsa condizionale non viene distribuita, Azure Resource Manager la rimuove automaticamente dalle dipendenze necessarie.
Modalità completa
Se distribuisci un modello con modalità completa e una risorsa non viene distribuita perché condition
restituisce false, il risultato dipende dalla versione dell'API REST usata per distribuire il modello. Se si usa una versione precedente alla versione 2019-05-10, la risorsa non viene eliminata. Con la versione 2019-05-10 o successive la risorsa viene eliminata. Le versioni più recenti di Azure PowerShell e dell'interfaccia della riga di comando di Azure eliminano la risorsa quando la condizione è false.
Passaggi successivi
- Per un modulo Learn che spieghi la distribuzione condizionale, vedi Gestire distribuzioni cloud complesse usando le funzionalità avanzate dei modelli di ARM.
- Per elementi consigliati sulla creazione di modelli, vedi Procedure consigliate per i modelli di ARM.
- Per creare più istanze di una risorsa, vedi Iterazione delle risorse nei modelli di ARM.