教學課程:建立 Python 3.8 Runbook

本教學課程將逐步引導您在「Azure 自動化」中建立 Python 3.8 Runbook。 Python 2.7 和 3.8 下的 Python Runbook 編譯。您可以直接使用 Azure 入口網站的文字編輯器來編輯 Runbook 的程式碼。

  • 建立簡單的 Python Runbook
  • 測試和發佈 Runbook
  • 執行和追蹤 Runbook 作業的狀態
  • 更新 Runbook 以使用 Runbook 參數啟動 Azure 虛擬機器

必要條件

若要完成本教學課程,您需要:

  • Azure 訂用帳戶。 如果您沒有這類帳戶,可以啟用自己的 MSDN 訂戶權益或註冊免費帳戶

  • 自動化帳戶,用來保存 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,所以還沒有已發佈的版本。

  1. 選取 [發佈] 來發佈 Runbook,然後在系統提示時選取 [是]

  2. 如果您關閉 [MyFirstRunbook_python] 窗格,即會回到 [Runbook] 頁面,您應該會在此看到 [撰寫狀態] 為 [已發佈]

  3. 選取清單中的 [MyFirstRunbook-Python] 名稱,您將回到 [MyFirstRunbook-Python] 窗格中。

    整個頂端的選項可讓您啟動 Runbook、檢視 Runbook、編輯 Runbook 或將其排程為在未來的某個時間啟動,以及其他動作。

  4. 選取 [啟動],然後在 [啟動 Runbook] 窗格開啟時選取 [確定]

  5. 系統會針對您所建立的 Runbook 作業開啟作業窗格。 您可以關閉此窗格,但請讓其保持開啟,以便觀看作業的進度。

  6. 作業狀態會顯示在 [Essential] 下方的 [狀態] 欄位中。 當您測試 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.azure.com/"
identityHeader = os.getenv('IDENTITY_HEADER')
payload={}
headers = {
'X-IDENTITY-HEADER' : identityHeader,
'Metadata' : True
}
response = requests.get(endpoint, headers)
print(response.text)

加入程式碼以建立 Python 計算用戶端,並啟動虛擬機器

若要使用 Azure 虛擬機器,請建立 適用於 Python 的 Azure 計算用戶端的執行個體。

# Initialize client with the credential and subscription.
compute_client = ComputeManagementClient(
    azure_credential,
    SUBSCRIPTION_ID
)

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

其中 MyResourceGroup 是包含虛擬機器的資源群組名稱,而 TestVM 是您要啟動的虛擬機器名稱。

測試並再次執行 Runbook,看看它是否啟動虛擬機器。

使用輸入參數

Runbook 目前針對資源群組和虛擬機器名稱使用硬式編碼值。 現在讓我們來新增程式碼,以從輸入參數獲取這些值。

您使用 sys.argv 變數以取得參數值。 在其他 import 陳述式之後,立即將下列程式碼加入 Runbook:

import sys

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

此程式碼會匯入 sys 模組,並建立兩個變數來保留資源群組和虛擬機器名稱。 請注意,引數清單的元素 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 陣列中的指令碼,情形就和您剛剛新增的程式碼一樣。

輸入您的資源群組名稱做為第一個參數值,並輸入要啟動之虛擬機器的名稱做為第二個參數值。

Enter parameter values

選取 [確定] 以啟動 Runbook。 隨即執行 Runbook,並開始您所指定的虛擬機器。

Python 中的錯誤處理

您也可以使用下列慣例,從 Python Runbook 擷取各種串流,包括 WARNING、ERROR 和 DEBUG 串流。

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)

下一步