てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible/EDA] EDA Controller のプロジェクト更新とアクティベーションの再開を REST API で操作する

はじめに

以前の記事で、EDA Controller の REST API の操作を試しました。お作法はなんとなく分かったので次のお題にうつります。

もともと API を使いたくなったきっかけにもなるのですが、Rulebook の書き方を試行錯誤しているとき、

  1. リポジトリ上の Rulebook の修正
  2. プロジェクトの同期
  3. アクティベーションの再開
  4. 新しいアクティベーション履歴のログを開く

という一連の作業が地味に面倒でした。なので今回はこれを API 経由でやるというお題にします。

(現状、アクチベーション再開時にプロジェクトの同期を走らせるような設定は見当たりませんでした。そもそも手元の Rulebook を CLI (ansible-rulebook) で動かすという手もありますが)

  • 環境
    • EDA Controller 1.0.0
      • バージョン番号は rpm のファイル名から類推
      • AAP 2.4 のインストーラーで構築したもの

引き続き、REST API を叩くのには curl コマンドを利用します。

プロジェクトの同期

プロジェクトの同期は /api/eda/v1/projects/{プロジェクトID}/sync/ への `POST です。

今回の対象のプロジェクトID は 1 です。あらかじめ画面操作時の URL か、/api/eda/v1/projects/ への GET で調べておきます。

リクエスト:

curl -X POST 'https://(EDA Controllerのアドレス)/api/eda/v1/projects/1/sync/' -k -s \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Basic (ユーザー:パスワードのBase64エンコード文字列)' \
  | python3 -m json.tool

レスポンス:

{
    "name": "rulebook-sample",
    "description": "",
    "credential_id": null,
    "id": 1,
    "url": "",
    "git_hash": "708782695db79751a2f21d27b689aa815bd59593",
    "import_state": "pending",
    "import_error": null,
    "import_task_id": "99a7682c-41cf-4f37-af19-dfd1a2acfe0a",
    "created_at": "2023-08-05T02:37:52.758560Z",
    "modified_at": "2023-08-07T08:21:47.990192Z"
}

アクティベーションの再開

アクティベーションの再開をするには、予め対象の アクティベーションID を特定しておく必要があります。

準備: アクティベーションID の確認

アクティベーションID の確認は、/api/eda/v1/activations/GET です。

リクエスト:

curl -X GET 'https://(EDA Controllerのアドレス)/api/eda/v1/activations/' -k -s \
  -H 'Authorization: Basic (ユーザー:パスワードのBase64エンコード文字列)' \
  | python3 -m json.tool

レスポンス:

{
    "count": 1,
    "next": null,
    "previous": null,
    "page_size": 20,
    "page": 1,
    "results": [
        {
            "id": 7,
            "name": "hello_webhook",
            "description": "",
            "is_enabled": true,
            "status": "running",
            "decision_environment_id": 1,
            "project_id": 1,
            "rulebook_id": 8,
            "extra_var_id": null,
            "restart_policy": "always",
            "restart_count": 0,
            "rulebook_name": "webhook_debug.yml",
            "rules_count": 1,
            "rules_fired_count": 0,
            "created_at": "2023-08-07T07:47:33.341471Z",
            "modified_at": "2023-08-07T08:27:39.642858Z"
        }
    ]
}

今回は1つしかアクティベーションがないですが、対象の アクティベーション ID は 7 と特定できました。

再開

実際のアクティベーション再開は、/api/eda/v1/activations/{アクティベーションID}/restart/ への POST です。

リクエスト:

curl -X POST 'https://(EDA Controllerのアドレス)/api/eda/v1/activations/7/restart/' -k -s \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Basic (ユーザー:パスワードのBase64エンコード文字列)'

レスポンスはありません。アクティベーションインスタンスの ID がレスポンスに入ってると助かりますが、別途調べることにします(後述)。

画面を見ると、新しいアクティベーションインスタンスが「実行中」になっています。ログはここから追っていけばよいことになります。

アクティベーションが再開された後

おまけ: アクティベーションのログ確認

ログは画面で確認するのでも十分ですが、API でのログの確認方法も調べたのでついでにやってみました。

準備: アクティベーションインスタンス ID 特定

まず、アクティベーションインスタンスのIDを特定する必要があります。先ほどの図でいう 936 です。

アクティベーションインスタンスの一覧表示は /api/eda/v1/activations/{アクティベーションID}/instances/ への GET です。

アクティベーションインスタンスという言葉はこのエンドポイントからとりました)

リクエスト:

curl -X GET 'https://(EDA Controllerのアドレス)/api/eda/v1/activations/7/instances/' -k -s \
  -H 'Authorization: Basic (ユーザー:パスワードのBase64エンコード文字列)' \
  | python3 -m json.tool

レスポンス:

{
    "count": 11,
    "next": null,
    "previous": null,
    "page_size": 20,
    "page": 1,
    "results": [
        {
            "id": 936,
            "name": "hello_webhook",
            "status": "running",
            "activation_id": 7,
            "started_at": "2023-08-07T08:37:44.939620Z",
            "ended_at": null
        },
        {
            "id": 935,
            "name": "hello_webhook",
            "status": "failed",
            "activation_id": 7,
            "started_at": "2023-08-07T08:37:15.507197Z",
            "ended_at": "2023-08-07T08:37:21.123188Z"
        },
        // ...(略)...

"status": "running" な ID が 936 だと特定できました。

ログ確認

アクティベーションインスタンスごととのログの確認をするには、/api/eda/v1/activation-instances/{アクティベーションインスタンスID}/logs/ への GET です。

リクエスト:

curl -X GET 'https://(EDA Controllerのアドレス)/api/eda/v1/activation-instances/936/logs/' -k -s \
  -H 'Authorization: Basic (ユーザー:パスワードのBase64エンコード文字列)' \
  | python3 -m json.tool

レスポンス:

{
    "count": 24,
    "next": "/api/eda/v1/activation-instances/936/logs/?page=2",
    "previous": null,
    "page_size": 20,
    "page": 1,
    "results": [
        {
            "id": 61796,
            "line_number": 0,
            "log": "Attempting to login to registry: registry.redhat.io",
            "activation_instance": 936
        },
        {
            "id": 61799,
            "line_number": 1,
            "log": "Pulling image registry.redhat.io/ansible-automation-platform-24/de-supported-rhel8:latest",
            "activation_instance": 936
        },
        {
            "id": 61800,
            "line_number": 2,
            "log": "Starting Container",
            "activation_instance": 936
        },
        // ...(略)...
        {
            "id": 61817,
            "line_number": 19,
            "log": "2023-08-07 08:37:52,860 - ansible_rulebook.websocket - INFO - websocket wss://host.containers.internal/api/eda/ws/ansible-rulebook connecting\n",
            "activation_instance": 936
        }
    ]
}

現状は、ログの古い順に表示されました。一度に表示するログの件数を指定するには、GET パラメーター ?page_size=30 のように付加します。

ただ、これは GET した時のログまでしかないので、追加分のログを見たいときは再度 GET する必要があります。画面で見ると自動更新されるので、ログ確認についてはやはり画面のほうが便利かなと思います。

おわりに

リポジトリ上の Rulebook を修正した後に操作していた、プロジェクトの同期、アクティベーションの再開、ログの確認までは API で操作してみました。

また、条件は不明ですが、試行錯誤しているときに意図しないアクティベーションインスタンスが作成(結果的に Webhook 待ち受けポートがかぶってエラー)されるときがたまにあったのですが、詳細はおえていません。

まだ改善の余地はありますが、API での操作方法は分かったので、ここからまた工夫したいと思います。