はじめに
以前の記事で、EDA Controller の REST API の操作を試しました。お作法はなんとなく分かったので次のお題にうつります。
もともと API を使いたくなったきっかけにもなるのですが、Rulebook の書き方を試行錯誤しているとき、
という一連の作業が地味に面倒でした。なので今回はこれを API 経由でやるというお題にします。
(現状、アクチベーション再開時にプロジェクトの同期を走らせるような設定は見当たりませんでした。そもそも手元の Rulebook を CLI (ansible-rulebook) で動かすという手もありますが)
引き続き、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 での操作方法は分かったので、ここからまた工夫したいと思います。