教程:创建 Python 3.8 runbook

本教程介绍了如何在 Azure 自动化中创建 Python 3.8 Runbook。 Python runbook 在 Python 2.7 和 3.8 下编译。可以使用 Azure 门户中的文本编辑器直接编辑 runbook 的代码。

  • 创建简单的 Python Runbook
  • 测试并发布 Runbook
  • 运行 Runbook 作业并跟踪其状态
  • 更新 Runbook 以使用 Runbook 参数启动 Azure 虚拟机

先决条件

要完成本教程,需要:

  • Azure 订阅。 如果还没有 Azure 订阅,可注册一个试用版订阅

  • 自动化帐户,用来保存 runbook 以及使用托管标识向 Azure 资源进行身份验证。 创建自动化帐户时会自动创建托管标识。

  • Azure 虚拟机。 在本教程中,你将启动和停止此计算机,所以它不应为生产 VM。

创建新的 Runbook

首先创建一个输出文本 Hello World 的简单 Runbook。

  1. 在 Azure 门户中,打开自动化帐户。

    通过自动化帐户页面可快速查看此帐户中的资源。 应该已拥有某些资产。 大多数此类资产都是自动包括在新的自动化帐户中的模块。

    还应启用先决条件中提到的托管标识。 可以通过查看“帐户设置”下的“标识”资源来验证这一点。

  2. 在“流程自动化”下选择“Runbook”,以打开 Runbook 的列表。

  3. 选择“创建 runbook”创建一个新的 runbook。

  4. 将该 Runbook 命名为 MyFirstRunbook-Python。

  5. 选择“Python”作为“runbook 类型”。

  6. 选择“Python 3.8”作为“运行时版本”。

  7. 选择“创建”以创建 runbook 并打开文本编辑器 。

将代码添加到 Runbook

现在添加一个简单的命令来输出文本 Hello World

print("Hello World!")

选择“保存”以保存 runbook。

测试 Runbook

在发布 Runbook 使其可在生产中使用之前,需对其进行测试以确保其能正常工作。 测试 runbook 时,可以运行其“草稿”版本并以交互方式查看其输出。

  1. 选择“测试窗格”以打开“测试”窗格 。

  2. 选择“启动”以启动测试 。 此选项应该是唯一的已启用选项。

  3. 将创建一个 Runbook 作业 并显示其状态。 作业状态一开始为“已排队”,表示正在等待云中的 runbook 辅助角色变为可用状态。 在某个辅助角色认领此作业后,作业状态将更改为“正在启动”,然后当 runbook 开始实际运行时,此状态将变为“正在运行” 。

  4. Runbook 作业完成后,会显示其输出。 在此示例中,应会看到 Hello World

  5. 关闭“测试”窗格以返回到画布。

发布和启动 Runbook

创建的 Runbook 仍处于草稿模式。 需要首先发布此 Runbook 才能在生产中运行它。 当发布 Runbook 时,可以用草稿版本覆盖现有的已发布版本。 在此示例中,因此才创建了 Runbook,因此还没有已发布版本。

  1. 选择“发布”以发布该 Runbook,并在出现提示时选择“是” 。

  2. 如果关闭“MyFirstRunbook_python”窗格,则会返回到“Runbook”页,此时会看到“创作状态”为“已发布”。

  3. 在列表中选择 MyFirstRunbook-Python 名称,然后返回到 MyFirstRunbook-Python 窗格。

    可以通过顶部的选项来启动 runbook、查看 runbook、编辑 runbook,或计划在将来的某个时间启动它,以及其他选项。

  4. 选择“启动”,在“启动 Runbook”窗格打开后选择“确定” 。

  5. 此时会为你创建的 runbook 作业打开一个“作业”窗格。 可以关闭此窗格,但请将它保持打开状态,以便查看作业的进度。

  6. 作业状态显示在“概要”下的“状态”字段中。 此处的值与测试 runbook 时的状态值匹配。

  7. runbook 状态显示“已完成”后,选择“输出”选项卡。在“输出”选项卡中,可以看到 Hello World

  8. 关闭“输出”选项卡。

  9. 选择“所有日志”选项卡查看 runbook 作业的流。 在输出流中应该只会看到 Hello World。 但是,此选项卡可以显示 runbook 作业的其他流,例如“详细”流和“错误”(如果 runbook 向它们写入了内容)。

  10. 关闭“作业”窗格以返回到“MyFirstRunbook-Python”窗格。

  11. 选择“作业”资源以打开此 runbook 的“作业”资源页。 此页列出此 Runbook 创建的所有作业。 由于只运行该作业一次,应该只会看到一个列出的作业。

  12. 可以选择此作业,打开在启动 runbook 时查看过的“作业”窗格。 你可以随时返回到此窗格,并查看为特定 Runbook 创建的任何作业的详细信息。

