Esempio: Usare le librerie di Azure per creare una macchina virtuale
Questo articolo illustra come usare le librerie di gestione di Azure SDK in uno script Python per creare un gruppo di risorse contenente una macchina virtuale Linux.
Se non diversamente specificato, tutti i comandi di questo articolo funzionano allo stesso modo nella shell Bash Linux/macOS e nella shell dei comandi di Windows.
I comandi equivalenti dell'interfaccia della riga di comando di Azure sono elencati più avanti in questo articolo. Se si preferisce usare il portale di Azure, vedere Creare una macchina virtuale Linux e Creare una macchina virtuale Windows.
Nota
La creazione di una macchina virtuale tramite codice è un processo in più passaggi che prevede il provisioning di una serie di altre risorse richieste dalla macchina virtuale. Se questo codice viene semplicemente eseguito dalla riga di comando, è molto più facile usare il comando az vm create
, che effettua automaticamente il provisioning di queste risorse secondarie con i valori predefiniti di qualsiasi impostazione che si sceglie di omettere. Gli unici argomenti obbligatori sono un gruppo di risorse, il nome della macchina virtuale, il nome dell'immagine e le credenziali di accesso. Per altre informazioni, vedere Creare rapidamente una macchina virtuale con l'interfaccia della riga di comando di Azure.
1: Configurare l'ambiente di sviluppo locale
Se non è già stato fatto, configurare un ambiente in cui è possibile eseguire questo codice. Di seguito sono riportate alcuni opzioni:
Configurare un ambiente virtuale Python usando o lo
venv
strumento preferito. È possibile creare l'ambiente virtuale in locale o in Azure Cloud Shell ed eseguire il codice. Assicurarsi di attivare l'ambiente virtuale per iniziare a usarlo.Usare un ambiente conda.
Usare un contenitore di sviluppo in Visual Studio Code o GitHub Codespaces.
2: Installare i pacchetti di libreria di Azure necessari
Creare un file requirements.txt in cui elencare le librerie di gestione usate in questo esempio:
azure-mgmt-resource
azure-mgmt-compute
azure-mgmt-network
azure-identity
Quindi, nel terminale o nel prompt dei comandi con l'ambiente virtuale attivato, installare le librerie di gestione elencate in requirements.txt:
pip install -r requirements.txt
3: Scrivere codice per creare una macchina virtuale
Creare un file Python denominato provision_vm.py con il codice seguente. I commenti spiegano i dettagli:
# 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://learn.microsoft.com/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}")
Autenticazione nel codice
Più avanti in questo articolo si accede ad Azure con l'interfaccia della riga di comando di Azure per eseguire il codice di esempio. Se l'account dispone delle autorizzazioni per creare gruppi di risorse e risorse di rete e di calcolo nella sottoscrizione di Azure, il codice verrà eseguito correttamente.
Per usare questo codice in uno script di produzione, è possibile impostare le variabili di ambiente per usare un metodo basato su entità servizio per l'autenticazione. Per altre informazioni, vedere Come autenticare le app Python con i servizi di Azure. È necessario assicurarsi che l'entità servizio disponga di autorizzazioni sufficienti per creare gruppi di risorse e risorse di rete e di calcolo nella sottoscrizione assegnandole un ruolo appropriato in Azure, ad esempio il ruolo Collaboratore nella sottoscrizione.
Collegamenti di riferimento per le classi usate nel codice
- DefaultAzureCredential (azure.identity)
- ResourceManagementClient (azure.mgmt.resource)
- NetworkManagementClient (azure.mgmt.network)
- ComputeManagementClient (azure.mgmt.compute)
4. Eseguire lo script
Se non è già stato fatto, accedere ad Azure usando l'interfaccia della riga di comando di Azure:
az login
Impostare la
AZURE_SUBSCRIPTION_ID
variabile di ambiente sull'ID sottoscrizione. È possibile eseguire il comando az account show e ottenere l'IDid
sottoscrizione dalla proprietà nell'output:Eseguire lo script:
python provision_vm.py
Il processo di provisioning richiede alcuni minuti.
5. Verificare le risorse
Aprire il portale di Azure, passare al gruppo di risorse "PythonAzureExample-VM-rg" e prendere nota della macchina virtuale, del disco virtuale, del gruppo di sicurezza di rete, dell'indirizzo IP pubblico, dell'interfaccia di rete e della rete virtuale.
È anche possibile usare l'interfaccia della riga di comando di Azure per verificare che la macchina virtuale esista con il comando az vm list :
az vm list --resource-group PythonAzureExample-VM-rg
Comandi equivalenti dell'interfaccia della riga di comando di Azure
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 viene visualizzato un errore relativo alle restrizioni di capacità, è possibile provare una dimensione o un'area diversa. Per altre informazioni, vedere Risolvere gli errori per lo SKU non disponibile.
6: Pulire le risorse
Lasciare invariate le risorse se si vuole continuare a usare la macchina virtuale e la rete creata in questo articolo. In caso contrario, eseguire il comando az group delete per eliminare il gruppo di risorse.
I gruppi di risorse non comportano addebiti in corso nella sottoscrizione, ma le risorse contenute nel gruppo, ad esempio le macchine virtuali, potrebbero continuare a comportare addebiti. È consigliabile pulire qualsiasi gruppo che non si usa attivamente. Con l'argomento --no-wait
, il comando restituisce immediatamente il risultato invece di attendere il completamento dell'operazione.
az group delete -n PythonAzureExample-VM-rg --no-wait
Per eliminare un gruppo di risorse dal codice, è anche possibile usare il metodo ResourceManagementClient.resource_groups.begin_delete
. Il codice in Esempio: Creare un gruppo di risorse illustra l'utilizzo.
Vedi anche
- Esempio: Creare un gruppo di risorse
- Esempio: Elencare i gruppi di risorse in una sottoscrizione
- Esempio: Creare Archiviazione di Azure
- Esempio: Usare Archiviazione di Azure
- Esempio: Creare un'app Web e distribuire il codice
- Esempio: Creare ed eseguire query su un database
- Usare Azure Managed Disks con le macchine virtuali
- Completare un breve sondaggio su Azure SDK per Python
Le risorse seguenti contengono esempi più completi che usano Python per creare una macchina virtuale:
- Esempi di gestione delle macchine virtuali di Azure - Python (GitHub). L'esempio illustra più operazioni di gestione, ad esempio l'avvio e il riavvio di una macchina virtuale, l'arresto e l'eliminazione di una macchina virtuale, l'aumento delle dimensioni del disco e la gestione dei dischi dati.