tag:crieit.net,2005:https://crieit.net/tags/AWX/feed 「AWX」の記事 - Crieit Crieitでタグ「AWX」に投稿された最近の記事 2019-11-01T20:22:07+09:00 https://crieit.net/tags/AWX/feed tag:crieit.net,2005:PublicArticle/15523 2019-11-01T02:12:38+09:00 2019-11-01T20:22:07+09:00 https://crieit.net/posts/AWX-Server-Error AWX をインストールした後の Server Error を解決したかった話 <p>この記事は、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx">Ansible AWX</a> をインストールしたときに、 Server Error に <strong>なったりならなかったりする</strong> 問題に対処したときのポエムだ。</p> <p><a href="https://crieit.now.sh/upload_images/e835b521a9d07ba5a1f19762bb3928fe5dbb159674c75.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e835b521a9d07ba5a1f19762bb3928fe5dbb159674c75.png?mw=700" alt="1921_ansible_awx_error_00.png" /></a></p> <p>はじめに断っておくが、最終的に AWX 8.0.0 で解消しているっぽいものの、 原因や正確な条件などは不明なままである。<br /> また後述するが、 (タイトルに反して)おそらく Ansible AWX の問題ではなく、 postgres:9.6 の docker イメージの問題ではないかと思われる。</p> <h2 id="発生した問題の状況"><a href="#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C%E3%81%AE%E7%8A%B6%E6%B3%81">発生した問題の状況</a></h2> <p>まず、 問題が起きている状況をまとめると、以下のような状況だ。</p> <ul> <li>AWX を <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/INSTALL.md#docker-compose">Docker-Compose</a> を使ってインストール</li> <li>AWX のバージョンは、 7.0.0 または 6.1.0 (どちらでも発生する)</li> <li>インストール先は CentOS 7.7 1908 の VirtualBox のゲストマシン</li> <li>どういうわけか、 <strong>問題が起きる場合と起きない場合がある</strong> <ul> <li>仮想ストレージが (SSD ではなく) HDD 上にあると発生しやすい気がする</li> <li>VM のホストが、 バックエンドで I/O をガリガリやっていると発生しやすい気がする</li> <li>VM のホストが、 (バッテリー駆動などで)で省電力モードになっていると発生しやすい気がする</li> </ul></li> <li>問題が発生するかどうかは、インストール後の最初の起動で決まる。 <ul> <li>最初の起動で問題が発生すれば、その後も発生し続ける。</li> <li>逆に、最初の起動で問題が発生しなければ、その後は発生しない。</li> </ul></li> </ul> <p>最後の2つが非常に厄介で、全て VirtualBox で同じリソースを割り当てた VM のゲストマシンに、 同じ設定で CentOS をインストールしているのにもかからず、問題が発生したりしなかったりする。<br /> 訳がわからない。</p> <p>VM のホストをいろいろ買えつつ試してみたところ、上記のような状態の時に問題が派生しやすい気がするが、ハッキリ「そうだ」と言えるほどの回数は試せていない。</p> <p>最初、 良くある SELinux 関係の問題かと思って SELinux を切って AWX のインストールをやり直してみたが、何も変わらなかった。</p> <h2 id="AWX エラーの内容"><a href="#AWX+%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AE%E5%86%85%E5%AE%B9">AWX エラーの内容</a></h2> <p>上記スクショの "Server Error" "A server error has occurred" のメッセージだけでは、どんな問題が発生しているのか全くわからないので、とりあえず各コンテナのログをみてみる。</p> <p>どうやら、 awx_postgres コンテナで、以下のようなエラーが発生しているようだ。</p> <pre><code>FATAL: no pg_hba.conf entry for host "172.18.0.2", user "awx", database "awx", SSL off </code></pre> <p>問題が起きていない環境と、起きている環境で pg_hba.conf (※) を比べると、<br /> 問題が起きていない環境では、このファイルの末尾に</p> <pre><code>host all all all md5 </code></pre> <p>が追記されているという違いがある。</p> <p>(※: pg_hba.conf は awx_postgres コンテナの <code>/var/lib/postgresql/data/pgdata/pg_hba.conf</code> にあるほか、 docker ホスト側でも <code>/tmp/pgdocker/pgdata/pg_hba.conf</code> として永続化されている。 (postgres_data_dir 変数が初期値の場合。))</p> <p>この行がないため、 WEB サービスを走らせているコンテナから PostgreSQL を動かしているコンテナへのアクセスが拒否されているようだ。</p> <p>しかし、問題となっている環境で pg_hba.conf を書き換えても、別のエラーが発生して Server Error が表示される問題は解決しない。</p> <p>問題が起きる環境と起きない環境を更に詳しく比べると、 PostgreSQL の DB が作成すらされていないことがわかった。<br /> 本来なら、 awx_postgres コンテナ内に awx ユーザで DB が作成されている筈なのにもかかわらず、以下のように コンテナに入って psql の --list オプションを実行すると、エラーになってしまう。</p> <pre><code class="bash">$ sudo docker exec -it awx_postgres /bin/bash root@xxxxxxxxxxxx:/# psql --list -U awx psql: FATAL: database "postgres" does not exist </code></pre> <p>以上のことから、 pg_hba.conf の書き換えや、 PostgreSQL DB の初期化といった、 初期化プロセスが実行されずに「初期化済み」扱いされているのが原因ではないかと、予想がつく。</p> <p>awx リポジトリ内で同様の不具合が挙がっていないか確認してみたが、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/issues/4736">似たような問題は挙がっている</a> ものの、それそのものズバリの回答は見つからなかった。</p> <h2 id="pg_hba.conf を書き換えているのは誰だ"><a href="#pg_hba.conf+%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%AF%E8%AA%B0%E3%81%A0">pg_hba.conf を書き換えているのは誰だ</a></h2> <p>audit などを使って pg_hba.conf に関するシステムコールを監視して、 何が host all all all md5 と追記しているのかを確認してみる。</p> <p>その結果、書き換えを行っているのは</p> <pre><code class="bash">bash /usr/local/bin/docker-entrypoint.sh postgres </code></pre> <p>のプロセスだとわかった。</p> <p>AWX 7.0.0 インストール時の <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">docker-compose.yml</a> も、 AWX 6.1.0 インストール時の <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/7.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">docker-compose.yml</a> も、 postgres:9.6 の docker イメージを使っていることがわかる。<br /> このため、 上記の pg_hba.conf の書き換えを行っている docker-entrypoint.sh は、 postgres:9.6 イメージの Dockerfile のエントリーポイントである <a target="_blank" rel="nofollow noopener" href="https://github.com/docker-library/postgres/blob/3610f1e45365fb09c0fea29fa387b35f0efdb3a1/9.6/docker-entrypoint.sh#L119-L122">この docker-entrypoint.sh</a> だろう。</p> <p>前後の PostgreSQL の初期化プロセスも働いていないことを考えると、</p> <pre><code class="bash"> # 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 </code></pre> <p>この条件分岐の部分が、意図通り働かないことがあるのではないかと思う。</p> <p>しかし、私は docker に関してはほとんどシロウトなので、ここから docker イメージの定義ファイルを辿って、どこがおかしいのかを調査するのはちょっと難しい。。。</p> <h2 id="AWX 8.0.0 がリリースされたら解決してた"><a href="#AWX+8.0.0+%E3%81%8C%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%95%E3%82%8C%E3%81%9F%E3%82%89%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%A6%E3%81%9F">AWX 8.0.0 がリリースされたら解決してた</a></h2> <p>…とかなんとかやってるうちに、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/releases/tag/8.0.0">AWX 8.0.0 がリリース</a> されてしまった。</p> <p>8.0.0 で AWX のインストールを試してみると、ぱったりと問題が発生しなくなった。</p> <p>awx_postgres コンテナを作成する docker イメージが、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/blob/8.0.0/installer/roles/local_docker/templates/docker-compose.yml.j2#L131">postgres:9.6 から postgres:10 に変更</a> になったからではないかと考えているが、具体的にどう変わったかは正直わからない。</p> <p>ひょんなことから、原因は不明ながら問題が解決してしまったので、これ以上調査する気力も失せて、私は考えるのをやめた。</p> <p><strong>追記:</strong> そして、記事を書いた直後に <a target="_blank" rel="nofollow noopener" href="https://github.com/ansible/awx/releases/tag/9.0.0">AWX 9.0.0 がリリース</a> された。ちょっとペース早すぎない!?</p> advanceboy