Tutorial: Saiba mais sobre o gerenciamento de máquinas virtuais do Linux com a CLI do Azure

Ao implantar recursos para o Azure, você terá uma enorme flexibilidade para decidir quais tipos de recursos implantar, onde estarão localizados e como configurá-los. No entanto, essa flexibilidade pode abrir mais opções que você desejaria permitir na sua organização. Ao considerar a implantação de recursos para o Azure, você deve estar se perguntando:

  • Como atender aos requisitos legais para a soberania de dados em determinados países/regiões?
  • Como controlar os custos?
  • Como garantir que alguém não altere inadvertidamente um sistema crítico?
  • Como fazer para rastrear os custos de recurso e cobrá-los com precisão?

Este artigo aborda essas questões. Especificamente, você:

  • Atribui usuários a funções e atribui funções a um escopo, de modo que os usuários tenham permissão para executar as ações esperadas, mas não ações adicionais.
  • Aplica políticas que prescrevem convenções para recursos em sua assinatura.
  • Bloqueia recursos que sejam críticos ao sistema.
  • Marca recursos para que possam ser rastreados por meio dos valores adequados à sua organização.

Este artigo concentra-se nas tarefas realizadas para implementar governança. Para uma discussão mais abrangente sobre os conceitos, consulte Governança no Azure.

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell.

    Inicie o Cloud Shell em uma nova janela

  • Se preferir, instale a CLI do Azure para executar comandos de referência da CLI.

    • Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para mais opções de entrada, confira Entrar com a CLI do Azure.

    • Quando solicitado, instale as extensões da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar extensões com a CLI do Azure.

    • Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.

  • Este tutorial requer a versão 2.0.30 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.

Compreender o escopo

Antes de criar qualquer item, vamos revisar o conceito de escopo. O Azure fornece quatro níveis de gerenciamento: grupos de gerenciamento, assinatura, grupo de recursos e recursos. Grupos de gerenciamento estão em uma versão prévia. A imagem a seguir mostra um exemplo dessas camadas.

Escopo

As configurações de gerenciamento são aplicadas em qualquer desses níveis de escopo. O nível que você seleciona determina o quão amplamente a configuração é aplicada. Os níveis inferiores herdam as configurações de níveis superiores. Ao aplicar uma configuração à assinatura, essa configuração será aplicada a todos os grupos de recursos e recursos em sua assinatura. Ao aplicar uma configuração no grupo de recursos, essa configuração será aplicada ao grupo de recursos e a todos os recursos. No entanto, outro grupo de recursos não possuirá essa configuração.

Normalmente, é adequado aplicar configurações críticas em níveis superiores e requisitos específicos do projeto em níveis inferiores. Por exemplo, você pode querer garantir que todos os recursos para sua organização sejam implantados em determinadas regiões. Para cumprir esse requisito, aplique uma política à assinatura que especifica as localizações permitidas. Na medida em que outros usuários em sua organização adicionarem novos recursos e grupos de recursos, as localizações permitidas serão aplicadas automaticamente.

Neste tutorial, você aplica todas as configurações de gerenciamento a um grupo de recursos, de modo que seja possível remover facilmente essas configurações quando terminar.

Vamos criar esse grupo de recursos.

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

Atualmente, o grupo de recursos está vazio.

Controle de acesso baseado em função do Azure

Você deseja certificar-se de que os usuários em sua organização têm o nível certo de acesso a esses recursos. Você não deseja conceder acesso ilimitado a usuários, mas também precisa certificar-se de que eles podem fazer o trabalho deles. O Azure RBAC (controle de acesso baseado em função do Azure) permite que você gerencie quais usuários têm permissão para executar ações específicas em um escopo.

Para criar e remover as atribuições de função, os usuários devem ter Microsoft.Authorization/roleAssignments/* acesso. Esse acesso deve ser concedido pelas funções Proprietário ou Administrador de Acesso do Usuário.

Para gerenciar soluções de máquinas virtuais, há três funções específicas do recurso que fornecem acesso comum:

Em vez de atribuir funções a usuários individuais, muitas vezes é mais fácil usar um grupo do Azure Active Directory que tenha usuários que precisam realizar ações semelhantes. E, em seguida, atribuir esse grupo à função apropriada. Neste artigo, use um grupo existente para gerenciar a máquina virtual ou use o portal para criar um grupo do Azure Active Directory.

Após criar um novo grupo ou encontrar um existente, use o comando az role assignment create para atribuir o novo grupo do Azure Active Directory à função de Colaborador da Máquina Virtual para o 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

Se você receber um erro informando que <o guid> principal não existe no diretório, o novo grupo não se propaga em todo o Azure Active Directory. Tente executar o comando novamente.

Normalmente, você repete o processo para Colaborador de Rede e Colaborador da Conta de Armazenamento, visando certificar-se de que os usuários serão designados para gerenciar os recursos implantados. Neste artigo, você pode ignorar essas etapas.

Azure Policy

O Azure Policy ajuda a garantir que todos os recursos da assinatura atendam aos padrões corporativos. Sua assinatura já possui várias definições de políticas. Para ver as definições de política disponíveis, use o comando az policy definition list:

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

Você vê as definições de políticas existentes. O tipo de política é BuiltIn ou Personalizada. Procure as definições para aqueles que descrevem uma condição que você quer atribuir. Neste artigo, você atribui políticas que:

  • Limitam os locais para todos os recursos.
  • Limitam as SKUs para máquinas virtuais.
  • Auditam máquinas virtuais que não utilizam discos gerenciados.

No exemplo a seguir, você pode recuperar três definições de política com base no nome de exibição. Você usa o comando az policy assignment create para atribuir essas definições ao grupo de recursos. Para algumas políticas, você deve fornecer valores de parâmetro para especificar os 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

O exemplo anterior pressupõe que você já conhece os parâmetros para uma política. Se precisar exibir os parâmetros, use:

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

Implantar a máquina virtual

Você atribuiu funções e políticas, entãoestá pronto para implantar a solução. O tamanho padrão é Standard_DS1_v2, que é uma das suas SKUs permitidas. O comando cria chaves SSH, se elas ainda não existirem em um local padrão.

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

Após a conclusão da implantação, será necessário aplicar mais configurações de gerenciamento à solução.

Bloquear recursos

Bloqueios de recursos impedem que os usuários em sua organização acidentalmente excluam ou modifiquem recursos críticos. Ao contrário do controle de acesso baseado em função, bloqueios de recurso aplicam uma restrição a todos os usuários e funções. É possível definir o nível de bloqueio como CanNotDelete ou ReadOnly.

Para criar ou excluir bloqueios de gerenciamento, você deve ter acesso às ações Microsoft.Authorization/locks/*. Das funções internas, somente Proprietário e Administrador do Acesso de Usuário recebem essas ações.

Para bloquear a máquina virtual e o grupo de segurança de rede, use o 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 testar os bloqueios, tente executar o comando a seguir:

az group delete --name myResourceGroup

Você vê um erro informando que a operação de exclusão não pode ser concluída devido a um bloqueio. O grupo de recursos poderá ser excluído apenas se você remover especificamente os bloqueios. Essa etapa é apresentada em Limpar os recursos.

Recursos de marca

Você pode aplicar marcas para os recursos do Azure para organizá-los logicamente por categorias. Cada marca consiste em um nome e em um valor. Por exemplo, você pode aplicar o nome "Ambiente" e o valor "Produção" a todos os recursos na produção.

Para adicionar duas marcas a um grupo de recursos, use o comando az group update:

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

Vamos supor que você quer adicionar uma terceira marca. Execute o comando novamente com a nova marca. Ele é adicionado às marcas existentes.

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

Os recursos não herdam as marcas do grupo de recursos. Atualmente, o grupo de recursos tem três marcas, mas os recursos não têm nenhuma marca. Para aplicar todas as marcas de um grupo de recursos a seus recursos e reter as marcas existentes nos recursos, use o script a seguir:

# 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, você pode aplicar as marcas do grupo de recursos aos recursos sem manter as marcas 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 vários valores em uma única marca, use uma cadeia de caracteres JSON.

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

Para remover todas as marcas em um grupo de recursos, use:

az group update -n myResourceGroup --remove tags

Para aplicar marcas a uma máquina virtual, use o comando az resource tag. Nenhuma marca existente no recurso é mantida.

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

Localizar recursos por marca

Para localizar recursos com um nome e valor da marca, use o comando az resource list:

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

É possível utilizar os valores retornados para tarefas de gerenciamento, como parar todas as máquinas virtuais com um valor de marca.

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

Exibir custos por valores de marca

Após aplicar as marcas aos recursos, será possível exibir os custos dos recursos com essas marcas. Demora um tempo para que a análise de custo mostre o uso mais recente, portanto, talvez ainda não seja possível exibir os custos. Quando os custos estiverem disponíveis, você poderá visualizá-los nos grupos de recursos em sua assinatura. Para visualizar os custos, os usuários deverão ter acesso no nível da assinatura para informações de cobrança.

Para exibir custos por marca no portal, selecione sua assinatura e, em seguida, Análise de Custo.

Análise de custo

Em seguida, filtre pelo valor de marca e selecione Aplicar.

Exibir custo por marca

Também é possível usar a Visão geral da API de consumo do Azure para exibir os custos de maneira programática.

Limpar os recursos

O grupo de segurança de rede bloqueado não poderá ser excluído até que o bloqueio seja removido. Para remover o bloqueio, recuperar as IDs dos bloqueios e fornecê-los para o 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

Quando não for mais necessário, você pode usar o comando az group delete para remover o grupo de recursos, a VM e todos os recursos relacionados. Saia da sessão SSH para sua VM e então exclua os recursos da seguinte maneira:

az group delete --name myResourceGroup

Próximas etapas

Neste tutorial, você criou uma imagem de VM personalizada. Você aprendeu a:

  • Atribuir usuários a uma função
  • Aplicar políticas que impõem padrões
  • Proteger recursos críticos com bloqueios
  • Recursos de marca de cobrança e gerenciamento

Passe para o próximo tutorial para aprender a identificar alterações e a gerenciar atualizações de pacote em uma máquina virtual.