示例:使用 Azure 库创建虚拟机
本文介绍如何在 Python 脚本中使用 Azure SDK 管理库来创建包含 Linux 虚拟机的资源组。
除非另行说明,否则本文中的所有资源在 Linux/macOS bash 和 Windows 命令行界面上的工作方式相同。
本文稍后将列出等效的 Azure CLI 命令。 如果更喜欢使用 Azure 门户,则请参阅创建 Linux VM 和创建 Windows VM。
注意
通过代码来创建虚拟机是一个多步骤刘晨,其中涉及预配虚拟机所需的众多其他资源。 如果只是从命令行运行此类代码,使用 az vm create
命令会更容易,该命令会自动预配这些辅助资源(对于你选择省略的任何设置,会使用其默认值)。 仅需资源组、VM 名称、映像名称和登录凭据这些参数。 有关详细信息,请参阅使用 Azure CLI 快速创建虚拟机。
1:设置本地开发环境
如果尚未设置,则请设置一个可在其中运行此代码的环境。 提供以下选择:
使用
venv
或所选工具来配置 Python 虚拟环境。 可在本地或 Azure Cloud Shell 中创建虚拟环境,然后在其中运行代码。 请务必激活此虚拟环境以开始使用。使用 Conda 环境。
在 Visual Studio Code 或 GitHub Codespaces 中使用开发容器。
2:安装所需的 Azure 库包
创建一个 requirements.txt 文件,其中列出了此示例中使用的管理库:
azure-mgmt-resource
azure-mgmt-compute
azure-mgmt-network
azure-identity
然后,在已激活虚拟环境的终端或命令提示符中,安装 requirements.txt 中列出的管理库:
pip install -r requirements.txt
3:编写代码以创建虚拟机
创建包含以下代码的名为“provision_vm.py”的 Python 文件。 注释对详细信息进行了说明:
# 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 CLI 登录到 Azure,以便运行示例代码。 如果帐户有权在 Azure 订阅中创建资源组和网络与计算资源,此代码则会成功运行。
若要在生产脚本中使用此类代码,则可将环境变量设为使用基于服务主体的方法来进行身份验证。 若要了解详细信息,请参阅如何使用 Azure 服务对 Python 应用进行身份验证。 需确保服务主体有足够权限在订阅中创建资源组和网络与计算资源,具体方法则是在 Azure 中为其分配适当的角色;例如,订阅的参与者角色。
代码中使用的类的参考链接
- DefaultAzureCredential (azure.identity)
- ResourceManagementClient (azure.mgmt.resource)
- NetworkManagementClient (azure.mgmt.network)
- ComputeManagementClient (azure.mgmt.compute)
4:运行脚本
如果尚未登录,则请使用 Azure CLI 登录到 Azure:
az login
将
AZURE_SUBSCRIPTION_ID
环境变量设为订阅 ID。 (可运行 az account show 命令,然后从输出中的id
属性获取订阅 ID):运行以下脚本:
python provision_vm.py
预配过程需要几分钟才能完成。
5:验证资源
打开 Azure 门户,导航到“PythonAzureExample-VM-rg”资源组,然后记下虚拟机、虚拟磁盘、网络安全组、公共 IP 地址、网络接口和虚拟网络。
此外,还可使用 Azure CLI 并通过 az vm list 命令来验证 VM 是否存在:
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
方法从代码中删除资源组。 示例:创建资源组中的代码演示了相关用法。
另请参阅
- 示例:创建资源组
- 示例:列出订阅中的资源组
- 示例:创建 Azure 存储
- 示例:使用 Azure 存储
- 示例:创建 Web 应用并部署代码
- 示例:创建和查询数据库
- 将 Azure 托管磁盘与虚拟机一起使用
- 完成有关 Azure SDK for Python 的简短调查
以下资源包含使用 Python 创建虚拟机的更全面的示例:
- Azure 虚拟机管理示例 - Python (GitHub)。 此示例演示了更多管理操作,例如启动并重新启动 VM、停止并删除 VM、增加磁盘大小以及管理数据磁盘。