AWX をインストールした後の Server Error を解決したかった話

Pocket

この記事は、 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 がリリース された。ちょっとペース早すぎない!?

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください