2024年のAnsibleとわたし

みなさんメリークリスマス! Red Hatのさいとう(@saito_hideki)です。

この記事は、Ansible Advent Calendar/Red Hat Advent Calendarの2023年最終日の記事です。

ここ数年、Ansible Advent Calendar/Red Hat Adivent Calendarでは、最終日に翌年のAnsibleプロジェクトに関連する動向を予想したお話を書いてきました。今回は、Event Driven Ansibleのダッシュボードを含めたコントロールプレーンを提供するためのアップストリームプロジェクトである EDA Serverを取り上げてます。

具体的には、2024年のEDA Serverを体験するために、現在の開発版のインストールと起動方法についてご紹介しようと思います。今年も文字多めです。

2023年に公開された新技術

2023年のトピックは、@akira6592さんが、Ansible Advent Calendar 2023 12月24日の記事([Ansible] 2023年の Ansible 関連リリースや動向まとめ)としてまとめてくれています(感謝!)

そこで言及されている通り、2023年には新たに以下の2つのプロダクトがリリースされました。

  1. Event-Driven-Ansible -> 以降EDA
  2. Ansible Lightspeed -> 以降 Lightspeed

これらについては、ダウンストリームのRed Hat Ansible Automation Platform 2.4の新機能として、Ansible Automation Platform 2.4 注目の新機能紹介でまとめられていますので、興味のある方はご一読ください。

EDAとLightspeedは、これまでにない新しい試みでした。2024年は、これらのプロジェクトの機能追加とバグフィックスを中心として「改修と改善」がメイントピックになりそうで、現時点での予想として来年はびっくりするような飛び道具は、おそらくなしです。

EDA Serverの2024年を覗く

今回の開発環境は以下のスペックのFedora39のVirtualMachineです。

OS: Fedora39(x86_64)
CPU: 2
Memory: 4096
HDD: 20GB

以降の手順は、基本的には公式ドキュメントDevelopment environment setupに従ってFedora39にEDA Serverをインストールすることを想定して書いています。poetry.logでガッチリとPythonライブラリのバージョンが固定されているので、開発環境のディストリビューションやバージョンを外すとちょっと厄介です。注意しましょう。

EDA Serverのビルドに必要となるパッケージ群をインストールします。今回は、プラットフォームにFedora39を利用し、コンテナエンジンとしてPodmanを利用します。

$ sudo dnf install libffi-devel libxml2-devel xmlsec1-devel xmlsec1-openssl-devel libtool-ltdl-devel openldap-devel python3.11 python3.11-devel podman

podman.socketサービスをrootlessで起動します。サービスのステータスとAPIアクセスを念のため確認しておきましょう。

$ systemctl --user enable --now podman.socket
Created symlink /home/hsaito/.config/systemd/user/sockets.target.wants/podman.socket → /usr/lib/systemd/user/podman.socket.
$ systemctl --user status podman.socket
● podman.socket - Podman API Socket
     Loaded: loaded (/usr/lib/systemd/user/podman.socket; enabled; preset: disabled)
     Active: active (listening) since Sun 2023-12-24 21:45:10 JST; 22s ago
   Triggers: ● podman.service
       Docs: man:podman-system-service(1)
     Listen: /run/user/1000/podman/podman.sock (Stream)
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/podman.socket
$ curl -s --unix-socket /run/user/1000/podman/podman.sock http://d/v3.0.0/libpod/info | jq .version
{
  "APIVersion": "4.8.1",
  "Version": "4.8.1",
  "GoVersion": "go1.21.4",
  "GitCommit": "",
  "BuiltTime": "Tue Dec  5 21:00:50 2023",
  "Built": 1701777650,
  "OsArch": "linux/amd64",
  "Os": "linux"
}

docker-composeをインストールします。Ansibleのさまざまなプロジェクト(Ansible Core/AWX/Galaxy NG/EDA Server等々)の開発環境の構築手法は、プロジェクト毎にバラバラでまったく統一されていませんが、「コンテナをビルドしてdocker-composeでサービスとして起動する」という方法が主流です。

$ mkdir ~/.local/bin
$ curl -L https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 > ~/.local/bin/docker-compose
$ chmod +x ~/.local/bin/docker
$ docker-compose --version
Docker Compose version v2.23.3

EDA Serverの開発環境用にvirtualenvを作成します。Fedora39のデフォルトPythonインタプリタは3.12ですが、EDA Serverの開発環境は、現時点(2023年12月25日)では、Python3.9から3.11までを想定しているため、ここでは事前にインストールしておいたPython.3.11を利用しています。

$ python3.11 -m venv ~/work/venv
$ source ~/work/venv/bin/activate
(venv) pip install -U pip

EDA Serverは、Djangoのアプリケーションです。起動に必要とするPythonライブラリ群はpoetryとre-commitを利用してインストールします。そのまえに、これらのツールをpipでインストールしておきましょう。

(venv)$ pip install pre-commit
(venv)$ pip install poetry

docker-composeや、EDA Serverの管理コマンドのラッパーとして振る舞ってくれるTaskfile(taskコマンド)をインストールします。taskコマンドがラップしてくれる機能はこちらから確認できます。

Taskfileやpoetryは、他のプロジェクトの開発環境構築では、これまで使われてこなかった仕組みなので、ちょっと新鮮です。

(venv)$ sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin
(venv)$ task --version
Task version: v3.33.1 (h1:JJSRANHH7RQrr5Z2CTvSnTH7iWlfBlKV2W2O0JiZoLk=)

ソースコードをチェックアウトし、taskコマンドでビルドに必要となるモジュール群をインストールします。

(venv)$ git clone https://github.com/ansible/eda-server.git/
(venv)$ cd eda-server
(venv)$ task dev:init
task: [dev:init] poetry install -E dev
Installing dependencies from lock file

Package operations: 109 installs, 11 updates, 0 removals

  • Downgrading certifi (2023.11.17 -> 2023.7.22): Pending...
  • Downgrading cffi (1.16.0 -> 1.15.1): Pending...
  • Downgrading charset-normalizer (3.3.2 -> 3.1.0): Pending...
  • Downgrading idna (3.6 -> 3.4): Pending...
  • Installing pyasn1 (0.5.0): Pending...
  • Downgrading urllib3 (2.1.0 -> 1.26.15): Pending...
[...]
Installing the current project: aap-eda (0.1.0)
task: [dev:init] pre-commit install
pre-commit installed at .git/hooks/pre-commit

続いて、taskコマンドからdockerコンテナをビルドします。ここではdocker-composeを利用するので、環境変数DOCKER_HOSTに、podman.serviceのsocketファイルを指定してから実行します。DOCKER_HOSTの設定は、必要に応じて.bashrcなどのrcファイルに追加しておいてください。

(venv)$ podman info -f '{{.Host.RemoteSocket.Path}}'
/run/user/1000/podman/podman.sock
(venv)$ export DOCKER_HOST="unix://`podman info -f '{{.Host.RemoteSocket.Path}}'`"
(venv)$ echo $DOCKER_HOST
DOCKER_HOST=unix:///run/user/1000/podman/podman.sock
(venv)$ docker-compose ls
NAME                STATUS              CONFIG FILES

(venv)$ task docker:build
task: [docker] docker-compose -p eda -f tools/docker/docker-compose-dev.yaml build
[+] Building 5.1s (0/1)                                                                        docker-container:default
 => [eda-api internal] booting buildkit                                                              5.1s
 => => pulling image moby/buildkit:buildx-stable-1                                                   5.1s
[...]
 => => exporting layers                                                                             14.3s
 => => exporting manifest sha256:4051e5517b307516aa49095b0b1aa70647fa0395ca993e15b4a36bafdff52d78    0.1s
 => => exporting config sha256:c91c61d366dc2b91c0b0e6aa7d9814c0e9ac37e53ae7d242c1fbf5aaa7c1d863      0.1s
 => => sending tarball                                                                              14.1s
 => [eda-api] importing to docker

