Tutorial: Información acerca de la gobernanza de máquinas virtuales Linux con la CLI de AzureTutorial: Learn about Linux virtual machine governance with Azure CLI

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.When deploying resources to Azure, you have tremendous flexibility when deciding what types of resources to deploy, where they are located, and how to set them up. Sin embargo, esa flexibilidad puede abrirle a más opciones que le gustaría permitir en su organización.However, that flexibility may open more options than you would like to allow in your organization. Cuando piensa en implementar recursos en Azure, tal vez se pregunte:As you consider deploying resources to Azure, you might be wondering:

  • ¿Cómo puedo cumplir los requisitos legales de soberanía de datos en determinados países o regiones?How do I meet legal requirements for data sovereignty in certain countries/regions?
  • ¿Cómo puedo controlar los costos?How do I control costs?
  • ¿Cómo puedo asegurarme de que alguien no modifique por error un sistema importante?How do I ensure that someone does not inadvertently change a critical system?
  • ¿Cómo puedo realizar un seguimiento de los costos de los recursos y facturarlos de forma precisa?How do I track resource costs and bill it accurately?

En este artículo se da respuesta a esas preguntas.This article addresses those questions. En concreto, puede:Specifically, you:

  • 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.Assign users to roles and assign the roles to a scope so users have permission to perform expected actions but not more actions.
  • Aplicar directivas que recomienden convenciones para los recursos de su suscripción.Apply policies that prescribe conventions for resources in your subscription.
  • Bloquear los recursos que son críticos para el sistema.Lock resources that are critical to your system.
  • Etiquetar recursos para que pueda realizar su seguimiento según los valores que encajan con su organización.Tag resources so you can track them by values that make sense to your organization.

Este artículo se centra en las tareas que se realizan para implementar el sistema de gobernanza.This article focuses on the tasks you take to implement governance. Para obtener una explicación más amplia de los conceptos, consulte Sistema de gobernanza en Azure.For a broader discussion of the concepts, see Governance in Azure.

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell le permite usar bash o PowerShell para trabajar con servicios de Azure.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To launch Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Probarlo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Probar no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Inicie Cloud Shell.Launch Cloud Shell.

  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.

  3. Pegue el código en la sesión de Cloud Shell con Ctrl+Mayús+V en Windows y Linux, o Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.

  4. Presione ENTRAR para ejecutar el código.Press Enter to run the code.

Si decide instalar y usar la CLI de Azure en el entorno local, en este tutorial es preciso que ejecute la versión 2.0.30 u otra posterior.If you choose to install and use Azure CLI locally, this tutorial requires that you're running the Azure CLI version 2.0.30 or later. Ejecute az --version para encontrar la versión.Run az --version to find the version. Si necesita instalarla o actualizarla, vea Instalación de la CLI de Azure.If you need to install or upgrade, see Install Azure CLI.

Descripción del ámbitoUnderstand scope

Antes de crear cualquier elemento, revisemos el concepto de ámbito.Before creating any items, let's review the concept of scope. Azure proporciona cuatro niveles de administración: grupo de administración, suscripción, grupo de recursos y recurso.Azure provides four levels of management: management groups, subscription, resource group, and resource. Los grupos de administración están en versión preliminar.Management groups are in a preview release. En la imagen siguiente se muestra un ejemplo de estos niveles:The following image shows an example of these layers.

Ámbito

Aplicará la configuración de administración en cualquiera de estos niveles de ámbito.You apply management settings at any of these levels of scope. El nivel que seleccione determina el grado de amplitud con que se aplica la configuración.The level you select determines how widely the setting is applied. Los niveles inferiores heredan la configuración de los niveles superiores.Lower levels inherit settings from higher levels. 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.When you apply a setting to the subscription, that setting is applied to all resource groups and resources in your subscription. Al aplicar una configuración al grupo de recursos, esa configuración se aplica al grupo de recursos y a todos sus recursos.When you apply a setting on the resource group, that setting is applied the resource group and all its resources. Sin embargo, otro grupo de recursos no tiene esa configuración.However, another resource group does not have that setting.

Normalmente, tiene sentido aplicar la configuración crítica en niveles superiores y los requisitos específicos del proyecto en niveles inferiores.Usually, it makes sense to apply critical settings at higher levels and project-specific requirements at lower levels. Por ejemplo, quizás quiera asegurarse de que todos los recursos de su organización se implementan en determinadas regiones.For example, you might want to make sure all resources for your organization are deployed to certain regions. Para lograr este requisito, aplique una directiva a la suscripción que especifique las ubicaciones permitidas.To accomplish this requirement, apply a policy to the subscription that specifies the allowed locations. Cuando otros usuarios de su organización agreguen nuevos grupos de recursos y recursos, se aplicarán automáticamente las ubicaciones permitidas.As other users in your organization add new resource groups and resources, the allowed locations are automatically enforced.

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.In this tutorial, you apply all management settings to a resource group so you can easily remove those settings when done.

Vamos a crear el grupo de recursos.Let's create that resource group.

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

