Tutorial: Información acerca de la administración de máquinas virtuales Linux con la CLI de Azure

Al implementar recursos en Azure, dispone de una enorme flexibilidad a la hora de decidir qué tipos de recursos implementar, dónde se encuentran y cómo configurarlos. Sin embargo, esa flexibilidad puede abrirle a más opciones que le gustaría permitir en su organización. Cuando piensa en implementar recursos en Azure, tal vez se pregunte:

  • ¿Cómo puedo cumplir los requisitos legales de soberanía de datos en determinados países o regiones?
  • ¿Cómo puedo controlar los costos?
  • ¿Cómo puedo asegurarme de que alguien no modifique por error un sistema importante?
  • ¿Cómo puedo realizar un seguimiento de los costos de los recursos y facturarlos de forma precisa?

En este artículo se da respuesta a esas preguntas. En concreto, puede:

  • Asignar roles a los usuarios y asignar roles a un ámbito, de forma que los usuarios tengan permiso para realizar acciones esperadas, pero no más acciones.
  • Aplicar directivas que recomienden convenciones para los recursos de su suscripción.
  • Bloquear los recursos que son críticos para el sistema.
  • Etiquetar recursos para que pueda realizar su seguimiento según los valores que encajan con su organización.

Este artículo se centra en las tareas que se realizan para implementar el sistema de gobernanza. Para obtener una explicación más amplia de los conceptos, consulte Sistema de gobernanza en Azure.

Requisitos previos

  • Use el entorno de Bash en Azure Cloud Shell.

    Iniciar Cloud Shell en una nueva ventana

  • Si lo prefiere, instale la CLI de Azure para ejecutar sus comandos de referencia.

    • Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.

    • Cuando se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.

    • Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.

  • Este tutorial requiere la versión 2.0.30 de la CLI de Azure, o cualquier versión posterior. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

Descripción del ámbito

Antes de crear cualquier elemento, revisemos el concepto de ámbito. Azure proporciona cuatro niveles de administración: grupo de administración, suscripción, grupo de recursos y recurso. Los grupos de administración están en versión preliminar. En la imagen siguiente se muestra un ejemplo de estos niveles:

Ámbito

Aplicará la configuración de administración en cualquiera de estos niveles de ámbito. El nivel que seleccione determina el grado de amplitud con que se aplica la configuración. Los niveles inferiores heredan la configuración de los niveles superiores. Al aplicar una configuración a la suscripción, dicha configuración se aplica a todos los grupos de recursos y recursos de la suscripción. Al aplicar una configuración al grupo de recursos, esa configuración se aplica al grupo de recursos y a todos sus recursos. Sin embargo, otro grupo de recursos no tiene esa configuración.

Normalmente, tiene sentido aplicar la configuración crítica en niveles superiores y los requisitos específicos del proyecto en niveles inferiores. Por ejemplo, quizás quiera asegurarse de que todos los recursos de su organización se implementan en determinadas regiones. Para lograr este requisito, aplique una directiva a la suscripción que especifique las ubicaciones permitidas. Cuando otros usuarios de su organización agreguen nuevos grupos de recursos y recursos, se aplicarán automáticamente las ubicaciones permitidas.

En este tutorial, se aplica toda la configuración de administración a un grupo de recursos para poder quitar fácilmente esas opciones al finalizar.

Vamos a crear el grupo de recursos.

az group create --name myResourceGroup --location "East US"

Actualmente, el grupo de recursos está vacío.

Control de acceso basado en roles de Azure

Desea asegurarse de que los usuarios de una organización tengan el nivel adecuado de acceso a estos recursos. No desea conceder acceso ilimitado a los usuarios, pero también es necesario garantizar que puedan realizar su trabajo. El control de acceso basado en rol de Azure (Azure RBAC) le permite administrar los usuarios con permiso para completar acciones específicas en un ámbito.

Para crear y quitar las asignaciones de rol, los usuarios deben tener acceso a Microsoft.Authorization/roleAssignments/*. Esta acción se concede mediante los roles Propietario o Administrador de acceso de usuario.

Para administrar las soluciones de máquina virtual, hay tres roles específicos a los recursos, que normalmente proporcionan el acceso necesario:

En lugar de asignar roles a usuarios individuales, a menudo resulta más fácil usar un grupo de Azure Active Directory con usuarios que tienen que realizar acciones similares. A continuación, asigne a ese grupo el rol apropiado. Para este artículo puede usar un grupo existente para administrar la máquina virtual o el portal para crear un grupo de Azure Active Directory.

Después de crear un grupo o de buscar uno existente, use el comando az role assignment create para asignar el nuevo grupo de Azure Active Directory al rol Colaborador de la máquina virtual para el grupo de recursos.

adgroupId=$(az ad group show --group <your-group-name> --query objectId --output tsv)

az role assignment create --assignee-object-id $adgroupId --role "Virtual Machine Contributor" --resource-group myResourceGroup

Si recibe un error que indica que el guid> de <entidad de seguridad no existe en el directorio, el nuevo grupo no se ha propagado en Azure Active Directory. Intente ejecutar el comando de nuevo.

Por lo general, repetirá el proceso para Colaborador de la red y Colaborador de la cuenta de almacenamiento con el objetivo de asegurarse de que los usuarios se asignan para administrar los recursos implementados. En este artículo, puede omitir esos pasos.

Azure Policy

Azure Policy ayuda a asegurarse de que todos los recursos de la suscripción satisfacen los estándares corporativos. La suscripción ya tiene varias definiciones de directiva. Para ver las definiciones de directivas disponibles, use el comando az policy definition list:

az policy definition list --query "[].[displayName, policyType, name]" --output table

Ve las definiciones de directiva existentes. El tipo de directiva es BuiltIn o Custom. Examine las definiciones para buscar las que describan una condición que quiera asignar. En este artículo, puede asignar directivas que:

  • Limite las ubicaciones para todos los recursos.
  • Limite las SKU para las máquinas virtuales.
  • Realice auditorías de las máquinas virtuales que no usen discos administrados.

En el siguiente ejemplo, se recuperan tres definiciones de directivas en función del nombre para mostrar. Puede usar el comando az policy assignment create para asignar esas definiciones al grupo de recursos. En algunas directivas, puede proporcionar los valores de los parámetros para especificar los valores permitidos.

# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
locationDefinition=$(az policy definition list --query "[?displayName=='Allowed locations'].name | [0]" --output tsv)
skuDefinition=$(az policy definition list --query "[?displayName=='Allowed virtual machine SKUs'].name | [0]" --output tsv)
auditDefinition=$(az policy definition list --query "[?displayName=='Audit VMs that do not use managed disks'].name | [0]" --output tsv)

# Assign policy for allowed locations
az policy assignment create --name "Set permitted locations" \
  --resource-group myResourceGroup \
  --policy $locationDefinition \
  --params '{ 
      "listOfAllowedLocations": {
        "value": [
          "eastus", 
          "eastus2"
        ]
      }
    }'

# Assign policy for allowed SKUs
az policy assignment create --name "Set permitted VM SKUs" \
  --resource-group myResourceGroup \
  --policy $skuDefinition \
  --params '{ 
      "listOfAllowedSKUs": {
        "value": [
          "Standard_DS1_v2", 
          "Standard_E2s_v2"
        ]
      }
    }'

# Assign policy for auditing unmanaged disks
az policy assignment create --name "Audit unmanaged disks" \
  --resource-group myResourceGroup \
  --policy $auditDefinition

En el ejemplo anterior se da por hecho que ya conoce los parámetros de una directiva. Si necesita ver los parámetros, use:

az policy definition show --name $locationDefinition --query parameters

Implementación de la máquina virtual

Ha asignado roles y directivas, por lo que está listo para implementar la solución. El tamaño predeterminado es Standard_DS1_v2, que es una de las SKU permitidas. El comando crea claves SSH si aún no existen en una ubicación predeterminada.

az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --generate-ssh-keys

Una vez finalizada la implementación, puede aplicar más opciones de configuración de administración a la solución.

Bloqueo de recursos

Los bloqueos de recursos impiden que los usuarios de una organización eliminen o modifiquen de forma accidental recursos críticos. A diferencia del control de acceso basado en rol, los bloqueos de recursos aplican una restricción a todos los usuarios y roles. Puede establecer el bloqueo de nivel en CanNotDelete o ReadOnly.

Para crear o eliminar bloqueos de administración, debe tener acceso a las acciones Microsoft.Authorization/locks/*. Entre los roles integrados, solamente se conceden esas acciones al propietario y al administrador de acceso de usuarios.

Para bloquear la máquina virtual y el grupo de seguridad de red, use el comando az lock create:

# Add CanNotDelete lock to the VM
az lock create --name LockVM \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVM \
  --resource-type Microsoft.Compute/virtualMachines

# Add CanNotDelete lock to the network security group
az lock create --name LockNSG \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVMNSG \
  --resource-type Microsoft.Network/networkSecurityGroups

Para probar los bloqueos, intente ejecutar el siguiente comando:

az group delete --name myResourceGroup

Verá un error en el que se indica que la operación de eliminación no se puede realizar debido a un bloqueo. Solo se puede eliminar el grupo de recursos si quita los bloqueos específicamente. Ese paso se muestra en Limpieza de recursos.

Etiquetado de recursos

Se aplican etiquetas a los recursos de Azure para organizarlos de forma lógica por categorías. Cada etiqueta consta de un nombre y un valor. Por ejemplo, puede aplicar el nombre "Environment" y el valor "Production" a todos los recursos en producción.

Para agregar dos etiquetas a un grupo de recursos, use el comando az group update:

az group update -n myResourceGroup --set tags.Environment=Test tags.Dept=IT

Supongamos que desea agregar una tercera etiqueta. Vuelva a ejecutar el comando con la nueva etiqueta. Se anexa a las etiquetas existentes.

az group update -n myResourceGroup --set tags.Project=Documentation

Los recursos no heredan las etiquetas del grupo de recursos. Actualmente, el grupo de recursos tiene tres etiquetas pero los recursos no tienen ninguna. Para aplicar todas las etiquetas de un grupo de recursos a sus recursos y conservar las etiquetas existentes en los recursos, use el siguiente script:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Get the tags for this resource
  jsonrtag=$(az resource show --id $resid --query tags)
  
  # Reformat from JSON to space-delimited and equals sign
  rt=$(echo $jsonrtag | tr -d '"{},' | sed 's/: /=/g')
  
  # Reapply the updated tags to this resource
  az resource tag --tags $t$rt --id $resid
done

Como alternativa, puede aplicar las etiquetas desde el grupo de recursos a los recursos sin necesidad de mantener las etiquetas existentes:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Apply tags from resource group to this resource
  az resource tag --tags $t --id $resid
done

Para combinar varios valores en una única etiqueta, utilice una cadena JSON.

az group update -n myResourceGroup --set tags.CostCenter='{"Dept":"IT","Environment":"Test"}'

Para quitar todas las etiquetas de un grupo de recursos, use:

az group update -n myResourceGroup --remove tags

Para aplicar etiquetas a una máquina virtual, use el comando az resource tag. No se retiene ninguna etiqueta existente del recurso.

az resource tag -n myVM \
  -g myResourceGroup \
  --tags Dept=IT Environment=Test Project=Documentation \
  --resource-type "Microsoft.Compute/virtualMachines"

Búsqueda de recursos por etiqueta

Para buscar recursos con un nombre y valor de etiqueta, use el comando az resource list:

az resource list --tag Environment=Test --query [].name

Puede utilizar los valores devueltos para las tareas de administración, como detener todas las máquinas virtuales con un valor de etiqueta.

az vm stop --ids $(az resource list --tag Environment=Test --query "[?type=='Microsoft.Compute/virtualMachines'].id" --output tsv)

Visualización de los costos por valores de etiqueta

Después de aplicar etiquetas a los recursos, puede ver los costos de los recursos con esas etiquetas. El análisis de costos tarda un tiempo en mostrar el uso más reciente, por lo que quizás no pueda ver los costos todavía. Cuando los costos están disponibles, puede ver los costos de los recursos a través de los grupos de recursos en su suscripción. Los usuarios deben tener acceso de nivel de suscripción a la información de facturación para ver los costos.

Para ver los costos por etiqueta en el portal, seleccione su suscripción y seleccione Análisis de costos.

Análisis de costos

A continuación, filtre por el valor de etiqueta y seleccione Aplicar.

Ver costo por etiqueta

También puede usar la información general sobre las API de consumo de Azure para ver los costos mediante programación.

Limpieza de recursos

El grupo de seguridad de red bloqueado no se puede eliminar hasta que se quite el bloqueo. Para quitar el bloqueo, recupere los ID de los bloqueos y proporcióneselos al comando az lock delete:

vmlock=$(az lock show --name LockVM \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Compute/virtualMachines \
  --resource-name myVM --output tsv --query id)
nsglock=$(az lock show --name LockNSG \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Network/networkSecurityGroups \
  --resource-name myVMNSG --output tsv --query id)
az lock delete --ids $vmlock $nsglock

Cuando ya no se necesiten, puede usar el comando az group delete para quitar el grupo de recursos, la máquina virtual y todos los recursos relacionados. Salga de la sesión SSH a la máquina virtual y, luego, elimine los recursos como se indica a continuación:

az group delete --name myResourceGroup

Pasos siguientes

En este tutorial, ha creado una imagen de máquina virtual personalizada. Ha aprendido a:

  • Asignar un rol a los usuarios
  • Aplicar directivas que hagan cumplir los estándares
  • Proteger los recursos críticos con bloqueos
  • Etiquetar recursos para la facturación y la administración

Avance al siguiente tutorial para aprender a identificar los cambios y administrar las actualizaciones de paquetes en una máquina virtual.