Aggiornare una risorsa in un modello di Azure Resource Manager
Quando è necessario aggiornare una risorsa durante una distribuzione, ad esempio quando non è possibile specificare tutte le proprietà per una risorsa fino a quando non vengono create altre risorse dipendenti. Ad esempio, se si crea un pool di back-end per un bilanciamento del carico, si potrebbero aggiornare le interfacce di rete (NIC) nelle macchine virtuali (VM) per includerle nel pool di back-end. Resource Manager supporta l'aggiornamento delle risorse durante la distribuzione, ma è necessario progettare correttamente il modello per evitare errori e assicurarsi che la distribuzione venga gestita come aggiornamento.
Quando si crea una risorsa e la si aggiorna in un secondo momento, si fa riferimento due volte. Si fa riferimento prima al modello che lo crea. In seguito, quando si aggiorna la risorsa, si fa riferimento allo stesso nome. Tuttavia, se due risorse hanno lo stesso nome in un modello, Resource Manager genera un'eccezione. Per evitare questo errore, specificare la risorsa aggiornata in un secondo modello collegato o incluso come sottotemplate che usa il Microsoft.Resources/deployments
tipo di risorsa.
Nel secondo modello è necessario specificare il nome della proprietà da modificare o un nuovo nome per aggiungere una proprietà. È anche necessario specificare i nomi e i valori originali delle proprietà che non cambiano. Se non è possibile specificare una o più delle proprietà originali, Resource Manager presuppone che si voglia creare una nuova risorsa ed eliminare quella originale.
Modello di esempio
Esaminiamo un modello di esempio che illustra la tecnica. Il modello distribuisce una rete virtuale denominata con una subnet denominata firstVNet
firstSubnet
. Distribuisce quindi un'interfaccia di rete virtuale denominata nic1
e associa la scheda di interfaccia di rete alla subnet. Una risorsa di distribuzione denominata updateVNet
include un modello annidato che viene aggiornato firstVNet
aggiungendo una seconda subnet denominata secondSubnet
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"resources": [
{
"apiVersion": "2020-05-01",
"name": "firstVNet",
"location": "[resourceGroup().location]",
"type": "Microsoft.Network/virtualNetworks",
"properties": {
"addressSpace": {
"addressPrefixes": [
"10.0.0.0/22"
]
},
"subnets": [
{
"name": "firstSubnet",
"properties": {
"addressPrefix": "10.0.0.0/24"
}
}
]
}
},
{
"apiVersion": "2020-05-01",
"type": "Microsoft.Network/networkInterfaces",
"name": "nic1",
"location": "[resourceGroup().location]",
"dependsOn": [
"firstVNet"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', 'firstVNet', 'firstSubnet')]"
}
}
}
]
}
},
{
"apiVersion": "2020-06-01",
"type": "Microsoft.Resources/deployments",
"name": "updateVNet",
"dependsOn": [
"nic1"
],
"properties": {
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"parameters": {},
"variables": {},
"resources": [
{
"apiVersion": "2020-05-01",
"name": "firstVNet",
"location": "[resourceGroup().location]",
"type": "Microsoft.Network/virtualNetworks",
"properties": {
"addressSpace": "[reference('firstVNet').addressSpace]",
"subnets": [
{
"name": "[reference('firstVNet').subnets[0].name]",
"properties": {
"addressPrefix": "[reference('firstVNet').subnets[0].properties.addressPrefix]"
}
},
{
"name": "secondSubnet",
"properties": {
"addressPrefix": "10.0.1.0/24"
}
}
]
}
}
],
"outputs": {}
}
}
}
],
"outputs": {}
}
Considerare l'oggetto risorsa per la firstVNet
risorsa. Si noti che si specificano di nuovo le impostazioni per il firstVNet
modello in un modello annidato, ovvero perché Resource Manager non consente lo stesso nome di distribuzione nello stesso modello e i modelli annidati vengono considerati un modello diverso. Specificando di nuovo i valori per firstSubnet
la risorsa, viene indicato Resource Manager di aggiornare la risorsa esistente anziché eliminarla e ridistribuirla. Infine, le nuove impostazioni per secondSubnet
vengono prelevate durante l'aggiornamento.
Provare il modello
Un modello di esempio è disponibile in GitHub. Per distribuire il modello, eseguire questi comandi dell'interfaccia della riga di comando di Azure:
az group create --location <location> --name <resource-group-name>
az deployment group create -g <resource-group-name> \
--template-uri https://raw.githubusercontent.com/mspnp/template-examples/master/example1-update/deploy.json
Al termine della distribuzione, aprire il gruppo di risorse specificato nel portale. Viene visualizzata una rete virtuale denominata firstVNet
e una scheda di interfaccia di rete denominata nic1
. Fare clic su firstVNet
, quindi fare clic su subnets
. Viene visualizzato il firstSubnet
che è stato originariamente creato e viene visualizzato il secondSubnet
che è stato aggiunto nella risorsa updateVNet
.
Tornare quindi al gruppo di risorse e fare clic su nic1
e quindi su IP configurations
. Nella sezione IP configurations
il subnet
è impostato su firstSubnet (10.0.0.0/24)
.
L'originale firstVNet
è stato aggiornato anziché ricreato. Se firstVNet
fosse stato ricreato, nic1
non sarebbe associato a firstVNet
.
Passaggi successivi
- Azure Resource Manager
- Che cosa sono i modelli di Azure Resource Manager?
- Esercitazione: Creare e distribuire il primo modello di Resource Manager
- Esercitazione: Aggiungere una risorsa al modello di Azure Resource Manager
- Procedure consigliate per i modelli di Resource Manager
- Documentazione di Azure Resource Manager
- Documentazione dei modelli di Resource Manager