てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] EDA (Evnet-Driven Ansible) Controller / eda-server を docker compose でデプロイして画面を探索してみる

はじめに

Event-Driven な Ansible を実現するために去年から ansible-rulebook が登場しました。

今年は先日の AnsibleFest での発表頃から更に話が進み、Event-Driven Ansible の実行基盤とも言える、EDA (Evnet-Driven Ansible) Controller の足音が聞こえてきました。

AAP 2.4 に導入される予定とのことです。

それに先立ってということか、本日 ansible/eda-server というリポジトリが公開されました。

github.com

README.md には以下のような説明があります。

This repository contains the source code for the Event Driven Ansible Controller, aka EDA-Controller.

(補足: もともと同名のリポジトリはあったのですが、少し前に eda-server-prototype という名前に変更され、しばらくメンテナンスもされていません)

ドキュメントを見ると、デプロイ方法として docker-compose と minukube があるようです。この記事では、docker-compose でデプロイした結果を簡単にまとめます。ドキュメントどおりです。

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

  • 環境
    • eda-server 2023/06/22 のこのコミット時点
      • 本記事内のドキュメントへリンクもこのコミット時に合わせています、最新版は main からたどるなどしてください
    • Docker version 24.0.2, build cb74dfc
    • Docker Compose version v2.18.1
    • macOS 13.3.1 (a)

[2023/06/27 追記] AAP 2.4 としての EDA Controller のドキュメントも公開されました、

Chapter 3. Installation of Event-Driven Ansible controller Red Hat Ansible Automation Platform 2.4 | Red Hat Customer Portal

デプロイ

git clone

まずリポジトリごと clone します。

git clone git@github.com:ansible/eda-server.git

なお、ドキュメントには、リポジトリ名が ansible/aap-eda とありますが、何かの名残が残ってるだけで誤りです。(修正PR提出済み)

AWX 連携設定

おそらくイベント受信時のアクションとして AWXやAutomation Controller のジョブテンプレートを実行するための目的だと思いますが、連携のための設定として環境変数を指定します。

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

ただデプロイするだけであれば不要そうです。

docker-compose

docker-compose*.yml 系のファイルがあるディレクトリに移動します。

cd tools/docker

一応ドキュメント通り、まず pull します。

docker-compose -p eda -f docker-compose-stage.yaml pull

こんなログが出ました。

# ログ
% docker-compose -p eda -f docker-compose-stage.yaml pull
[+] Pulling 55/6
 ✔ eda-worker Skipped - Image is already being pulled by eda-api                                                                                                                            0.0s 
 ✔ redis 5 layers [⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                                           66.8s 
 ✔ eda-ui 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                                 74.2s 
 ✔ postgres 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                              149.6s 
 ✔ podman 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                                                                      184.4s 
 ✔ eda-api 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled 

続いて up します。

docker-compose -p eda -f docker-compose-stage.yaml up

こんなログがでました。

# ログ
% docker-compose -p eda -f docker-compose-stage.yaml up

[+] Building 0.0s (0/0)                                                                                                                                                                          
[+] Running 9/9
 ✔ Network eda_default         Created                                                                                                                                                      0.5s 
 ✔ Volume "eda_postgres_data"  Created                                                                                                                                                      0.1s 
 ✔ Container eda-redis-1       Created                                                                                                                                                      2.8s 
 ✔ Container eda-podman-1      Created                                                                                                                                                      2.7s 
 ✔ Container eda-postgres-1    Created                                                                                                                                                      2.7s 
 ✔ Container eda-eda-worker-2  Created                                                                                                                                                      0.8s 
 ✔ Container eda-eda-api-1     Created                                                                                                                                                      0.8s 
 ✔ Container eda-eda-worker-1  Created                                                                                                                                                      0.8s 
 ✔ Container eda-eda-ui-1      Created                                                                                                                                                      0.3s 
Attaching to eda-eda-api-1, eda-eda-ui-1, eda-eda-worker-1, eda-eda-worker-2, eda-podman-1, eda-postgres-1, eda-redis-1
eda-redis-1       | 1:C 22 Jun 2023 08:33:57.341 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
eda-redis-1       | 1:C 22 Jun 2023 08:33:57.350 # Redis version=7.0.11, bits=64, commit=00000000, modified=0, pid=1, just started
eda-redis-1       | 1:C 22 Jun 2023 08:33:57.350 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
eda-redis-1       | 1:M 22 Jun 2023 08:33:57.352 * monotonic clock: POSIX clock_gettime
eda-redis-1       | 1:M 22 Jun 2023 08:33:57.362 * Running mode=standalone, port=6379.
eda-redis-1       | 1:M 22 Jun 2023 08:33:57.362 # Server initialized
eda-redis-1       | 1:M 22 Jun 2023 08:33:57.363 * Ready to accept connections
eda-postgres-1    | The files belonging to this database system will be owned by user "postgres".
eda-postgres-1    | This user must also own the server process.
...()...
eda-eda-api-1     | 2023-06-22 08:34:57 [INFO   ] Superuser created
eda-eda-api-1     | 2023-06-22 08:34:57 [INFO   ]        User: admin
eda-eda-api-1     | 2023-06-22 08:34:57 [INFO   ]        Password: testpass
eda-eda-api-1     | 2023-06-22 08:34:57 [INFO   ]        Email: admin@test.com
...()...
a-eda-api-1     | Starting ASGI/Daphne version 4.0.0 development server at http://0.0.0.0:8000/
eda-eda-api-1     | Quit the server with CONTROL-C.
eda-eda-api-1     | 2023-06-22 10:48:36,536 INFO     HTTP GET /_healthz 200 [0.03, 127.0.0.1:37302]
eda-eda-ui-1      | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
eda-eda-ui-1      | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
eda-eda-ui-1      | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
eda-eda-ui-1      | 10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?)
eda-eda-ui-1      | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
eda-eda-ui-1      | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
eda-eda-ui-1      | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
eda-eda-ui-1      | /docker-entrypoint.sh: Configuration complete; ready for start up
...(以降、30秒ごとに /_healthz あての GET のログ)...

ちなみに docker-compose ps はこんな感じでした。DB や Redis もいますね。

% docker-compose -f docker-compose-stage.yaml ps
NAME                IMAGE               COMMAND             SERVICE             CREATED             STATUS              PORTS
(a7) akira@mbp16 docker % docker-compose -p eda -f docker-compose-stage.yaml ps
NAME                IMAGE                             COMMAND                  SERVICE             CREATED             STATUS                   PORTS
eda-eda-api-1       quay.io/ansible/eda-server:main   "/bin/bash -c 'aap-e…"   eda-api             2 hours ago         Up 3 minutes (healthy)   0.0.0.0:8000->8000/tcp
eda-eda-ui-1        quay.io/ansible/eda-ui:main       "/docker-entrypoint.…"   eda-ui              2 hours ago         Up 2 minutes             80/tcp, 0.0.0.0:8080->8080/tcp
eda-eda-worker-1    quay.io/ansible/eda-server:main   "aap-eda-manage rqwo…"   eda-worker          2 hours ago         Up 3 minutes             
eda-eda-worker-2    quay.io/ansible/eda-server:main   "aap-eda-manage rqwo…"   eda-worker          2 hours ago         Up 3 minutes             
eda-podman-1        quay.io/containers/podman:v4.5    "podman system servi…"   podman              2 hours ago         Up 3 minutes             0.0.0.0:8888->8888/tcp
eda-postgres-1      docker.io/library/postgres:13     "docker-entrypoint.s…"   postgres            2 hours ago         Up 3 minutes (healthy)   0.0.0.0:5432->5432/tcp
eda-redis-1         docker.io/library/redis:7         "docker-entrypoint.s…"   redis               2 hours ago         Up 3 minutes (healthy)   0.0.0.0:6379->6379/tcp

ログイン

ブラウザで http://localhost:8080 を開きます。(up のログに :8000 が出てますが、画面は :8080 のようです。)

ログイン画面

初期の管理者ユーザーは、up したときのログにも表示されますが、ユーザー名 admin パスワード testpass です。このユーザー情報でログインします。

ログイン後トップは以下のような画面でした。ブラウザの言語設定に合わせて日本語表示になりました。

ログイン後トップ(日本語)

日本語表示だと、ドキュメントの突き合わせが難しくなることもありそうなので、ブラウザの言語設定を英語にしました。

ログイン後トップ(英語)

探索

各メニューをクリックして探索してみます。

Rule Audit

まだ何も表示されません。おそらく、実行ログ的なものが表示されるのだと思います。AWX や Automation Controller でいうジョブでしょうか。

Rule Audit

Rulebook Activations

Rulebook Activations を作成したり、作成済みの一覧が表示されたりする画面のようです。

Rulebook Activations

説明として

Rulebook activations are rulebooks that have been activated to run.

とあります。Rulebook activationは、Rulebook (条件やアクションを定義したファイル)実行可能状態にすること(したもの)のようです。

Create rulebook activation ボタンをクリックすると以下のような作成画面になりました。

Create rulebook activation

各入力項目はおそらく以下のようなことだと思います。

  • Project: Rulebook があるジェクト(≒リポジトリ。Resources > Project で予め作成)
  • Rulebook: Rulebook のファイル名
  • Decision environment: Rulebook を実行するためのコンテナイメージ定義(日本語では 決定環境。Resources > Decision Environments で予め作成)

Projects

Project の作成画面は以下のとおりです。AWX や Automation Controller の Project と似てますね。

Project 作成画面

Credentials

Credential の作成画面は以下のとおりです。

Credential 作成画面

Credential type では以下の3つが選択できました。Project や 後述の Decision Environment に紐づけて使用するということでしょう。

Credential type

Decision Environments

Decision Environment の作成画面は以下のとおりです。

Decision Environments 作成画面

AWX や Automation Controller における、Execution Environment が Ansible を実行する環境であるのに対して、Decision Environment は Rulebook を実行するために ansible-rulebook が入った環境ということだと思います。

User

User 一覧画面は以下の通り。今回のデプロイ方法では デフォルト admin のみでした。

User 一覧

ユーザーごとに Controller Token を紐づけできるようです。このトークンを使って、デプロイ時に環境変数で指定した AWX や Automation Controller と連携(ジョブテンプレート実行など)できるということでしょうか。結構大事な設定そうですが、今回は未検証です。

Create Controller Token

Role

Role 一覧画面は以下の通りです。

Role 一覧

おわりに

eda-server(EDA-Controller)をデプロイして簡単に画面を探索してみました。少し新しい用語が出てきてますが、 AWX や Automation Controller の用語に近いものもあります。

動作の方は全然検証できていないので、今後やってみたいと思います。

おそらくその前に AAP 2.4 がリリースされて、ドキュメントも公開されると思うので、ドキュメントを読みたいところです。