(venv)$ podman images
REPOSITORY               TAG              IMAGE ID      CREATED        SIZE
localhost/aap-eda        latest           c91c61d366dc  2 minutes ago  1 GB
docker.io/moby/buildkit  buildx-stable-1  be698b50dea4  3 weeks ago    173 MB

環境変数EDA_CONTROLLERにAutomation controllerやAWXのURLを指定し、taskコマンドでEDA Serverを起動します。task docker:updocker-compose up -dを実行します

(venv)$ export EDA_CONTROLLER_URL=https://<IPADDRESS>
(venv)$ task docker:up
[...]
[+] Running 14/14
 ✔ Network eda_default                    Created              0.0s
 ✔ Volume "eda_podman_data"               Created              0.1s
 ✔ Volume "eda_postgres_data"             Created              0.1s
 ✔ Container eda-redis-1                  Healthy              1.0s
 ✔ Container eda-podman-pre-setup-1       Started              1.0s
 ✔ Container eda-postgres-1               Healthy              1.5s
 ✔ Container eda-podman-1                 Started              0.6s
 ✔ Container eda-eda-scheduler-1          Started              0.7s
 ✔ Container eda-eda-api-1                Healthy              0.4s
 ✔ Container eda-eda-activation-worker-2  Started              0.4s
 ✔ Container eda-eda-ui-1                 Started              0.8s
 ✔ Container eda-eda-ws-1                 Started              0.8s
 ✔ Container eda-eda-default-worker-1     Started              0.7s
 ✔ Container eda-eda-activation-worker-1  Started              0.4s

最後に、taskコマンドから管理ユーザアカウント(admin)のパスワードを設定しましょう。実際にはaap-eda-manage changepasswordを実行しています。

(venv)$ $ task manage -- changepassword admin
Changing password for user 'admin'
Password: changeme2024
Password (again): changeme2024
Password changed successfully for user 'admin'

EDA Serverのフロントエンドは、Port:8443でListenします。firewalldでPort:8443を許可しておきましょう。

(venv)$ sudo firewall-cmd --zone=public --permanent --add-port=8443/tcp
success
(venv)$ sudo firewall-cmd --reload
success

ダッシュボードにアクセスし、adminアカウントでログインしてみましょう。/eda/を忘れずに。

  • https://EDA_SERVER_URL:8443/eda/

ログイン画面が表示され、これでeda-serverリポジトリのmainブランチからビルドしたEDA Serverにログインできます。

起動したコンテナの確認

taskコマンドで起動したコンテナには、ビルド元になったソースコードのパスがマウントされています。必要に応じて自身でソースコードを改変し、taskコマンドでdown->upすれば、改修内容もチェックできますね。

(venv)$ podman inspect eda-eda-api-1
[...]
          "Mounts": [
               {
                    "Type": "bind",
                    "Source": "/home/hsaito/work/eda-server",
                    "Destination": "/app/src",
                    "Driver": "",
                    "Mode": "",
                    "Options": [
                         "rbind"
                    ],
                    "RW": true,
                    "Propagation": "rprivate"
               }
          ],
[...]

サービスの停止と起動方法は以下の通りです。

(venv)$ task docker:down
(venv)$ task docker:up

まとめ

この記事では、EDA Serverをmainブランチからビルドすることで、コントロールプレーンの最新のダッシュボードを含めた機能を体験する方法をご紹介しました。2024年は「改修と改善」の年になるでしょう。個人的には2023年は何だか忙しく、アップストリームに貢献することがほとんできない年でした。今回の記事に書いた開発版の構築手法を活用しながら、2024年はもう少しアップストリームに貢献したいなと考えてます。みなさんも是非 ;)

それではみなさん、2024年もHappy Automation!

参考情報

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。