チュートリアル: Python 3.8 Runbook を作成する

このチュートリアルでは、Azure Automation で Python 3.8 Runbook を作成する手順について説明します。 Python Runbook は Python 2.7 および 3.8 でコンパイルされます。Azure portal でテキスト エディターを使用して、Runbook のコードを直接編集できます。

  • 簡単な Python Runbook を作成する
  • Runbook をテストして発行する
  • Runbook ジョブの状態を実行、追跡する
  • Runbook パラメーターで Azure 仮想マシンを起動するように Runbook を更新する

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Azure サブスクリプション。 まだお持ちでない場合は、MSDN サブスクライバーの特典を有効にするか、無料アカウントにサインアップしてください。

  • Automation アカウント。Runbook の保存と、マネージド ID を使用した Azure リソースへの認証に使用します。 マネージド ID は、Automation アカウントを作成するときに自動的に作成されます。

  • Azure 仮想マシン。 このチュートリアルでは、このマシンを停止して起動するため、運用 VM を使用しないでください。

新しい Runbook の作成

最初に、Hello World というテキストを出力する簡単な Runbook を作成します。

  1. Azure ポータルで、Automation アカウントを開きます。

    Automation アカウント ページでは、そのアカウントのリソースを簡単に確認できます。 既に資産がいくつかあります。 これらの資産のほとんどは、新しい Automation アカウントに自動的に含まれるモジュールです。

    前提条件に記載されているマネージド ID の有効化も行う必要があります。 これは、[アカウント設定][ID] リソースを表示することで確認できます。

  2. [プロセス オートメーション][Runbook] を選択し、Runbook の一覧を開きます。

  3. [Runbook の作成] を選択して、新しい Runbook を作成します。

  4. Runbook に MyFirstRunbook-Python という名前を付けます。

  5. [Runbook の種類][Python] を選択します。

  6. [ランタイム バージョン][Python 3.8] を選択します。

  7. [作成] を選択して Runbook を作成し、テキスト エディターを開きます。

Runbook にコードを追加する

ここでは、Hello World というテキストを表示する簡単なコマンドを追加します。

print("Hello World!")

[保存] を選択して Runbook を保存します。

Runbook をテストする

Runbook を発行して運用環境で使用できるようにする前に、Runbook をテストして正常に動作することを確認します。 Runbook をテストするときは、ドラフト バージョンを実行し、その出力を対話形式で表示します。

  1. [テスト ウィンドウ] を選択して、 [テスト] ペインを開きます。

  2. [開始] を選択してテストを開始します。 有効なオプションはこれだけです。

  3. Runbook ジョブ が作成され、その状態が表示されます。 最初のジョブの状態は [キューに投入済み] であり、クラウドの runbook worker が使用できるようになるのを待っていることを示します。 worker がジョブを要求すると状態は [Starting](開始中) に変わり、Runbook が実際に実行を開始すると [Running](実行中) に変わります。

  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 の開始] ペインが開いたら [OK] を選択します。

  5. 作成した Runbook ジョブの [ジョブ] ペインが開きます。 このペインは閉じてもかまいませんが、ジョブの進行状況を確認できるように開いたままにしましょう。

  6. ジョブの状態は、[要点][状態] フィールドに表示されます。 ここでの値は、Runbook をテストしたときの状態の値と一致します。

  7. Runbook の状態が [完了] と表示されたら、[出力] タブを選択します。[出力] タブには、Hello World が表示されます。

  8. [出力] タブを閉じます。

  9. [すべてのログ] タブを選択して、Runbook ジョブのストリームを表示します。 出力ストリームには Hello World のみが表示されます。 ただし、このタブには Runbook ジョブの他の (詳細エラーなどの) ストリームも表示される可能性があります (Runbook でそれらのストリームの書き込みが行われている場合)。

  10. [ジョブ] ペインを閉じると、[MyFirstRunbook-Python] ペインに戻ります。

  11. [ジョブ] リソースを選択して、この Runbook の [ジョブ] リソース ページを開きます。 このページには、この Runbook によって作成されたすべてのジョブの一覧が表示されます。 ジョブを 1 回実行しただけであるため、一覧に表示されるジョブは 1 つだけです。

  12. このジョブを選択すると、Runbook を開始したときに表示されたのと同じ [ジョブ] ペインが開きます。 このペインでは、特定の Runbook に対して作成されたジョブの詳細を、時間をさかのぼって見ることができます。

Azure リソースを管理するための認証を追加する

Runbook をテストして発行しましたが、これまでのところ役に立つことは何もしていません。 Azure リソースを管理させることにします。 リソースを管理するには、スクリプトを認証する必要があります。

認証に推奨される方法は、マネージド ID を使用することです。 Automation アカウントを作成するときに、マネージド ID が自動的に作成されます。

これらのサンプルを使用するには、Automation アカウントの Python パッケージ リソースに次のパッケージを追加します。 以降のリンクを使用して、これらのパッケージの WHL ファイルを追加できます。

これらのパッケージを追加するときに、Runbook に適合するランタイム バージョンを選択します。

Note

次のコードは、ランタイム バージョン 3.8 でテストされました。

マネージド ID

マネージド ID を使用するには、それが有効になっていることを確認します。

  • Automation アカウントでマネージド ID が有効になっているかどうかを確認するには、[Automation アカウント]>[アカウント設定]>[ID] に移動し、[状態][オン] に設定します。
  • マネージド ID には、リソースを管理するためのロールが割り当てられます。 仮想マシン リソースの管理のこの例では、仮想マシンを含むリソース グループに "仮想マシン共同作成者" ロールを追加します。 詳細については、「Azure portal を使用して Azure ロールを割り当てる」ページを参照してください

マネージド ID のロールが構成されると、コードの追加を開始できます。

  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 Compute クライアントを作成し、VM を起動する

Azure VM で作業するには、Azure Compute client for Python (Python 用の Azure Compute クライアント) のインスタンスを作成します。

# 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.')

VM を含むリソース グループの名前は MyResourceGroup で、起動する VM の名前は TestVM です。

Runbook をテストし、もう一度実行して、VM が起動するか確認します。

入力パラメーターを使用する

現在、Runbook では、ハード コードされた値がリソース グループと VM の名前に使用されています。 ここでは、入力パラメーターからこれらの値を取得するコードを追加しましょう。

sys.argv 変数を使用して、パラメーター値を取得します。 他の import ステートメントの直後に、Runbook に次のコードを追加します。

import sys

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

このコードにより、sys モジュールがインポートされ、リソース グループと VM の名前を保持する 2 つの変数が作成されます。 引数リストの要素である sys.argv[0] はスクリプトの名前であり、ユーザーが入力したものではありません。

ここでは Runbook の最後の 2 行を変更し、ハード コードされた値を使用する代わりに入力パラメーターの値をご利用いただけます。

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

Python Runbook を ( [テスト] ペイン上で、または発行済みの Runbook として) 開始すると、 [Runbook の開始] ページの [パラメーター] でパラメーターの値を入力できます。

最初のボックスに値を入力し始めると、2 番目のボックスが表示され、順次必要に応じた数のパラメーター値を入力できます。

その値は、前の手順で追加したコードと同様に、sys.argv 配列でスクリプトに使用できます。

最初のパラメーターの値にご利用のリソース グループ名を入力し、2 番目のパラメーターの値に起動する VM の名前を入力します。

Enter parameter values

[OK] を選択して、Runbook を開始します。 Runbook が実行され、指定した VM を起動します。

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)

次のステップ