てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] EDA (Evnet-Driven Ansible) Controller / eda-server 経由で Automation Controller のジョブテンプレートを実行してみる

はじめに

前回の記事で、eda-server をデプロイしてログインできるところまで確認しました。

今回は、Webhook をイベントソースとしてAutomation Controller のジョブテンプレートを実行する仕組みを試します。

以降、念のため AAP のプロダクトとして EDA Controller と区別するために eda-server と表記します。

環境は前回と同じく以下のとおりです。

  • 環境
    • eda-server 2023/06/22 のこのコミット時点
      • 本記事内のドキュメントやファイルへのリンクもこのコミット時に合わせています、最新版は main からたどるなどしてください
      • 将来的な eda-server や、AAP 2.4 としてリリースされたときには事情が異なるかもしれませんのでご注意ください。本記事は、早く試したたくて試した結果をまとめただけという位置づけです
    • Docker version 24.0.2, build cb74dfc
    • Docker Compose version v2.18.1
    • macOS 13.3.1 (a)

■ 環境面の準備

環境変数

前回の記事同様、eda-server を docker-composeup でする際に、Automation Controller の接続情報を環境変数で定義します。

export EDA_CONTROLLER_URL=https://10.0.1.140
export EDA_CONTROLLER_SSL_VERIFY=no

環境変数名の頭が EDA_CONTROLLER_ なので少しややこしいですが、EDA Controller 自体のことを指しているのではなく「EDA の設定として、Automation Controller (またはAWX) の URLの指定をする」という意味合いのようです。

NAT

今回は TCP/5000 で Webhook を受け付けることにします。コンテナではなく、コンテナホスト(今回でいうと mac)自体が Webhook を受けられるようにしたかったので、NAT を追加します。具体的には、tools/docker/docker-compose-stage.yamlpodman というサービスの以下の箇所に 5000:5000 を追加します。

# ...(略)...
services:
  podman:
    user: "1000"
    image: quay.io/containers/podman:${EDA_PODMAN_VERSION:-v4.5}
    privileged: true
    command: podman system service --time=0 tcp://0.0.0.0:8888
    ports:
      - 8888:8888
      - 5000:5000       # 追加
#...(略)...

(本当はどのサービスに設定すればよいか試行錯誤しました)

docker-composeup

前回の記事同様、docker-composeup します。

cd tools/docker
docker-compose -p eda -f docker-compose-stage.yaml up

リポジトリの準備

あとで Project から Rulebook を参照するために、あらかじめ Rulebook を配置したリポジトリの作成が必要です。(現状は、ローカルディレクトリには対応していません)

リポジトリ側で、以下の Rulebooks を rulebooks/hello_jt.yml として作成します。

---
- name: Hello Events
  hosts: all

  sources:
    - ansible.eda.webhook:
        host: 0.0.0.0
        port: 5000

  rules:
    - name: Say Hello
      condition: event.payload.message == "sakana"
      action:
        run_job_template:
          name: Demo Job Template    # 実行したいジョブテンプレート名
          organization: Default

TCP/5000 で Webhook を待ち受けて、飛んできたペイロード内の「messagesakana だったら、Automation Controller のジョブテンプレート Demo Job Template を実行する」という Rulebook です。action には run_job_template を利用しています。

どこの Automation Controller を相手にするかというと、あらかじめ指定した環境変数 EDA_CONTROLLER_URL のアドレスです。Automation Controller への認証情報はあとで定義します。

ポイントはディレクトリ構成です。リポジトリ内の extensions/eda/rulebooks ディレクトリ > rulebooks ディレクトリの順に Rulebook を探すため、いずれかのディレクトリ配下に Rulebook を配置する必要があります。リポジトリトップやその他のディレクトリに Rulebook を置いても、プロジェクトとしてファイルを見つけてくれません。

■ リソース類類の作成

大まかには以下のような流れです。

  • Project の作成
  • Decision Environment 作成
    • Rulebook を実行するコンテナイメージ
    • Automation Controller でいう Execution Environment
  • Automation Controller のトークンの設定
    • 連携のため
  • Rulebook Activation の作成
    • Rulebook の実行可能状態にする

Project の作成

ここからは画面の操作です。http://localhost:8080admin でログインします。

まずは、Rulebook を格納したリポジトリを参照するための Project を作成します。Automation Controller でいうと Playbook があるリポジトリと同じような位置づけです。

画面左メニューの Projects をクリックして一覧画面を開き、Create project をクリックします。

Project 作成画面が開くので、必要事項を入力します。

Create Project

項目 意味 今回の設定値 備考
Name Project の名前 my_project01
SCM URL Rulebook がある SCM の URL https://github.com/akira6592/rulebook-sample.git 現状 SCM TypeGit のみなのため、実質的に git clone したい URL(本記事を書いた後リポジトリの内容は変更する可能性があります。試したときのコミットはこの時点

入力したら、画面下部の Create project をクリックします。

StatusCompleted になることを確認します。失敗したら URL が間違ってないか、認証が必要かなどを確認します。

作成後の詳細画面

Credential について(作成しない)

Credential は、プロジェクトを git clone するときや、後述の Decision Environment のイメージを pull するときに認証情報が必要な場合に作成するものです。

今回はプロジェクトも Decision Environment も認証不要のものを利用するため、Credential は作成しません。

Decision Environment (決定環境) の作成

Rulebook を実行するための環境のコンテナイメージを指定して定義します。Automation Controller でいう Playbook の実行環境の Execution Environment (EE) にあたるものと解釈しています。

まず画面左メニューの Decision Environments をクリックして一覧画面を開き、Create decision environment をクリックします。

Decision Environment 作成画面が開くので、必要事項を入力します。

項目 意味 今回の設定値 備考
Name Decision Environment の名前 my_env01
Image Decision Environment として利用したいイメージ quay.io/ansible/ansible-rulebook 後述の補足参照

現状、SSL Verify 有無的な設定は見当たりませんでした。

入力したら、画面下部の Create decision environment をクリックします。

補足: 利用するイメージ quay.io/ansible/ansible-rulebook について

Decision Environment としてどのイメージを利用すればよいか少々悩みました。Rulebook を実行するための環境なので ansible-rulebook が入ってる必要がありそうです。これをヒントに考えて、気軽に使うには quay.io/ansible/ansible-rulebook が良いだろうと思って、このイメージを指定することにしました。

quay.io/ansible/ansible-rulebook には、ansible-rulebook のほか、ansible.eda コレクションも入っていました。

% docker run -it quay.io/ansible/ansible-rulebook /bin/bash
(app-root) (app-root) pip list
Package             Version
------------------- --------
aiohttp             3.8.4
aiokafka            0.8.1
aiosignal           1.3.1
ansible             8.0.0
ansible-core        2.15.0
ansible-rulebook    1.0.0
ansible-runner      2.3.3
...()...
(app-root) (app-root) ansible-galaxy collection list

# /opt/app-root/lib/python3.9/site-packages/ansible_collections
Collection                    Version
----------------------------- -------
amazon.aws                    6.0.1  
ansible.netcommon             5.1.1  
ansible.posix                 1.5.4  
ansible.utils                 2.10.3 
ansible.windows               1.14.0 
...()...

# /opt/app-root/src/.ansible/collections/ansible_collections
Collection                    Version
----------------------------- -------
ansible.eda                   1.3.8  

ansible.eda 以外のコレクションのイベントソースを利用したいときなどは、別途イメージを用意することになると思います。

なお、eda-server のテストコードにも、Decision Environment として上記のイメージをしているような箇所がありました。

Automation Controller へのトークンの設定

事前に環境変数 EDA_CONTROLLER_URL によって、Automation Controller の URL は指定していますが、認証情報は指定していません。eda-server と Automation Controller を連携するには認証情報も必要なので設定します。

トークンの作成、取得

あらかじめ Automation Controller 側でトークンを作成、取得しておきます。

今回は awxkitawx login コマンド でトークンを作成、取得しました。

% awx login \
  --conf.host https://10.0.1.140 \
  --conf.username (Automation Controllerのユーザー) \
  --conf.password (Automation Controllerパスワード) -k

