この記事は、 Ansible AWX をインストールしたときに、 Server Error に なったりならなかったりする 問題に対処したときのポエムだ。
はじめに断っておくが、最終的に AWX 8.0.0 で解消しているっぽいものの、 原因や正確な条件などは不明なままである。
また後述するが、 (タイトルに反して)おそらく Ansible AWX の問題ではなく、 postgres:9.6 の docker イメージの問題ではないかと思われる。
発生した問題の状況
まず、 問題が起きている状況をまとめると、以下のような状況だ。
- AWX を Docker-Compose を使ってインストール
- AWX のバージョンは、直近の 7.0.0 または 6.1.0 (どちらでも発生する)
- インストール先は CentOS 7.7 1908 の VirtualBox のゲストマシン
- どういうわけか、 問題が起きる場合と起きない場合がある
- 仮想ストレージが (SSD ではなく) HDD 上にあると発生しやすい気がする
- VM のホストが、 バックエンドで I/O をガリガリやっていると発生しやすい気がする
- VM のホストが、 (バッテリー駆動などで)で省電力モードになっていると発生しやすい気がする
- 問題が発生するかどうかは、インストール後の最初の起動で決まる。
- 最初の起動で問題が発生すれば、その後も発生し続ける。
- 逆に、最初の起動で問題が発生しなければ、その後は発生しない。
最後の2つが非常に厄介で、全て VirtualBox で同じリソースを割り当てた VM のゲストマシンに、 同じ設定で CentOS をインストールしているのにもかからず、問題が発生したりしなかったりする。
訳がわからない。
VM のホストをいろいろ買えつつ試してみたところ、上記のような状態の時に問題が派生しやすい気がするが、ハッキリ「そうだ」と言えるほどの回数は試せていない。
最初、 良くある SELinux 関係の問題かと思って SELinux を切って AWX のインストールをやり直してみたが、何も変わらなかった。
AWX エラーの内容
上記スクショの "Server Error" "A server error has occurred" のメッセージだけでは、どんな問題が発生しているのか全くわからないので、とりあえず各コンテナのログをみてみる。
どうやら、 awx_postgres コンテナで、以下のようなエラーが発生しているようだ。
FATAL: no pg_hba.conf entry for host "172.18.0.2", user "awx", database "awx", SSL off
問題が起きていない環境と、起きている環境で pg_hba.conf (※) を比べると、
問題が起きていない環境では、このファイルの末尾に
host all all all md5
が追記されているという違いがある。
(※: pg_hba.conf は awx_postgres コンテナの /var/lib/postgresql/data/pgdata/pg_hba.conf
にあるほか、 docker ホスト側でも /tmp/pgdocker/pgdata/pg_hba.conf
として永続化されている。 (postgres_data_dir 変数が初期値の場合。))
この行がないため、 WEB サービスを走らせているコンテナから PostgreSQL を動かしているコンテナへのアクセスが拒否されているようだ。
しかし、問題となっている環境で pg_hba.conf を書き換えても、別のエラーが発生して Server Error が表示される問題は解決しない。
問題が起きる環境と起きない環境を更に詳しく比べると、 PostgreSQL の DB が作成すらされていないことがわかった。
本来なら、 awx_postgres コンテナ内に awx ユーザで DB が作成されている筈なのにもかかわらず、以下のように コンテナに入って psql の --list オプションを実行すると、エラーになってしまう。
$ sudo docker exec -it awx_postgres /bin/bash
root@xxxxxxxxxxxx:/# psql --list -U awx
psql: FATAL: database "postgres" does not exist
以上のことから、 pg_hba.conf の書き換えや、 PostgreSQL DB の初期化といった、 初期化プロセスが実行されずに「初期化済み」扱いされているのが原因ではないかと、予想がつく。
awx リポジトリ内で同様の不具合が挙がっていないか確認してみたが、 似たような問題は挙がっている ものの、それそのものズバリの回答は見つからなかった。
pg_hba.conf を書き換えているのは誰だ
audit などを使って pg_hba.conf に関するシステムコールを監視して、 何が host all all all md5 と追記しているのかを確認してみる。
その結果、書き換えを行っているのは
bash /usr/local/bin/docker-entrypoint.sh postgres
のプロセスだとわかった。
AWX 7.0.0 インストール時の docker-compose.yml も、 AWX 6.1.0 インストール時の docker-compose.yml も、 postgres:9.6 の docker イメージを使っていることがわかる。
このため、 上記の pg_hba.conf の書き換えを行っている docker-entrypoint.sh は、 postgres:9.6 イメージの Dockerfile のエントリーポイントである この docker-entrypoint.sh だろう。
前後の PostgreSQL の初期化プロセスも働いていないことを考えると、
この条件分岐の部分が、意図通り働かないことがあるのではないかと思う。
しかし、私は docker に関してはほとんどシロウトなので、ここから docker イメージの定義ファイルを辿って、どこがおかしいのかを調査するのはちょっと難しい。。。
AWX 8.0.0 がリリースされたら解決してた
…とかなんとかやってるうちに、 AWX 8.0.0 がリリース されてしまった。
8.0.0 で AWX のインストールを試してみると、ぱったりと問題が発生しなくなった。
awx_postgres コンテナを作成する docker イメージが、 postgres:9.6 から postgres:10 に変更 になったからではないかと考えているが、具体的にどう変わったかは正直わからない。
ひょんなことから、原因は不明ながら問題が解決してしまったので、これ以上調査する気力も失せて、私は考えるのをやめた。
追記: そして、記事を書いた直後に AWX 9.0.0 がリリース された。ちょっとペース早すぎない!?