この記事は、 Ansible AWX をインストールしたときに、 Server Error に なったりならなかったりする 問題に対処したときのポエムだ。
はじめに断っておくが、最終的に AWX 8.0.0 で解消しているっぽいものの、 原因や正確な条件などは不明なままである。
また後述するが、 (タイトルに反して)おそらく Ansible AWX の問題ではなく、 postgres:9.6 の docker イメージの問題ではないかと思われる。
まず、 問題が起きている状況をまとめると、以下のような状況だ。
最後の2つが非常に厄介で、全て VirtualBox で同じリソースを割り当てた VM のゲストマシンに、 同じ設定で CentOS をインストールしているのにもかからず、問題が発生したりしなかったりする。
訳がわからない。
VM のホストをいろいろ買えつつ試してみたところ、上記のような状態の時に問題が派生しやすい気がするが、ハッキリ「そうだ」と言えるほどの回数は試せていない。
最初、 良くある SELinux 関係の問題かと思って SELinux を切って 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
[email protected]:/# psql --list -U awx
psql: FATAL: database "postgres" does not exist
以上のことから、 pg_hba.conf の書き換えや、 PostgreSQL DB の初期化といった、 初期化プロセスが実行されずに「初期化済み」扱いされているのが原因ではないかと、予想がつく。
awx リポジトリ内で同様の不具合が挙がっていないか確認してみたが、 似たような問題は挙がっている ものの、それそのものズバリの回答は見つからなかった。
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 の初期化プロセスも働いていないことを考えると、
# look specifically for PG_VERSION, as it is expected in the DB dir
if [ ! -s "$PGDATA/PG_VERSION" ]; then
# "initdb" is particular about the current user existing in "/etc/passwd", so we use "nss_wrapper" to fake that if necessary
# see https://github.com/docker-library/postgres/pull/253, https://github.com/docker-library/postgres/issues/359, https://cwrap.org/nss_wrapper.html
この条件分岐の部分が、意図通り働かないことがあるのではないかと思う。
しかし、私は docker に関してはほとんどシロウトなので、ここから docker イメージの定義ファイルを辿って、どこがおかしいのかを調査するのはちょっと難しい。。。
…とかなんとかやってるうちに、 AWX 8.0.0 がリリース されてしまった。
8.0.0 で AWX のインストールを試してみると、ぱったりと問題が発生しなくなった。
awx_postgres コンテナを作成する docker イメージが、 postgres:9.6 から postgres:10 に変更 になったからではないかと考えているが、具体的にどう変わったかは正直わからない。
ひょんなことから、原因は不明ながら問題が解決してしまったので、これ以上調査する気力も失せて、私は考えるのをやめた。
追記: そして、記事を書いた直後に AWX 9.0.0 がリリース された。ちょっとペース早すぎない!?
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント