Пример. Создание виртуальной машины с помощью библиотек Azure

Из этой статьи вы узнаете, как использовать библиотеки управления пакетом SDK Azure в скрипте Python для создания группы ресурсов, содержащей виртуальную машину Linux.

Все описанные в этой статье команды работают одинаково как в Bash для Linux или macOS, так и в командных оболочках для Windows, если не указано иное.

Эквивалентные команды Azure CLI перечислены далее в этой статье. Если вы предпочитаете использовать портал Azure, см. статью "Создание виртуальной машины Linux" и "Создание виртуальной машины Windows".

Примечание.

Создание виртуальной машины с помощью кода — это многоэтапный процесс, который включает подготовку ряда других ресурсов, необходимых виртуальной машине. Если вы выполняете код из командной строки, проще будет использовать команду az vm create, которая автоматически подготавливает эти вспомогательные ресурсы, задавая значения по умолчанию всем параметрам, которые вы не указываете. Единственными обязательными аргументами являются группа ресурсов, имя виртуальной машины, имя образа и учетные данные для входа. Дополнительные сведения см. в статье Быстрое создание виртуальной машины с помощью Azure CLI.

1. Настройка локальной среды разработки

Если вы еще не сделали этого, настройте среду, в которой можно запустить этот код. Ниже приведено несколько вариантов:

2. Установка необходимых пакетов библиотек Azure

Создайте файл requirements.txt, в котором перечислены библиотеки управления, используемые в этом примере.

azure-mgmt-resource
azure-mgmt-compute
azure-mgmt-network
azure-identity

Затем в терминале или командной строке с активированной виртуальной средой установите библиотеки управления, перечисленные в requirements.txt:

pip install -r requirements.txt

3. Написание кода для создания виртуальной машины

Создайте файл Python с именем provision_vm.py с приведенным ниже кодом. Подробные объяснения даны в комментариях:

# 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}")

Проверка подлинности в коде

Далее в этой статье вы войдите в Azure с помощью Azure CLI, чтобы запустить пример кода. Если у вашей учетной записи есть разрешения на создание групп ресурсов и сетевых и вычислительных ресурсов в подписке Azure, код будет выполнен успешно.

Чтобы использовать такой код в рабочем скрипте, можно задать переменные среды для использования метода на основе субъекта-службы для проверки подлинности. Дополнительные сведения см. в статье "Проверка подлинности приложений Python с помощью служб Azure". Необходимо убедиться, что субъект-служба имеет достаточные разрешения для создания групп ресурсов и сетевых и вычислительных ресурсов в подписке, назначив ей соответствующую роль в Azure, например роль участника в подписке.

4. Запуск скрипта

  1. Если вы еще не сделали этого, войдите в Azure с помощью Azure CLI:

    az login
    
  2. Задайте для переменной AZURE_SUBSCRIPTION_ID среды идентификатор подписки. (Вы можете запустить команду az account show и получить идентификатор подписки из id свойства в выходных данных):

    set AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000
    
  3. Запустите скрипт:

    python provision_vm.py
    

Процесс подготовки занимает несколько минут.

5. Проверка ресурсов

Откройте портал Azure, перейдите к группе ресурсов PythonAzureExample-VM-rg и запишите виртуальную машину, виртуальный диск, группу безопасности сети, общедоступный IP-адрес, сетевой интерфейс и виртуальную сеть.

Azure portal page for the new resource group showing the virtual machine and related resources

Вы также можете использовать Azure CLI для проверки наличия виртуальной машины с помощью команды az vm list :

az vm list --resource-group PythonAzureExample-VM-rg

Эквивалентные команды Azure CLI

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

Если возникает ошибка об ограничениях емкости, можно попробовать другой размер или регион. Дополнительные сведения см. в разделе "Устранение ошибок для номера SKU" недоступно.

6. Очистка ресурсов

Оставьте ресурсы на месте, если вы хотите продолжить использовать виртуальную машину и сеть, созданную в этой статье. В противном случае выполните команду az group delete , чтобы удалить группу ресурсов.

Группы ресурсов не несут никаких текущих расходов в подписке, но ресурсы, содержащиеся в группе, например виртуальные машины, могут продолжать взиматься. Рекомендуется очистить любую группу, которую вы не используете. Аргумент --no-wait позволяет команде выполнять возврат без задержки, не ожидая завершения операции.

az group delete -n PythonAzureExample-VM-rg --no-wait

Для удаления группы ресурсов с помощью кода также можно использовать метод ResourceManagementClient.resource_groups.begin_delete. Код в примере: создание группы ресурсов демонстрирует использование.

См. также

Более подробные примеры использования Python для создания виртуальной машины см. в следующих ресурсах: