你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure CLI 和 Python 在 Azure Stack Edge Pro GPU 设备上部署 VM
适用于:Azure Stack Edge Pro - GPUAzure Stack Edge Pro 2Azure Stack Edge Pro RAzure Stack Edge Mini R
可以使用 API 在 Azure Stack Edge 设备上创建和管理虚拟机 (VM)。 这些 API 是使用本地 Azure Stack Edge 终结点调用的标准 Azure 资源管理器 API。 Azure 资源管理器 API 提供了一个一致的管理层,在本例中,你可以通过该管理层在设备上的本地订阅中创建、更新和删除 VM。 可以通过 Azure PowerShell cmdlet 连接到在 Azure Stack Edge 上运行的 Azure 资源管理器。
本教程介绍如何使用 Python 和 Azure API 在 Azure Stack Edge Pro 设备上创建和管理 VM。
VM 部署工作流
下图演示了此部署工作流。
下面是此部署工作流的基本摘要信息:
- 连接到 Azure 资源管理器
- 创建资源组
- 创建存储帐户
- 将 blob URI 添加到 hosts 文件
- 安装证书
- 上传 VHD
- 基于 VHD 创建托管磁盘
- 基于映像托管磁盘创建 VM 映像
- 基于之前创建的资源创建 VM
- 创建 VNet
- 使用 VNet 子网 ID 创建 VNIC
有关工作流图表的详细说明,请参阅使用 Azure PowerShell 在 Azure Stack Edge Pro 设备上部署 VM。 有关如何连接到 Azure 资源管理器的信息,请参阅使用 Azure PowerShell 连接到 Azure 资源管理器。
必备条件
在开始使用 Azure CLI 和 Python 在 Azure Stack Edge Pro 设备上创建和管理 VM 之前,你需要确保已完成以下步骤中列出的先决条件:
已完成 Azure Stack Edge Pro 设备上的网络设置,如步骤 1:配置 Azure Stack Edge Pro 设备中所述。
已启用计算网络接口。 此网络接口 IP 用于为 VM 部署创建虚拟交换机。 下列步骤将为你演示此过程:
转到“计算”。 选择将用于创建虚拟交换机的网络接口。
重要
只能为计算配置一个端口。
在网络接口上启用计算。 Azure Stack Edge Pro 创建并管理与该网络接口相对应的虚拟交换机。
你已在 Azure Stack Edge Pro 设备和客户端的受信任存储中创建并安装了所有证书。 按照步骤 2:创建和安装证书中所述过程操作。
你已为 Azure Stack Edge Pro 设备创建了 Base-64 编码的 .cer 证书(PEM 格式)。 此证书已作为签名链上传到设备,并安装到了客户端上受信任的根存储中。 还需要 pem 格式的此证书,这样 Python 才能在此客户端上工作。
使用 certutil 命令将此证书转换为
pem
格式。 必须在包含证书的目录中运行此命令。certutil.exe <SourceCertificateName.cer> <DestinationCertificateName.pem>
下面显示了命令用法的示例:
PS C:\Certificates> certutil.exe -encode aze-root.cer aze-root.pem Input Length = 2150 Output Length = 3014 CertUtil: -encode command completed successfully. PS C:\Certificates>
稍后,你还会将此
pem
添加到 Python 存储。你已在设备的本地 Web UI 的“网络”页中分配了设备 IP。 将此 IP 添加到:
- 客户端上的主机文件,或
- DNS 服务器配置
重要
建议你修改终结点名称解析的 DNS 服务器配置。
以管理员身份启动“记事本”(保存文件需要管理员权限),然后打开位于
C:\Windows\System32\Drivers\etc
的 hosts 文件 。将以下条目添加到 hosts 文件,替换为设备的适当值:
<Device IP> login.<appliance name>.<DNS domain> <Device IP> management.<appliance name>.<DNS domain> <Device IP> <storage name>.blob.<appliance name>.<DNS domain>
使用下图作为参考。 保存 hosts 文件。
为 Azure CLI 准备环境:
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展详细信息,请参阅使用 Azure CLI 的扩展。
运行 az version 以查找安装的版本和依赖库。 若要升级到最新版本,请运行 az upgrade。
步骤 1:在客户端上设置 Azure CLI/Python
验证配置文件并安装 Azure CLI
在客户端上安装 Azure CLI。 此示例已安装 Azure CLI 2.0.80。 若要验证 Azure CLI 的版本,请运行 az --version 命令。
下面是上述命令的输出示例:
PS C:\windows\system32> az --version azure-cli 2.0.80 command-modules-nspkg 2.0.3 core 2.0.80 nspkg 3.0.4 telemetry 1.0.4 Extensions: azure-cli-iot-ext 0.7.1 Python location 'C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe' Extensions directory 'C:\.azure\cliextensions' Python (Windows) 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 02:47:15) [MSC v.1900 32 bit (Intel)] Legal docs and information: aka.ms/AzureCliLegal Your CLI is up-to-date. Please let us know how we are doing: https://aka.ms/clihats PS C:\windows\system32>
如果没有 Azure CLI,请下载并在 Windows 上安装 Azure CLI。 可以使用 Windows 命令提示符或通过 Windows PowerShell 运行 Azure CLI。
记下 CLI 的 Python 位置。 需要使用 Python 位置确定 Azure CLI 的受信任的根证书存储的位置。
若要运行本文中使用的示例脚本,你将需要以下 Python 库版本:
azure-common==1.1.23 azure-mgmt-resource==2.1.0 azure-mgmt-network==2.7.0 azure-mgmt-compute==5.0.0 azure-mgmt-storage==1.5.0 azure-storage-blob==1.2.0rc1 haikunator msrestazure==0.6.2
若要安装版本,请运行以下命令:
.\python.exe -m pip install haikunator
以下示例输出显示了 Haikunator 的安装:
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe -m pip install haikunator Collecting haikunator Downloading https://files.pythonhosted.org/packages/43/fa/130968f1a1bb1461c287b9ff35c630460801783243acda2cbf3a4c5964a5/haikunator-2.1.0-py2.py3-none-any.whl Installing collected packages: haikunator Successfully installed haikunator-2.1.0 You are using pip version 10.0.1, however version 20.0.1 is available. You should consider upgrading using the 'python -m pip install --upgrade pip' command. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
以下示例输出显示了
msrestazure
的 pip 安装:PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe -m pip install msrestazure==0.6.2 Requirement already satisfied: msrestazure==0.6.2 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (0.6.2) Requirement already satisfied: msrest<2.0.0,>=0.6.0 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from msrestazure==0.6.2) (0.6.10) === CUT =========================== CUT ================================== Requirement already satisfied: cffi!=1.11.3,>=1.8 in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from cryptography>=1.1.0->adal<2.0.0,>=0.6.0->msrestazure==0.6.2) (1.13.2) Requirement already satisfied: pycparser in c:\program files (x86)\microsoft sdks\azure\cli2\lib\site-packages (from cffi!=1.11.3,>=1.8->cryptography>=1.1.0->adal<2.0.0,>=0.6.0->msrestazure==0.6.2) (2.18) You are using pip version 10.0.1, however version 20.0.1 is available. You should consider upgrading using the 'python -m pip install --upgrade pip' command. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
信任 Azure Stack Edge Pro CA 根证书
在计算机上找到证书位置。 该位置可能因安装
az cli
的位置而异。 以管理员身份运行 Windows PowerShell。 切换到指向az cli
安装 Python 的位置的路径:C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe
。若要获取证书位置,请键入以下命令:
.\python -c "import certifi; print(certifi.where())"
cmdlet 返回证书位置,如下所示:
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python -c "import certifi; print(certifi.where())" C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\lib\site-packages\certifi\cacert.pem PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
记下该位置,因为稍后会用到 -
C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\lib\site-packages\certifi\cacert.pem
信任 Azure Stack Edge Pro CA 根证书,方法是将其追加到现有 Python 证书。 需要提供指向之前保存 PEM 证书的位置的路径。
$pemFile = "<Path to the pem format certificate>"
示例路径为“C:\VM-scripts\rootteam3device.pem”
然后在 Windows PowerShell 中键入以下一系列命令:
$root = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $root.Import($pemFile) Write-Host "Extracting required information from the cert file" $md5Hash = (Get-FileHash -Path $pemFile -Algorithm MD5).Hash.ToLower() $sha1Hash = (Get-FileHash -Path $pemFile -Algorithm SHA1).Hash.ToLower() $sha256Hash = (Get-FileHash -Path $pemFile -Algorithm SHA256).Hash.ToLower() $issuerEntry = [string]::Format("# Issuer: {0}", $root.Issuer) $subjectEntry = [string]::Format("# Subject: {0}", $root.Subject) $labelEntry = [string]::Format("# Label: {0}", $root.Subject.Split('=')[-1]) $serialEntry = [string]::Format("# Serial: {0}", $root.GetSerialNumberString().ToLower()) $md5Entry = [string]::Format("# MD5 Fingerprint: {0}", $md5Hash) $sha1Entry= [string]::Format("# SHA1 Fingerprint: {0}", $sha1Hash) $sha256Entry = [string]::Format("# SHA256 Fingerprint: {0}", $sha256Hash) $certText = (Get-Content -Path $pemFile -Raw).ToString().Replace("`r`n","`n") $rootCertEntry = "`n" + $issuerEntry + "`n" + $subjectEntry + "`n" + $labelEntry + "`n" + ` $serialEntry + "`n" + $md5Entry + "`n" + $sha1Entry + "`n" + $sha256Entry + "`n" + $certText Write-Host "Adding the certificate content to Python Cert store" Add-Content "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\CLI2\Lib\site-packages\certifi\cacert.pem" $rootCertEntry Write-Host "Python Cert store was updated to allow the Azure Stack Edge Pro CA root certificate"
连接到 Azure Stack Edge Pro
通过运行 az cloud register 命令注册 Azure Stack Edge Pro 环境。
在某些情况下,直接出站 Internet 连接通过代理或防火墙进行路由,从而强制进行 SSL 拦截。 在这些情况下,
az cloud register
命令可能会失败并出现错误,例如“无法从云中获取终结点”。若要解决此错误,请在 Windows PowerShell 中设置以下环境变量:$ENV:AZURE_CLI_DISABLE_CONNECTION_VERIFICATION = 1 $ENV:ADAL_PYTHON_SSL_NO_VERIFY = 1
为 Azure 资源管理器终结点的脚本设置环境变量、创建资源的位置以及指向源 VHD 所在位置的路径。 资源的位置在所有 Azure Stack Edge Pro 设备上都是固定的,并且设置为
dbelocal
。 还需要指定地址前缀和专用 IP 地址。 以下所有环境变量的值都取决于你的值,但AZURE_RESOURCE_LOCATION
除外,它应该硬编码为"dbelocal"
。$ENV:ARM_ENDPOINT = "https://management.team3device.teatraining1.com" $ENV:AZURE_RESOURCE_LOCATION = "dbelocal" $ENV:VHD_FILE_PATH = "C:\Downloads\Ubuntu1604\Ubuntu13.vhd" $ENV:ADDRESS_PREFIXES = "5.5.0.0/16" $ENV:PRIVATE_IP_ADDRESS = "5.5.174.126"
注册环境。 在运行 az cloud register 时使用以下参数:
值 说明 示例 环境名称 要尝试连接到的环境的名称 提供一个名称,例如 aze-environ
资源管理器终结点 该 URL 为 https://Management.<appliancename><dnsdomain>
。
若要获取此 URL,请转到设备的本地 Web UI 中的“设备”页。例如, https://management.team3device.teatraining1.com
。az cloud register -n <environmentname> --endpoint-resource-manager "https://management.<appliance name>.<DNS domain>"
下面显示了上述命令的用法示例:
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud register -n az-new-env --endpoint-resource-manager "https://management.team3device.teatraining1.com"
使用以下命令设置活动环境:
az cloud set -n <EnvironmentName>
下面显示了上述命令的用法示例:
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud set -n az-new-env Switched active cloud to 'az-new-env'. Use 'az login' to log in to this cloud. Use 'az account set' to set the active subscription. PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
使用 az login 命令登录到 Azure Stack Edge Pro 环境。 你可以以用户或服务主体身份登录到 Azure Stack Edge Pro 环境。
若要以用户身份登录,请按照以下步骤操作:
可以直接在
az login
命令中指定用户名和密码,或使用浏览器进行身份验证。 如果你的帐户已启用多重身份验证,则必须采用后者。下面显示了
az login
用法的示例:PS C:\Certificates> az login -u EdgeARMuser
使用 login 命令后,系统将提示你输入密码。 提供 Azure 资源管理器密码。
下面显示了提供密码后成功登录的输出示例:
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az login -u EdgeARMuser Password: [ { "cloudName": "az-new-env", "id": "A4257FDE-B946-4E01-ADE7-674760B8D1A3", "isDefault": true, "name": "Default Provider Subscription", "state": "Enabled", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "user": { "name": "EdgeArmUser@localhost", "type": "user" } } ] PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
请记下
id
和tenantId
值,因为这些值分别对应于 Azure 资源管理器订阅 ID 和 Azure 资源管理器租户 ID,后面的步骤中将用到它们。以下环境变量需要设置为作为服务主体运行:
$ENV:ARM_TENANT_ID = "aaaabbbb-0000-cccc-1111-dddd2222eeee" $ENV:ARM_CLIENT_ID = "cbd868c5-7207-431f-8d16-1cb144b50971" $ENV:ARM_CLIENT_SECRET - "<Your Azure Resource Manager password>" $ENV:ARM_SUBSCRIPTION_ID = "<Your subscription ID>"
Azure 资源管理器客户端 ID 是硬编码的。 Azure 资源管理器租户 ID 和 Azure 资源管理器订阅 ID 均存在于你先前运行的
az login
命令的输出中。 Azure 资源管理器客户端密码是你设置的 Azure 资源管理器密码。有关详细信息,请参阅 Azure 资源管理器密码。
将配置文件更改为 2019-03-01 混合版本。 若要更改配置文件版本,请运行以下命令:
az cloud update --profile 2019-03-01-hybrid
下面显示了
az cloud update
用法的示例:PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> az cloud update --profile 2019-03-01-hybrid PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>
步骤 2:创建 VM
系统将向你提供用于创建 VM 的 Python 脚本。 根据你是以用户身份登录还是设置为服务主体,该脚本会相应地获取输入并创建 VM。
- 从安装了 Python 的同一目录运行该 Python 脚本。
.\python.exe example_dbe_arguments_name_https.py cli
运行脚本时,上传 VHD 需要 20-30 分钟。 若要查看上传操作的进度,可以使用 Azure 存储资源管理器或 AzCopy。
下面是成功运行脚本的输出示例。 该脚本将在一个资源组中创建所有资源,使用这些资源来创建 VM,最后删除该资源组,包括它创建的所有资源。
PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2> .\python.exe example_dbe_arguments_name_https.py cli Create Resource Group Create a storage account Uploading to Azure Stack Storage as blob: ubuntu13.vhd Listing blobs... ubuntu13.vhd VM image resource id: /subscriptions/.../resourceGroups/azure-sample-group-virtual-machines118/providers/Microsoft.Compute/images/UbuntuImage Create Vnet Create Subnet Create NIC Creating Linux Virtual Machine Tag Virtual Machine Create (empty) managed Data Disk Get Virtual Machine by Name Attach Data Disk Detach Data Disk Deallocating the VM (to prepare for a disk resize) Update OS disk size Start VM Restart VM Stop VM List VMs in subscription VM: VmName118 List VMs in resource group VM: VmName118 Delete VM All example operations completed successfully! Delete Resource Group Deleted: azure-sample-group-virtual-machines118 PS C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2>