Esercizio - Convertire le risorse ed eseguirne la migrazione
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.
Accedere al portale di Azure.
Nella home page di Azure, in Servizi di Azure, seleziona Crea una risorsa:
Azure Marketplace viene visualizzato nel riquadro Crea una risorsa.
In Ubuntu Server 20.04 LTS selezionare Crea:
Importante
Se Ubuntu Server 20.04 LTS non viene visualizzato, passa direttamente a Ubuntu Server 20.04 LTS in Azure Marketplace.
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 Nella scheda Gestione assicurarsi che l'opzione Abilita arresto automatico non sia selezionata.
Selezionare Rivedi e crea. Azure convalida le impostazioni. Potrebbe essere necessario immettere o selezionare altre informazioni in base ai requisiti dell'immagine.
Selezionare Crea per distribuire e creare la macchina virtuale.
Il portale di Azure mostra la distribuzione mentre è in corso.
Al termine della distribuzione, seleziona il nome del gruppo di risorse per aprirlo:
Il gruppo di risorse contiene ora la macchina virtuale e le relative dipendenze:
Esportare il contenuto del gruppo di risorse in un modello JSON
Nel menu a sinistra, in Automazione, seleziona Esporta modello:
Viene generato un modello JSON. Il completamento del processo potrebbe richiedere qualche minuto.
Seleziona il pulsante Scarica:
Il modello JSON e il file dei parametri vengono scaricati nel computer come file .zip.
Decomprimere il file in una cartella a cui è possibile accedere facilmente, ad esempio il desktop.
Aprire Visual Studio Code.
Preparare l'ambiente locale
Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.
Se la shell visualizzata sul lato destro della finestra del terminale è bash, significa che è aperta la shell corretta ed è possibile passare alla sezione successiva.
Se viene visualizzata una shell diversa da bash, selezionare la freccia a discesa della shell e quindi selezionare Azure Cloud Shell (Bash).
Nell'elenco delle shell del terminale selezionare bash.
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
Dal menu Terminale scegliere Nuovo terminale. La finestra del terminale si apre solitamente nella parte inferiore della schermata.
Se la shell visualizzata sul lato destro della finestra del terminale è PowerShell o pwsh, la shell corretta è aperta ed è possibile passare alla sezione successiva.
Se viene visualizzata una shell diversa da powershell o pwsh, selezionare l'elenco a discesa delle shell e quindi PowerShell.
Nell'elenco delle shell del terminale selezionare powershell o pwsh.
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
In Visual Studio Code crea un nuovo file denominato main.bicep.
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).
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).
- Selezionare la scheda main.bicep.
- Selezionare Visualizzare>Editor Layout>Dividere a destra per aprire la scheda main.bicep nel riquadro destro.
- Chiudere la scheda main.bicep nel riquadro sinistro.
Copiare ogni elemento nel nuovo file Bicep
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.Visual Studio Code indica un errore perché manca il parametro
networkSecurityGroups_ToyTruckServer_nsg_name
:Copiare il parametro nel file main.bicep.
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
Nel portale di Azure aprire il gruppo di risorse ToyTruck.
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: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.