Exemplo: usar as bibliotecas do Azure para criar uma máquina virtual
Neste artigo, você aprenderá como usar as bibliotecas de gerenciamento do SDK do Azure em um script Python para criar um grupo de recursos que contém uma máquina virtual Linux.
Todos os comandos neste artigo funcionam da mesma forma no bash do Linux/macOS e nos shells de comando do Windows, a menos que haja uma observação.
Os Comandos equivalentes da CLI do Azure serão listados depois neste artigo. Se preferir usar o portal do Azure, confira Criar uma VM do Linux e Criar uma VM do Windows.
Observação
A criação de uma máquina virtual por meio de código é um processo de várias etapas que envolve o provisionamento de vários outros recursos que a máquina virtual precisa. Se esse código for simplesmente executado da linha de comando, será muito mais fácil usar o comando az vm create
que provisiona automaticamente esses recursos secundários com valores padrão para qualquer configuração que você decidir omitir. Os únicos argumentos necessários são um grupo de recursos, nome da VM, nome da imagem e credenciais de logon. Para obter mais informações, consulte Criação rápida de uma máquina virtual com a CLI do Azure.
1: configurar seu ambiente de desenvolvimento
Caso ainda não tenha feito isso, configure um ambiente onde você possa executar esse código. Estas são algumas opções:
Configure um ambiente virtual Python usando o
venv
ou sua ferramenta de escolha. Você pode criar o ambiente virtual localmente ou no Azure Cloud Shell e executar o código lá. Não esqueça de ativar o ambiente virtual para começar a usá-lo.Use um ambiente conda.
Use um Contêiner de Desenvolvimento no Visual Studio Code ou no GitHub Codespaces.
2: instalar os pacotes de biblioteca do Azure necessários
Crie um arquivo requirements.txt que liste as bibliotecas de gerenciamento usadas neste exemplo:
azure-mgmt-resource
azure-mgmt-compute
azure-mgmt-network
azure-identity
Em seguida, um terminal ou prompt de comando com o ambiente virtual ativado, instale as bibliotecas de gerenciamento listadas no arquivo requirements.txt:
pip install -r requirements.txt
3: escrever código para criar uma máquina virtual
Crie um arquivo Python com o nome provision_vm.py e o código a seguir. Os comentários explicam os detalhes:
# Import the needed credential and management objects from the libraries.
import os
from azure.identity import DefaultAzureCredential
from azure.mgmt.compute import ComputeManagementClient
from azure.mgmt.network import NetworkManagementClient
from azure.mgmt.resource import ResourceManagementClient
print(
"Provisioning a virtual machine...some operations might take a \
minute or two."
)
# Acquire a credential object.
credential = DefaultAzureCredential()
# Retrieve subscription ID from environment variable.
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]
# Step 1: Provision a resource group
# Obtain the management object for resources.
resource_client = ResourceManagementClient(credential, subscription_id)
# Constants we need in multiple places: the resource group name and
# the region in which we provision resources. You can change these
# values however you want.
RESOURCE_GROUP_NAME = "PythonAzureExample-VM-rg"
LOCATION = "westus2"
# Provision the resource group.
rg_result = resource_client.resource_groups.create_or_update(
RESOURCE_GROUP_NAME, {"location": LOCATION}
)
print(
f"Provisioned resource group {rg_result.name} in the \
{rg_result.location} region"
)
# For details on the previous code, see Example: Provision a resource
# group at https://zcusa.951200.xyz/azure/developer/python/
# azure-sdk-example-resource-group
# Step 2: provision a virtual network
# A virtual machine requires a network interface client (NIC). A NIC
# requires a virtual network and subnet along with an IP address.
# Therefore we must provision these downstream components first, then
# provision the NIC, after which we can provision the VM.
# Network and IP address names
VNET_NAME = "python-example-vnet"
SUBNET_NAME = "python-example-subnet"
IP_NAME = "python-example-ip"
IP_CONFIG_NAME = "python-example-ip-config"
NIC_NAME = "python-example-nic"
# Obtain the management object for networks
network_client = NetworkManagementClient(credential, subscription_id)
# Provision the virtual network and wait for completion
poller = network_client.virtual_networks.begin_create_or_update(
RESOURCE_GROUP_NAME,
VNET_NAME,
{
"location": LOCATION,
"address_space": {"address_prefixes": ["10.0.0.0/16"]},
},
)
vnet_result = poller.result()
print(
f"Provisioned virtual network {vnet_result.name} with address \
prefixes {vnet_result.address_space.address_prefixes}"
)
# Step 3: Provision the subnet and wait for completion
poller = network_client.subnets.begin_create_or_update(
RESOURCE_GROUP_NAME,
VNET_NAME,
SUBNET_NAME,
{"address_prefix": "10.0.0.0/24"},
)
subnet_result = poller.result()
print(
f"Provisioned virtual subnet {subnet_result.name} with address \
prefix {subnet_result.address_prefix}"
)
# Step 4: Provision an IP address and wait for completion
poller = network_client.public_ip_addresses.begin_create_or_update(
RESOURCE_GROUP_NAME,
IP_NAME,
{
"location": LOCATION,
"sku": {"name": "Standard"},
"public_ip_allocation_method": "Static",
"public_ip_address_version": "IPV4",
},
)
ip_address_result = poller.result()
print(
f"Provisioned public IP address {ip_address_result.name} \
with address {ip_address_result.ip_address}"
)
# Step 5: Provision the network interface client
poller = network_client.network_interfaces.begin_create_or_update(
RESOURCE_GROUP_NAME,
NIC_NAME,
{
"location": LOCATION,
"ip_configurations": [
{
"name": IP_CONFIG_NAME,
"subnet": {"id": subnet_result.id},
"public_ip_address": {"id": ip_address_result.id},
}
],
},
)
nic_result = poller.result()
print(f"Provisioned network interface client {nic_result.name}")
# Step 6: Provision the virtual machine
# Obtain the management object for virtual machines
compute_client = ComputeManagementClient(credential, subscription_id)
VM_NAME = "ExampleVM"
USERNAME = "azureuser"
PASSWORD = "ChangePa$$w0rd24"
print(
f"Provisioning virtual machine {VM_NAME}; this operation might \
take a few minutes."
)
# Provision the VM specifying only minimal arguments, which defaults
# to an Ubuntu 18.04 VM on a Standard DS1 v2 plan with a public IP address
# and a default virtual network/subnet.
poller = compute_client.virtual_machines.begin_create_or_update(
RESOURCE_GROUP_NAME,
VM_NAME,
{
"location": LOCATION,
"storage_profile": {
"image_reference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "16.04.0-LTS",
"version": "latest",
}
},
"hardware_profile": {"vm_size": "Standard_DS1_v2"},
"os_profile": {
"computer_name": VM_NAME,
"admin_username": USERNAME,
"admin_password": PASSWORD,
},
"network_profile": {
"network_interfaces": [
{
"id": nic_result.id,
}
]
},
},
)
vm_result = poller.result()
print(f"Provisioned virtual machine {vm_result.name}")
Autenticação no código
Mais adiante neste artigo, você entra no Azure com a CLI do Azure para executar o código de exemplo. Se sua conta tiver permissões para criar grupos de recursos e recursos de rede e computação em sua assinatura do Azure, o código será executado com êxito.
Para usar esse código em um script de produção, você pode definir variáveis de ambiente para usar um método baseado em entidade de serviço para autenticação. Para saber mais, confira Como autenticar aplicativos Python com serviços do Azure. Você precisa garantir que a entidade de serviço tenha permissões suficientes para criar grupos de recursos e recursos de rede e computação em sua assinatura, atribuindo uma função apropriada no Azure; por exemplo, a função Colaborador na sua assinatura.
Links de referência para classes usadas no código
- DefaultAzureCredential (azure.identity)
- ResourceManagementClient (azure.mgmt.resource)
- NetworkManagementClient (azure.mgmt.network)
- ComputeManagementClient (azure.mgmt.compute)
4. Executar o script
Caso ainda não tenha feito isso, entre no Azure usando a CLI do Azure:
az login
Defina a variável de ambiente
AZURE_SUBSCRIPTION_ID
como a sua ID da assinatura. (Você pode executar o comando az account show e obter sua ID de assinatura da propriedadeid
na saída):Executar o script:
python provision_vm.py
O processo de provisionamento leva alguns minutos para ser concluído.
5. Verificar os recursos
Abra o portal do Azure, navegue até o grupo de recursos "PythonSDKExample-VM-rg" e anote a máquina virtual, o disco virtual, o grupo de segurança de rede, o endereço IP público, o adaptador de rede e a rede virtual.
Também é possível usar a CLI do Azure para verificar se a VM existe com o comando az vm list :
az vm list --resource-group PythonAzureExample-VM-rg
Comandos da CLI do Azure equivalentes
rem Provision the resource group
az group create -n PythonAzureExample-VM-rg -l westus2
rem Provision a virtual network and subnet
az network vnet create -g PythonAzureExample-VM-rg -n python-example-vnet ^
--address-prefix 10.0.0.0/16 --subnet-name python-example-subnet ^
--subnet-prefix 10.0.0.0/24
rem Provision a public IP address
az network public-ip create -g PythonAzureExample-VM-rg -n python-example-ip ^
--allocation-method Dynamic --version IPv4
rem Provision a network interface client
az network nic create -g PythonAzureExample-VM-rg --vnet-name python-example-vnet ^
--subnet python-example-subnet -n python-example-nic ^
--public-ip-address python-example-ip
rem Provision the virtual machine
az vm create -g PythonAzureExample-VM-rg -n ExampleVM -l "westus2" ^
--nics python-example-nic --image UbuntuLTS --public-ip-sku Standard ^
--admin-username azureuser --admin-password ChangePa$$w0rd24
Se você receber um erro sobre restrições de capacidade, tente um tamanho ou região diferente. Para obter mais informações, consulte Resolver erros de SKU não disponível.
6: limpar recursos
Deixe os recursos em vigor se quiser continuar a usar a máquina virtual e a rede criadas neste artigo. Caso contrário, execute o comando az group delete para excluir o grupo de recursos.
Os grupos de recursos não incorrem em encargos adicionais em sua assinatura, mas recursos contidos no grupo, como máquinas virtuais, podem continuar a incorrer em encargos. É prática recomendada limpar qualquer grupo que você não esteja usando ativamente. O argumento --no-wait
permite que o comando seja retornado imediatamente, em vez de esperar a conclusão da operação.
az group delete -n PythonAzureExample-VM-rg --no-wait
Você também pode usar o método ResourceManagementClient.resource_groups.begin_delete
para excluir um grupo de recursos do código. O código em Exemplo: criar um grupo de recursos demonstra o uso.
Confira também
- Exemplo: criar um grupo de recursos
- Exemplo: listar os grupos de recursos de uma assinatura
- Exemplo: criar o Armazenamento do Azure
- Exemplo: usar o Armazenamento do Azure
- Exemplo: criar um aplicativo Web e implantar o código
- Exemplo: criar e consultar um banco de dados
- Usar o Managed Disks do Azure com máquinas virtuais
- Conclua uma breve pesquisa sobre o SDK do Azure para Python
Os seguintes recursos contêm exemplos mais abrangentes do uso do Python para criar uma máquina virtual:
- Amostras de Gerenciamento de Máquinas Virtuais do Azure – Python (GitHub). O exemplo demonstra mais operações de gerenciamento, como iniciar e reiniciar uma VM, parar e excluir uma VM, aumentar o tamanho do disco e gerenciar discos de dados.