Actualmente, el grupo de recursos está vacío.Currently, the resource group is empty.

Control de acceso basado en rolRole-based access control

Desea asegurarse de que los usuarios de una organización tengan el nivel adecuado de acceso a estos recursos.You want to make sure users in your organization have the right level of access to these resources. No desea conceder acceso ilimitado a los usuarios, pero también es necesario garantizar que puedan realizar su trabajo.You don't want to grant unlimited access to users, but you also need to make sure they can do their work. El control de acceso basado en rol le permite administrar los usuarios con permiso para completar acciones específicas en un ámbito.Role-based access control enables you to manage which users have permission to complete specific actions at a scope.

Para crear y quitar las asignaciones de rol, los usuarios deben tener acceso a Microsoft.Authorization/roleAssignments/*.To create and remove role assignments, users must have Microsoft.Authorization/roleAssignments/* access. Esta acción se concede mediante los roles Propietario o Administrador de acceso de usuario.This access is granted through the Owner or User Access Administrator roles.

Para administrar las soluciones de máquina virtual, hay tres roles específicos a los recursos, que normalmente proporcionan el acceso necesario:For managing virtual machine solutions, there are three resource-specific roles that provide commonly needed access:

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.Instead of assigning roles to individual users, it's often easier to use an Azure Active Directory group that has users who need to take similar actions. A continuación, asigne a ese grupo el rol apropiado.Then, assign that group to the appropriate role. 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.For this article, either use an existing group for managing the virtual machine, or use the portal to create an Azure Active Directory group.

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.After creating a new group or finding an existing one, use the az role assignment create command to assign the new Azure Active Directory group to the Virtual Machine Contributor role for the resource group.

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 Principal <guid> does not exist in the directory (La entidad de seguridad no existe en el directorio), el nuevo grupo no se ha propagado en Azure Active Directory.If you receive an error stating Principal <guid> does not exist in the directory, the new group hasn't propagated throughout Azure Active Directory. Intente ejecutar el comando de nuevo.Try running the command again.

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.Typically, you repeat the process for Network Contributor and Storage Account Contributor to make sure users are assigned to manage the deployed resources. En este artículo, puede omitir esos pasos.In this article, you can skip those steps.

Azure PolicyAzure Policy

Azure Policy ayuda a asegurarse de que todos los recursos de la suscripción satisfacen los estándares corporativos.Azure Policy helps you make sure all resources in subscription meet corporate standards. La suscripción ya tiene varias definiciones de directiva.Your subscription already has several policy definitions. Para ver las definiciones de directivas disponibles, use el comando az policy definition list:To see the available policy definitions, use the az policy definition list command:

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

Ve las definiciones de directiva existentes.You see the existing policy definitions. El tipo de directiva es BuiltIn o Custom.The policy type is either BuiltIn or Custom. Examine las definiciones para buscar las que describan una condición que quiera asignar.Look through the definitions for ones that describe a condition you want assign. En este artículo, puede asignar directivas que:In this article, you assign policies that:

  • Limite las ubicaciones para todos los recursos.Limit the locations for all resources.
  • Limite las SKU para las máquinas virtuales.Limit the SKUs for virtual machines.
  • Realice auditorías de las máquinas virtuales que no usen discos administrados.Audit virtual machines that don't use managed disks.

En el siguiente ejemplo, se recuperan tres definiciones de directivas en función del nombre para mostrar.In the following example, you retrieve three policy definitions based on the display name. Puede usar el comando az policy assignment create para asignar esas definiciones al grupo de recursos.You use the az policy assignment create command to assign those definitions to the resource group. En algunas directivas, puede proporcionar valores de los parámetros para especificar los valores permitidos.For some policies, you provide parameter values to specify the allowed values.

# 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.The preceding example assumes you already know the parameters for a policy. Si necesita ver los parámetros, use:If you need to view the parameters, use:

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

Implementación de la máquina virtualDeploy the virtual machine

Ha asignado roles y directivas, por lo que está listo para implementar la solución.You have assigned roles and policies, so you're ready to deploy your solution. El tamaño predeterminado es Standard_DS1_v2, que es una de las SKU permitidas.The default size is Standard_DS1_v2, which is one of your allowed SKUs. El comando crea claves SSH si aún no existen en una ubicación predeterminada.The command creates SSH keys if they don't exist in a default location.

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.After your deployment finishes, you can apply more management settings to the solution.

Bloqueo de recursosLock resources

Los bloqueos de recursos impiden que los usuarios de una organización eliminen o modifiquen de forma accidental recursos críticos.Resource locks prevent users in your organization from accidentally deleting or modifying critical resources. A diferencia del control de acceso basado en rol, los bloqueos de recursos aplican una restricción a todos los usuarios y roles.Unlike role-based access control, resource locks apply a restriction across all users and roles. Puede establecer el bloqueo de nivel en CanNotDelete o ReadOnly.You can set the lock level to CanNotDelete or ReadOnly.

Para crear o eliminar bloqueos de administración, debe tener acceso a las acciones Microsoft.Authorization/locks/*.To create or delete management locks, you must have access to Microsoft.Authorization/locks/* actions. Entre los roles integrados, solamente se conceden esas acciones al propietario y al administrador de acceso de usuarios.Of the built-in roles, only Owner and User Access Administrator are granted those actions.

Para bloquear la máquina virtual y el grupo de seguridad de red, use el comando az lock create:To lock the virtual machine and network security group, use the az lock create command:

# 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:To test the locks, try running the following command:

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.You see an error stating that the delete operation can't be completed because of a lock. Solo se puede eliminar el grupo de recursos si quita los bloqueos específicamente.The resource group can only be deleted if you specifically remove the locks. Ese paso se muestra en Limpieza de recursos.That step is shown in Clean up resources.

Etiquetado de recursosTag resources

Se aplican etiquetas a los recursos de Azure para organizarlos de forma lógica por categorías.You apply tags to your Azure resources to logically organize them by categories. Cada etiqueta consta de un nombre y un valor.Each tag consists of a name and a value. Por ejemplo, puede aplicar el nombre "Environment" y el valor "Production" a todos los recursos en producción.For example, you can apply the name "Environment" and the value "Production" to all the resources in production.

Para agregar dos etiquetas a un grupo de recursos, use el comando az group update:To add two tags to a resource group, use the az group update command:

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

Supongamos que desea agregar una tercera etiqueta.Let's suppose you want to add a third tag. Vuelva a ejecutar el comando con la nueva etiqueta.Run the command again with the new tag. Se anexa a las etiquetas existentes.It is appended to the existing tags.

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

Los recursos no heredan las etiquetas del grupo de recursos.Resources don't inherit tags from the resource group. Actualmente, el grupo de recursos tiene tres etiquetas pero los recursos no tienen ninguna.Currently, your resource group has three tags but the resources do not have any tags. 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:To apply all tags from a resource group to its resources, and retain existing tags on resources, use the following 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:Alternatively, you can apply tags from the resource group to the resources without keeping the existing tags:

# 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.To combine several values in a single tag, use a JSON string.

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

Para quitar todas las etiquetas de un grupo de recursos, use:To remove all tags on a resource group, use:

az group update -n myResourceGroup --remove tags

Para aplicar etiquetas a una máquina virtual, use el comando az resource tag.To apply tags to a virtual machine, use the az resource tag command. No se retiene ninguna etiqueta existente del recurso.Any existing tags on the resource aren't retained.

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

Búsqueda de recursos por etiquetaFind resources by tag

Para buscar recursos con un nombre y valor de etiqueta, use el comando az resource list:To find resources with a tag name and value, use the az resource list command:

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.You can use the returned values for management tasks like stopping all virtual machines with a tag value.

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 etiquetaView costs by tag values

Después de aplicar etiquetas a los recursos, puede ver los costos de los recursos con esas etiquetas.After applying tags to resources, you can view costs for resources with those tags. 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.It takes a while for cost analysis to show the latest usage, so you may not see the costs yet. 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.When the costs are available, you can view costs for resources across resource groups in your subscription. Los usuarios deben tener acceso de nivel de suscripción a la información de facturación para ver los costos.Users must have subscription level access to billing information to see the costs.

Para ver los costos por etiqueta en el portal, seleccione su suscripción y seleccione Análisis de costos.To view costs by tag in the portal, select your subscription and select Cost Analysis.

Análisis de costos

A continuación, filtre por el valor de etiqueta y seleccione Aplicar.Then, filter by the tag value, and select Apply.

Ver costo por etiqueta

También puede usar las API de facturación de Azure para ver los costos mediante programación.You can also use the Azure Billing APIs to programmatically view costs.

Limpieza de recursosClean up resources

El grupo de seguridad de red bloqueado no se puede eliminar hasta que se quite el bloqueo.The locked network security group can't be deleted until the lock is removed. Para quitar el bloqueo, recupere los ID de los bloqueos y proporcióneselos al comando az lock delete:To remove the lock, retrieve the IDs of the locks and provide them to the az lock delete command:

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.When no longer needed, you can use the az group delete command to remove the resource group, VM, and all related resources. Salga de la sesión SSH a la máquina virtual y, luego, elimine los recursos como se indica a continuación:Exit the SSH session to your VM, then delete the resources as follows:

az group delete --name myResourceGroup

Pasos siguientesNext steps

En este tutorial, ha creado una imagen de máquina virtual personalizada.In this tutorial, you created a custom VM image. Ha aprendido a:You learned how to:

  • Asignar un rol a los usuariosAssign users to a role
  • Aplicar directivas que hagan cumplir los estándaresApply policies that enforce standards
  • Proteger los recursos críticos con bloqueosProtect critical resources with locks
  • Etiquetar recursos para la facturación y la administraciónTag resources for billing and management

Avance al siguiente tutorial para obtener información sobre máquinas virtuales de alta disponibilidad.Advance to the next tutorial to learn about how highly available virtual machines.