Ejercicio: Conversión y migración de recursos
Importante
Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
Su empresa de juguetes ha adquirido un competidor que ha creado un popular camión de juguete. Los juguetes se conectan a una máquina virtual hospedada en Azure para recibir actualizaciones de firmware. Todos los recursos de la máquina virtual se crearon manualmente mediante Azure Portal. En esta unidad, comenzará el proceso de migración de los recursos a un archivo de Bicep.
Durante el proceso, hará estas tareas:
- Implementar una máquina virtual nueva con Azure Portal.
- Exportar los recursos de la máquina virtual a una plantilla JSON.
- Descompilar la plantilla JSON en Bicep.
- Cree un nuevo archivo de Bicep y mueva los recursos de la plantilla descompilada.
En este ejercicio se usa la extensión de Bicep para Visual Studio Code. Asegúrese de instalar esta extensión en Visual Studio Code.
Creación de una máquina virtual con Azure Portal
Para simular la situación del escenario de ejemplo, primero implementará una máquina virtual con Azure Portal.
Inicie sesión en Azure Portal.
En la página principal de Azure, en Servicios de Azure, seleccione Crear un recurso:
Azure Marketplace aparece en el panel Crear un recurso.
En Ubuntu Server 20.04 LTS, seleccione Crear:
Importante
Si no ve Ubuntu Server 20.04 LTS, vaya directamente a Ubuntu Server 20.04 LTS en Azure Marketplace.
En la pestaña Aspectos básicos, escriba los valores siguientes para cada opción. Use los valores predeterminados para el resto de configuraciones.
Configuración Valor Detalles del proyecto Resource group Seleccione Crear nuevo y escriba ToyTruck. Detalles de instancia Nombre de la máquina virtual ToyTruckServer Region (EE. UU.) Oeste de EE. UU. 3 Opciones de disponibilidad No se requiere redundancia de la infraestructura Imagen Ubuntu Server 20.04 LTS: x64 Gen2 Size Standard_D2s_v3 Cuenta de administrador Tipo de autenticación Contraseña Nombre de usuario toytruckadmin Contraseña Escriba una contraseña. Reglas de puerto de entrada Puertos de entrada públicos Ninguno En la pestaña Administración, asegúrese de que no esté seleccionada la opción Habilitar apagado automático.
Seleccione Revisar + crear. Azure valida la configuración. Es posible que tenga que escribir o seleccionar más información en función de los requisitos de la imagen.
Seleccione Crear para implementar y crear la máquina virtual.
Azure Portal muestra la implementación mientras está en curso.
Una vez finalizada la implementación, seleccione el nombre del grupo de recursos para abrirlo:
El grupo de recursos ahora contiene la máquina virtual y sus dependencias:
Exportación del contenido del grupo de recursos a una plantilla JSON
En el menú de la izquierda, en Automatización, seleccione Exportar plantilla:
Se genera una plantilla JSON. El proceso podría tardar uno o dos minutos en finalizar.
Seleccione el botón Descargar:
La plantilla JSON y el archivo de parámetros se descargan en su equipo como un archivo .zip.
Descomprima el archivo en una carpeta a la que pueda acceder fácilmente, como el escritorio.
Abra Visual Studio Code.
Preparación de su entorno local
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es Bash, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de Bash, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione Azure Cloud Shell (Bash).
En la lista de shells de terminal, seleccione Bash.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
cd templates
Instalación de Bicep
Ejecute el comando siguiente para asegurarse de que tiene la versión más reciente de Bicep:
az bicep install && az bicep upgrade
En el menú Terminal, seleccione Nuevo terminal. Normalmente, la ventana de terminal se abre en la mitad inferior de la pantalla.
Si el shell que se muestra en el lado derecho de la ventana de terminal es powershell o pwsh, el shell correcto está abierto y puede ir a la sección siguiente.
Si apareciera un shell distinto de powershell o pwsh, seleccione la flecha de la lista desplegable del shell y, a continuación, seleccione PowerShell.
En la lista de shells de terminal, seleccione powershell o pwsh.
En el terminal, vaya al directorio donde ha guardado la plantilla. Por ejemplo, si ha guardado la plantilla en la carpeta templates, puede usar este comando:
Set-Location -Path templates
Instalación de la CLI de Bicep
Para usar Bicep desde Azure PowerShell, instale la CLI de Bicep.
Descompilación de la plantilla JSON en Bicep
Use el comando decompile
para crear un archivo de Bicep a partir de la plantilla:
az bicep decompile --file template.json
La operación de descompilación genera una advertencia similar a esta:
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.
Use el comando decompile
para crear un archivo de Bicep a partir de la plantilla:
bicep decompile template.json
La operación de descompilación genera una advertencia similar a esta:
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.
Inspección del archivo de Bicep descompilado
Abra el archivo template.bicep en Visual Studio Code y léalo. Tenga en cuenta que se trata de un archivo de Bicep válido, pero tiene algunos problemas, entre los que se incluyen los siguientes:
- Los nombres simbólicos asignados a los parámetros y los recursos incluyen caracteres de subrayado y no son fáciles de entender.
- La propiedad
location
está codificada de forma rígida en todas las definiciones de recursos. - La plantilla incluye valores codificados de forma rígida que deberían ser parámetros o que Azure debería establecer automáticamente.
Solucionará estos problemas en sucesivos apartados de este módulo.
Creación de un archivo de Bicep nuevo
En Visual Studio Code, cree un archivo denominado main.bicep.
Guarde el archivo vacío para que Visual Studio Code cargue las herramientas de Bicep.
Puede seleccionar Archivo>Guardar como o Ctrl+S en Windows (⌘+S en macOS).
Divida el editor para que pueda ver ambos archivos al mismo tiempo (el archivo template.bicep en el panel izquierdo y el archivo main.bicep en el panel derecho).
- Seleccione la pestaña main.bicep.
- Seleccione Ver>Diseño del editor>Dividir a la derecha para abrir la pestaña main.bicep en el panel de la derecha.
- Cierre la pestaña main.bicep en el panel izquierdo.
Copia de cada elemento en el nuevo archivo de Bicep
Copie el recurso denominado
networkSecurityGroups_ToyTruckServer_nsg_name_resource
del archivo template.bicep en el archivo main.bicep.Mientras lo copia, tenga en cuenta que la propiedad
securityRules
está vacía. Más adelante en este módulo, refactorizará el archivo para quitar las propiedades redundantes.Visual Studio Code indica un error porque falta el parámetro
networkSecurityGroups_ToyTruckServer_nsg_name
:Copie el parámetro en el archivo main.bicep.
Repita el proceso con los siguientes recursos y sus parámetros asociados:
publicIPAddresses_ToyTruckServer_ip_name_resource
virtualMachines_ToyTruckServer_name_resource
virtualNetworks_ToyTruck_vnet_name_resource
virtualNetworks_ToyTruck_vnet_name_default
networkInterfaces_toytruckserver890_name_resource
Nota:
Los nombres de los recursos de su implementación pueden ser diferentes de los que se indican aquí. Busque los recursos que tengan nombres parecidos a estos.
Mientras copia cada recurso, inspeccione sus propiedades. Más adelante en este módulo, actualizará las propiedades y la configuración de cada recurso para que se ajusten a los procedimientos recomendados de Bicep.
Sugerencia
Al convertir o exportar sus propias plantillas, puede actualizar los recursos para que sigan los procedimientos recomendados a medida que los copia. En este módulo, actualizamos los recursos por separado para que sea más fácil entender cada fase del proceso de migración.
Comprobación de los recursos que faltan
En Azure Portal, abra el grupo de recursos ToyTruck.
Revise la lista de recursos y compárela con la del archivo de Bicep. Observe que el grupo de recursos contiene un recurso de Disk que no está definido como
resource
en el archivo de Bicep:Cuando se trabaja con máquinas virtuales en Bicep, no es necesario definir explícitamente el recurso de disco administrado. En vez de esto, usted define las propiedades de la máquina virtual y Azure crea automáticamente el disco administrado. En este ejemplo, no es necesario que se preocupe de que el recurso de disco no esté definido en el archivo de Bicep.
Comprobación de la plantilla
Al final de la fase de migración, su archivo main.bicep debería tener un aspecto similar al de este ejemplo:
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:
Algunas cosas pueden ser diferentes en su plantilla, incluidos algunos de los nombres simbólicos, las versiones de API y las direcciones IP. Eso está bien. Resolverá algunas de estas discrepancias más adelante en el módulo.
Acaba de crear un archivo de Bicep inicial para representar sus recursos. El archivo de Bicep no está bien estructurado y no sigue los procedimientos recomendados. En la siguiente unidad, obtendrá información sobre cómo mejorar la calidad de la plantilla migrada.
Sugerencia
Si usa un sistema de control de versiones como Git, este sería un buen momento para confirmar su trabajo.
Después de comprobar que el archivo main.bicep cierra el archivo template.bicep.