/
カテゴリー

この問題は、OpenStackとApache2に関係する問題でした。誤ったApache用実行ユーザーの環境変数ファイルを修正し、文字コードによるエラーが出ないように修正します。

概要

あなたのチームはプライベートクラウドを導入するプロジェクトに割り当てられた特別障害対応チームです。
契約先の会社がOpenStackでクラウド基盤を構築しようとしています。
ですが、どうやらCinderの導入で困ってしまっているようです。
話を聞いてみると以下のような状況だということです。

  • Cinderを無事導入し動いていた。
  • Openstackのconfig周りを変更したあとから、以下のようなエラーが出てopenstack volumeコマンドが使用できなくなってしまっている
  • 変更点は忘れてしまったらしい

openstack volumeコマンドを打った際のエラー

root@vm1 user(keystone)# openstack volume list
Internal Server Error (HTTP 500)
root@vm1 user(keystone)#

以下の作業を依頼された。

  • openstack volumeコマンドでエラーが出てこないようにする
  • 今後社内で変更点が分かるように、設定ファイルなどを変更した際には変更箇所に以下のコメントを記述する
#----------------------------------------
#変更点: [追加 or 削除 or 変更]
#チーム名: [チーム名]
#----------------------------------------

変更点には、追加 削除 変更を選択し入れてほしい。

前提条件

  • OpenStackの再構築禁止
  • OpenStackのソースコードの変更禁止
  • OpenStack周辺の各種バイナリの置き換え禁止
  • 変更点にコメントを記述していること
  • openstackコマンドを使用する場合は以下の手順で環境変数を読み込むこと
user@vm1:~$ sudo su --
root@vm1:/home/user# source keystonerc

初期状態

  • 以下のコマンドを打つとInternal Server Errorが表示され、openstack volumeコマンドが使用できない
root@vm1 user(keystone)# openstack volume list
Internal Server Error (HTTP 500)
root@vm1 user(keystone)#

終了状態

  • 以下のコマンドを打つとエラーが表示されずにopenstack volumeコマンドを実行することが出来る。
root@vm1 user(keystone)# openstack volume list

root@vm1 user(keystone)#

接続情報

VM名ホスト名ユーザパスワード
vm1192.168.9.1userictsc2020

解説

この問題の環境ではCinderが導入されているのですが、/etc/cinder/cinder.confにコメントアウトで日本語が入っていることでPythonの文字コード周りでエラーが出てしまっています。
通常、このようなエラーが出た場合はuserやrootのLocale設定を確認し、utf-8に対応することで問題を解決することが出来ると考えられます。
しかし、今回の環境ではkeystone<-->Apache2<-->管理者というようになっており、Apache2で処理が行われる際に一時的にApache用実行ユーザーに切り替わります。
なので、/etc/apache2/envvars内のLANG変数を書き換えることでApache用実行ユーザーに切り替わった際もutf-8での処理になります。
これによって、日本語のコメントアウトが入った状態でopenstack volume listなどのコマンドが正常に動作するようになります。

$ sudo su --
# source keystonerc
# vim /etc/apache2/envvars
  【LANG=Cをコメントアウトし、LANG=C.utf8】
# openstack volume list

採点基準

  1. 原因が書かれている(Pythonの文字コードに問題があることを言及) 30%
  2. openstack volume list でエラーが出ずに完了出来る 70%
    ※ただし、根本的な解決(日本語のコメントアウトを記述しても問題ない)が出来ていないものは2の採点は行っておりません。

総評

この問題は、今年の問題の中で唯一のOpenStack問題となっており、今年唯一の依存問題でもありました。
本問題は、OpenStackが直接問題となっているのではなく、OpenStackが管理者との通信で経由しているApacheに問題が発生しているというものでした。
解決方法としては、OpenStack自体のコードの修正や新しくサービスを作成して経由させるなどの強引な方法ではなく、OpenStackの通信の流れを理解することで、キレイに解決できるというものでした。
この問題を作問する際にアイデアとなったのは、この問題の続編の「続・このOpenStackなんか変だよぉ…」という問題の問題VMを構築している際に引っかかったエラーでした。よって、続編の問題の前提となる環境を整えるというのが最終的な目標となっていました。

OpenStack自体、規模がかなり大きいことでエラーを特定すること自体がやや困難だったと思います。
OpenStackのトラブルシュートでは、OpenStackの処理の流れを理解して、どこで問題が起きているかを特定するのが大切だと思います。もし、この問題を通してOpenStackを構築してみたり、構築する際にトラブルが起きたときの解決の手がかりになってくれれば作問者としては大変嬉しいです。