添加身份验证来管理 Azure 资源

已经测试并发布 Runbook,但到目前为止它不执行任何有用的操作。 需要让其管理 Azure 资源。 若要管理资源,脚本必须进行身份验证。

建议使用托管标识进行身份验证。 创建 Azure 自动化帐户时,会自动创建托管标识。

若要使用这些示例,请在自动化帐户的 Python 包资源中添加以下包。 可以使用这些链接为这些包添加 WHL 文件。

添加这些包时,请选择与你的 runbook 匹配的运行时版本。

注意

以下代码已使用运行时版本 3.8 进行过测试。

托管标识

若要使用托管标识,请确保已启用它:

  • 若要验证是否为自动化帐户启用了托管标识,请转到“自动化帐户”>“帐户设置”>“标识”,然后将“状态”设为“启用”。
  • 托管标识具有用于管理资源的角色。 在此管理虚拟机资源的示例中,在包含虚拟机的资源组上添加“虚拟机参与者”角色。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色

配置了托管标识角色后,可以开始添加代码。

  1. 通过选择“MyFirstrunbook-Python”窗格上的“编辑”打开文本编辑器。

  2. 添加以下代码以对 Azure 进行身份验证:

#!/usr/bin/env python3
from azure.identity import DefaultAzureCredential
from azure.mgmt.compute import ComputeManagementClient

SUBSCRIPTION_ID="YOUR_SUBSCRIPTION_ID"

azure_credential = DefaultAzureCredential()

import os
import requests
# printing environment variables
endpoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.chinacloudapi.cn/"
identityHeader = os.getenv('IDENTITY_HEADER')
payload={}
headers = {
'X-IDENTITY-HEADER' : identityHeader,
'Metadata' : True
}
response = requests.get(endpoint, headers)
print(response.text)

添加代码以创建 Python Compute 客户端并启动 VM

若要使用 Azure VM,请创建 Python 的 Azure Compute 客户端实例。

# Initialize client with the credential and subscription.
compute_client = ComputeManagementClient(
    azure_credential,
    SUBSCRIPTION_ID,
    "https://management.chinacloudapi.cn"
)

print('\nStart VM')
async_vm_start = compute_client.virtual_machines.begin_start(
    "MyResourceGroup", "TestVM")
async_vm_start.wait()
print('\nFinished start.')

其中 MyResourceGroup 是包含 VM 的资源组的名称,TestVM 是要启动的 VM 的名称。

再次测试并运行 Runbook,以便看到它启动 VM。

使用输入参数

对于资源组名称和 VM 名称,Runbook 当前使用硬编码的值。 现在我们来添加用于从输入参数获取这些值的代码。

使用 sys.argv 变量获取参数值。 将以下代码添加到 Runbook,使其紧随其他 import 语句之后:

import sys

resource_group_name = str(sys.argv[1])
vm_name = str(sys.argv[2])

此代码将导入 sys 模块,并创建 2 个变量来保存资源组和 VM 名称。 请注意,参数列表 sys.argv[0] 的元素是脚本的名称,不是用户的输入。

现在可以修改 Runbook 的最后两行,以使用输入参数值,而不使用硬编码的值:

async_vm_start = compute_client.virtual_machines.begin_start(
    resource_group_name, vm_name)
async_vm_start.wait()

启动 Python runbook 时(无论是从“测试”窗格中启动,还是将其作为已发布的 runbook 启动),可以在“启动 Runbook”页的“参数”下输入参数的值 。

开始在第一个框中输入值时,会出现第二个框,依此类推,这样就可以根据需要输入任意数量的参数值。

这些值可在 sys.argv 数组中供脚本使用,就像在你刚才添加的代码中那样。

输入资源组的名称作为第一个参数的值,输入 VM 的名称作为第二个参数的值。

Enter parameter values

选择“确定”启动 runbook。 Runbook 运行,并启动指定的 VM。

Python 中的错误处理

还可以使用以下约定从 Python Runbook 中检索各种流,包括“警告”、“错误”和“调试”流。

print("Hello World output")
print("ERROR: - Hello world error")
print("WARNING: - Hello world warning")
print("DEBUG: - Hello world debug")
print("VERBOSE: - Hello world verbose")

以下示例显示了在 try...except 块中使用的此约定。

try:
    raise Exception('one', 'two')
except Exception as detail:
    print ('ERROR: Handling run-time error:', detail)

后续步骤