Поделиться через


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

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

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

Замечание

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

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

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

#!/bin/bash
# Create a virtual environment
python -m venv .venv
# Activate the virtual environment
source .venv/Scripts/activate # only required for Windows (Git Bash)

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

Создайте файл "requirements.txt" , указывающий пакеты управления Azure SDK, необходимые для этого скрипта.

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".

Убедитесь, что субъект-служба назначена роль с достаточными разрешениями для создания групп ресурсов и учетных записей хранения. Например, назначение роли участника на уровне подписки обеспечивает необходимый доступ. Дополнительные сведения о назначениях ролей см. в статье "Управление доступом на основе ролей" (RBAC) в Azure.

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

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

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

    export AZURE_SUBSCRIPTION_ID=$(az account show --query id -o tsv)
    
  3. Запустите скрипт:

    python provision_vm.py
    

Процесс настройки занимает несколько минут, чтобы завершить.

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

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

Страница портала Azure для новой группы ресурсов с виртуальными машинами и связанными ресурсами

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

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

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

# Provision the resource group

az group create -n PythonAzureExample-VM-rg -l westus2

# 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

# Provision a public IP address

az network public-ip create -g PythonAzureExample-VM-rg -n python-example-ip \
    --allocation-method Dynamic --version IPv4

# 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

# 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 для создания виртуальной машины:

  • Примеры управления виртуальными машинами Azure — Python (GitHub). В примере показаны дополнительные операции управления, такие как запуск и перезапуск виртуальной машины, остановка и удаление виртуальной машины, увеличение размера диска и управление дисками данных.