Esercizio - Convertire le risorse ed eseguirne la migrazione

Completato

Importante

Per eseguire questo esercizio è necessario disporre di una propria sottoscrizione di Azure e questo potrebbe comportare dei costi. Se non hai ancora una sottoscrizione di Azure, crea un account gratuito prima di iniziare.

La società produttrice di giocattoli ha acquisito un concorrente che ha creato un camion giocattolo popolare. I giocattoli si connettono a una macchina virtuale che è ospitata in Azure per ricevere gli aggiornamenti del firmware. Tutte le risorse per la macchina virtuale sono state create manualmente usando il portale di Azure. In questa unità si inizierà il processo di migrazione delle risorse a un file Bicep.

Durante il processo, si eseguiranno le attività seguenti:

  • Distribuire una nuova macchina virtuale usando il portale di Azure.
  • Esportare le risorse della macchina virtuale in un modello JSON.
  • Decompilare il modello JSON in Bicep.
  • Creare un nuovo file Bicep e spostare le risorse dal modello decompilato.

In questo esercizio viene usata l'estensione Bicep per Visual Studio Code. Assicurarsi di installare questa estensione in Visual Studio Code.

Creare una macchina virtuale usando il portale di Azure

Per simulare la situazione nello scenario di esempio, si distribuirà prima di tutto una macchina virtuale usando il portale di Azure.

  1. Accedere al portale di Azure.

  2. Nella home page di Azure, in Servizi di Azure, seleziona Crea una risorsa:

    Screenshot che mostra il portale di Azure. L'opzione Crea una risorsa è evidenziata.

    Azure Marketplace viene visualizzato nel riquadro Crea una risorsa.

  3. In Ubuntu Server 20.04 LTS selezionare Crea:

    Screenshot che mostra Azure Marketplace. Il collegamento Crea in Ubuntu Server 20.04 LTS è evidenziato.

    Importante

    Se Ubuntu Server 20.04 LTS non viene visualizzato, passa direttamente a Ubuntu Server 20.04 LTS in Azure Marketplace.

  4. Nella scheda Informazioni di base immettere i valori indicati di seguito per ogni impostazione. Usa le impostazioni predefinite per tutte le altre impostazioni.

    Impostazione Valore
    Dettagli di progetto
    Gruppo di risorse Selezionare Crea nuovo e immettere ToyTruck
    Dettagli istanza
    Virtual machine name ToyTruckServer
    Area (Stati Uniti) Stati Uniti occidentali 3
    Opzioni di disponibilità La ridondanza dell'infrastruttura non è richiesta
    Immagine Ubuntu Server 20.04 LTS - x64 Gen2
    Dimensione Standard_D2s_v3
    Account amministratore
    Tipo di autenticazione Password
    Username toytruckadmin
    Password Immettere una password
    Regole porta in ingresso
    Porte in ingresso pubbliche None
  5. Nella scheda Gestione assicurarsi che l'opzione Abilita arresto automatico non sia selezionata.

  6. Selezionare Rivedi e crea. Azure convalida le impostazioni. Potrebbe essere necessario immettere o selezionare altre informazioni in base ai requisiti dell'immagine.

  7. Selezionare Crea per distribuire e creare la macchina virtuale.

    Il portale di Azure mostra la distribuzione mentre è in corso.

  8. Al termine della distribuzione, seleziona il nome del gruppo di risorse per aprirlo:

    Screenshot del portale di Azure che mostra la distribuzione. Il nome del gruppo di risorse è evidenziato.

    Il gruppo di risorse contiene ora la macchina virtuale e le relative dipendenze:

    Screenshot del portale di Azure con il gruppo di risorse visualizzato.

Esportare il contenuto del gruppo di risorse in un modello JSON

  1. Nel menu a sinistra, in Automazione, seleziona Esporta modello:

    Screenshot del portale di Azure che mostra la voce di menu Esporta modello nel riquadro del gruppo di risorse.

    Viene generato un modello JSON. Il completamento del processo potrebbe richiedere qualche minuto.

  2. Seleziona il pulsante Scarica:

    Screenshot del portale di Azure che mostra il modello JSON del gruppo di risorse esportato, con il pulsante Scarica evidenziato.

    Il modello JSON e il file dei parametri vengono scaricati nel computer come file .zip.

  3. Decomprimere il file in una cartella a cui è possibile accedere facilmente, ad esempio il desktop.

  4. Aprire Visual Studio Code.

Preparare l'ambiente locale

  1. Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.

  2. Se la shell visualizzata sul lato destro della finestra del terminale è bash, significa che è aperta la shell corretta ed è possibile passare alla sezione successiva.

    Screenshot della finestra del terminale di Visual Studio Code con l'opzione bash visualizzata.

  3. Se viene visualizzata una shell diversa da bash, selezionare la freccia a discesa della shell e quindi selezionare Azure Cloud Shell (Bash).

    Screenshot della finestra del terminale di Visual Studio Code, con l'elenco a discesa della shell del terminale e l'opzione Git Bash (predefinita) selezionata.

  4. Nell'elenco delle shell del terminale selezionare bash.

    Screenshot della finestra del terminale di Visual Studio Code con il terminale bash selezionato.

  5. Nel terminale passare alla directory in cui è stato salvato il modello. Se, ad esempio, il salvataggio del modello è stato eseguito nella cartella templates, è possibile usare questo comando:

    cd templates
    

Installare Bicep

Eseguire il comando seguente per assicurarsi che sia installata la versione più recente di Bicep:

az bicep install && az bicep upgrade
  1. Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.

  2. Se la shell visualizzata sul lato destro della finestra del terminale è PowerShell o pwsh, la shell corretta è aperta ed è possibile passare alla sezione successiva.

    Screenshot della finestra del terminale di Visual Studio Code con l'opzione pwsh visualizzata nell'elenco a discesa della shell.

  3. Se viene visualizzata una shell diversa da powershell o pwsh, selezionare l'elenco a discesa delle shell e quindi PowerShell.

    Screenshot della finestra del terminale di Visual Studio Code, con l'elenco a discesa della shell del terminale visualizzato e PowerShell selezionato.

  4. Nell'elenco delle shell del terminale selezionare powershell o pwsh.

    Screenshot della finestra del terminale di Visual Studio Code con il terminale PowerShell selezionato.

  5. Nel terminale passare alla directory in cui è stato salvato il modello. Se, ad esempio, il salvataggio del modello è stato eseguito nella cartella templates, è possibile usare questo comando:

    Set-Location -Path templates
    

Installare l'interfaccia della riga di comando di Bicep

Per usare Bicep da Azure PowerShell, installare l'interfaccia della riga di comando di Bicep.

Decompilare il modello JSON in Bicep

Usa il comando decompile per creare un file Bicep dal modello:

az bicep decompile --file template.json

L'operazione di decompilazione genera un avviso simile al seguente:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Usa il comando decompile per creare un file Bicep dal modello:

bicep decompile template.json

L'operazione di decompilazione genera un avviso simile al seguente:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Esaminare il file Bicep decompilato

Apri il file template.bicep in Visual Studio Code e leggilo. Si noti che si tratta di un file Bicep valido, ma presenta alcuni problemi, tra cui:

  • I nomi simbolici assegnati ai parametri e alle risorse includono caratteri di sottolineatura e non sono facili da comprendere.
  • La proprietà location è hardcoded in tutte le definizioni di risorsa.
  • Il modello include valori hardcoded che devono essere parametri o devono essere impostati automaticamente da Azure.

Questi problemi verranno risolti nel resto di questo modulo.

Creare un nuovo file Bicep

  1. In Visual Studio Code crea un nuovo file denominato main.bicep.

  2. Salvare il file vuoto in modo che Visual Studio Code possa caricare gli strumenti di Bicep.

    Puoi selezionare File>Salva con nome oppure premere CTRL+S in Windows (⌘+S in macOS).

  3. Dividi l'editor in modo che sia possibile visualizzare entrambi i file contemporaneamente (il file template.bicep nel riquadro sinistro e il file main.bicep nel riquadro destro).

    1. Selezionare la scheda main.bicep.
    2. Selezionare Visualizzare>Editor Layout>Dividere a destra per aprire la scheda main.bicep nel riquadro destro.
    3. Chiudere la scheda main.bicep nel riquadro sinistro.

    Screenshot dell'editor di Visual Studio Code, che mostra il file template.bicep nel riquadro sinistro e il file main.bicep nel riquadro destro.

Copiare ogni elemento nel nuovo file Bicep

  1. Copiare la risorsa denominata networkSecurityGroups_ToyTruckServer_nsg_name_resource dal file template.bicep nel file main.bicep.

    Durante la copia notare che la proprietà securityRules è vuota. Più avanti in questo modulo si effettuerà refactoring del file per rimuovere le proprietà ridondanti.

  2. Visual Studio Code indica un errore perché manca il parametro networkSecurityGroups_ToyTruckServer_nsg_name:

    Screenshot dell'editor di Visual Studio Code che mostra la risorsa migrata, con una descrizione comando che visualizza un errore a causa del parametro mancante.

    Copiare il parametro nel file main.bicep.

  3. Ripetere il processo con le risorse seguenti e i parametri associati:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Nota

    I nomi delle risorse nella distribuzione potrebbero essere diversi da quelli indicati in questa pagina. Trovare le risorse con nomi simili a tali nomi.

    Quando si copia ogni risorsa, esaminarne le proprietà. Più avanti in questo modulo si aggiorneranno le proprietà e la configurazione di ogni risorsa in modo che siano conformi alle procedure consigliate per Bicep.

    Suggerimento

    Quando si convertono o esportano modelli personalizzati, è possibile aggiornare le risorse in modo da seguire le procedure consigliate man mano che si esegue la copia. Nel presente modulo le risorse vengono aggiornate separatamente per semplificare la comprensione di ogni fase del processo di migrazione.

Verificare la presenza di risorse mancanti

  1. Nel portale di Azure aprire il gruppo di risorse ToyTruck.

  2. Esaminare l'elenco delle risorse e confrontarlo con l'elenco nel file Bicep. Si noti che il gruppo di risorse contiene una risorsa Disk non definita come resource nel file Bicep:

    Screenshot del portale di Azure che mostra il gruppo di risorse con la risorsa disco evidenziata.

    Quando si lavora con le macchine virtuali in Bicep, non è necessario definire in modo esplicito la risorsa disco gestito. Si definiscono invece le proprietà della macchina virtuale e Azure crea automaticamente il disco gestito. In questo esempio, non è necessario preoccuparsi del fatto che la risorsa disco non sia definita nel file Bicep.

Verificare il modello

Al termine della fase di migrazione, il file main.bicep dovrebbe essere simile al seguente:

param virtualNetworks_ToyTruck_vnet_name string = 'ToyTruck-vnet'
param virtualMachines_ToyTruckServer_name string = 'ToyTruckServer'
param networkInterfaces_toytruckserver154_name string = 'toytruckserver154'
param publicIPAddresses_ToyTruckServer_ip_name string = 'ToyTruckServer-ip'
param networkSecurityGroups_ToyTruckServer_nsg_name string = 'ToyTruckServer-nsg'

resource networkSecurityGroups_ToyTruckServer_nsg_name_resource 'Microsoft.Network/networkSecurityGroups@2022-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2022-05-01' = {
  name: publicIPAddresses_ToyTruckServer_ip_name
  location: 'westus3'
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    ipAddress: '1.2.3.4'
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
}

resource virtualMachines_ToyTruckServer_name_resource 'Microsoft.Compute/virtualMachines@2022-08-01' = {
  name: virtualMachines_ToyTruckServer_name
  location: 'westus3'
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    storageProfile: {
      imageReference: {
        publisher: 'canonical'
        offer: '0001-com-ubuntu-server-focal'
        sku: '20_04-lts-gen2'
        version: 'latest'
      }
      osDisk: {
        osType: 'Linux'
        name: '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81'
        createOption: 'FromImage'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
          id: resourceId('Microsoft.Compute/disks', '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81')
        }
        deleteOption: 'Delete'
        diskSizeGB: 30
      }
      dataDisks: []
    }
    osProfile: {
      computerName: virtualMachines_ToyTruckServer_name
      adminUsername: 'toytruckadmin'
      linuxConfiguration: {
        disablePasswordAuthentication: false
        provisionVMAgent: true
        patchSettings: {
          patchMode: 'ImageDefault'
          assessmentMode: 'ImageDefault'
        }
        enableVMAgentPlatformUpdates: false
      }
      secrets: []
      allowExtensionOperations: true
      requireGuestProvisionSignal: true
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaces_toytruckserver154_name_resource.id
          properties: {
            deleteOption: 'Detach'
          }
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
}

resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2022-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
  }
}

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  name: '${virtualNetworks_ToyTruck_vnet_name}/default'
  properties: {
    addressPrefix: '10.0.0.0/24'
    delegations: []
    privateEndpointNetworkPolicies: 'Disabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
  dependsOn: [
    virtualNetworks_ToyTruck_vnet_name_resource
  ]
}

resource networkInterfaces_toytruckserver154_name_resource 'Microsoft.Network/networkInterfaces@2022-05-01' = {
  name: networkInterfaces_toytruckserver154_name
  location: 'westus3'
  kind: 'Regular'
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
        etag: 'W/"6a38849d-bd59-4eae-856e-4909f7ac1fac"'
        type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
        properties: {
          provisioningState: 'Succeeded'
          privateIPAddress: '10.0.0.4'
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            name: 'ToyTruckServer-ip'
            id: publicIPAddresses_ToyTruckServer_ip_name_resource.id
            properties: {
              provisioningState: 'Succeeded'
              resourceGuid: '07079685-0980-4ddf-acc3-3c8797c94b9a'
              publicIPAddressVersion: 'IPv4'
              publicIPAllocationMethod: 'Dynamic'
              idleTimeoutInMinutes: 4
              ipTags: []
              ipConfiguration: {
                id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
              }
              deleteOption: 'Detach'
            }
            type: 'Microsoft.Network/publicIPAddresses'
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetworks_ToyTruck_vnet_name_default.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    dnsSettings: {
      dnsServers: []
    }
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroups_ToyTruckServer_nsg_name_resource.id
    }
    nicType: 'Standard'
  }
}

Nota

Alcuni elementi potrebbero essere diversi nel modello, inclusi alcuni nomi simbolici, le versioni API e gli indirizzi IP. Non ti preoccupare. Alcune di queste discrepanze verranno risolte più avanti nel modulo.

A questo punto è stato creato un file Bicep iniziale per rappresentare le risorse. Il file Bicep non è ben strutturato e non segue le procedure consigliate. Nell'unità successiva si apprenderà come migliorare la qualità del modello migrato.

Suggerimento

Se si usa un sistema di controllo della versione come Git, questo è un buon momento per eseguire il commit del lavoro.

Dopo aver verificato il file main.bicep, chiudere il file template.bicep.