{
     "token": "ここにトークンが表示されるのでコピーしておく"
}

これで、Automation Controller の admin ユーザーのトークン一覧画面には、以下のように Personal access token が表示されます。

admin のトークン(Automation Controller 側の画面)

他、curl で済ませる方法もあります。

参考情報: 18. Token-Based Authentication — Automation Controller Administration Guide v4.2.0

実運用上は、権限を絞るなどの工夫が必要そうです。

トークンの設定

続いて、先程取得したトークンを eda-server 側に設定します。

画面左メニューの User をクリックします。一覧にデフォルトのユーザー admin が表示されるので admin をクリックします。

ユーザー一覧画面

Controller Tokens をクリックすると、トークン一覧画面が表示されるので、Create controller token をクリックします。

Controller Tokens 画面

トークン設定画面が表示されるので必要事項を入力します。

Create Controller Token

項目 意味 今回の設定値 備考
Name トークンの設定名 my_token01
Token Automation Controller にアクセスするためのトーク (あらかじめ取得したトークン)

入力したら、画面下部の Create controller token をクリックします。

この段階ではトークンが正しいかどうか確認する方法は無さそうです。

Rulebook Activation の作成

もろもろ作成できたので、最後に Rulebook Activation を作成します。 Rulebook Activation は Rulebook を動作可能状態にしたオブジェクトのようなもののようです。

画面左メニューの Rulebook Activations をクリックして一覧画面を開き、Create rulebook activation をクリックします。

Rulebook Acrivation 作成画面が開くので、必要事項を入力します。

Create Rulebook Activation

項目 意味 今回の設定値 備考
Name Rulebook Activation の名前 my_activation01
Project Rulebook があるプロジェクト my_project01 事前に作成したもの
Rulebook プロジェクト内の Rulebook のファイル名 hello_jt.yml 今回は rulebooks ディレクトリ配下
Decision environment Rulebook を実行する環境 my_env01 事前に作成したもの

入力したら、画面下部の Create rulebook activation をクリックします。

作成後の詳細画面で、Activation statusRunning で、Number of Activations1 (作成直後は 0 なので待つ)になったことを確認します。

Activation statusとNumber of Activationsを確認

Rule Audit 画面にははまだ何も表示されていない状態です。

Rule Audit

ここまでで一通り、仕組みができあがりました。

■ Webhook 経由でジョブテンプレートの実行を試す

いよいよ、 Webhook 経由でジョブテンプレートの実行を試します。

Webhook を受け付けているのは実際はコンテナ側ですが、あらかじめ「環境面の準備」で 5000:5000 の NAT を追加しているので、コンテナホスト(今回は mac)で localhost:5000 あてに実行します。

% curl -H 'Content-Type: application/json' -d "{\"message\": \"sakana\"}" localhost:5000

去年 run_playbook の action で試したときは、/endpoint が必要だった記憶がありますが、今回はなしでも動きました。

以下、動画です。(一部本記事と細かい名称などが異なります雰囲気が伝わればと)

Rule Audit には結果が表示されます。

何度が実行した結果

Rule name 列の Say Hello (Rulebook の rulesname で指定したもの)をクリックすると以下のような画面が表示されます。

Details

Events

Actions

Actions 画面で run_job_template をクリックしたら、実行したジョブテンプレートのジョブが表示されるのが気が利いています。

ジョブ実行結果(Automation Controller側画面)

もちろん、Rulebook 内の条件にマッチしないリクエストの場合は、ジョブテンプレートは実行されません。

おわりに

eda-server 経由で Automation Controller のジョブテンプレートを実行するための設定とおためしをしてみました。

ひととおり試すことで、操作感が少し掴めました。Automation Controller と概念が似ている部分もあり、そこまで苦労することはなかったです。

今回は Automation Controller との連携まで含めましたが、単独として試す場合は、Rulebook の actionrun_job_template ではなく debug を利用するのが手軽です。

まだまだ、触りたてなので分からないことや、設定の詰めなどはあるかと思います。AAP 2.4 リリースによって EDA Controller のドキュメントも整備されていくと思うので、ドキュメントも読んでいきたいと思います。