はじめに
最新の Amazon Linux 2015.03
の EC2 に対して、以前に作成した chef を適用したらコケてしまい、
ハマってしまって、色々と調べて何とか解決したときの自分用のメモです。( 後述するが実は 2014.09
だった )
今回適用した chef の recipe は、Amazon Linux 2014.03
で構築した際に作成したもの
下記がエラーが出た時の出力内容
$ knife solo cook ec2-user@hogehoge.com -i ~/.ssh/hogehoge.pem
・
・
・
省略
・
・
[2015-03-25T06:18:57+00:00] ERROR: Running exception handlers
[2015-03-25T06:18:57+00:00] ERROR: Exception handlers complete
[2015-03-25T06:18:57+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
Chef Client failed. 13 resources updated
[2015-03-25T06:18:57+00:00] ERROR: mysql_client[default] (mysql::client line 20) had an error: Mixlib::ShellOut::ShellCommandFailed: package[mysql-devel] (/home/ec2-user/chef-solo/cookbooks-2/mysql/libraries/provider_mysql_client_rhel.rb line 16) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
---- Begin output of /usr/bin/python /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/package/yum-dump.py --installed ----
STDOUT:
STDERR: Traceback (most recent call last):
File "/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/package/yum-dump.py", line 36, in <module>
import yum
ImportError: No module named yum
---- End output of /usr/bin/python /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/package/yum-dump.py --installed ----
Ran /usr/bin/python /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/package/yum-dump.py --installed returned 1
[2015-03-25T06:18:57+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
ERROR: RuntimeError: chef-solo failed. See output above.
mysql::client
のインストールでエラー
python の実行に失敗している様子
対応内容 ( 第1次 )
以前にも、mysql がインストール出来ない場合があり、その時は、アマゾンの新しいバージョンが認識できないために起こっていたため、
cookbooks の update で解決できるかと思い、まず update
$ berks update
cookbook を update したので再度 knife cook すると、今度は、最初の package のインストール時点でエラーが発生…
しかも同じ python ( yum-dump.py ) の実行エラーだった
この時点から調査開始
調査結果
ググってみると、古い記事だが同じように import yum
でコケてる人がいるみたい
-c
でそのまま コマンドを実行できるみたいなので、サーバーで試してみる
[ec2-user@hogehoge.com ~]$ python -c "import yum"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named yum
うん。やっぱりエラー
記事の Reply に alternatives を変更しろとあったので、そもそも alternatives を確認
[ec2-user@hogehoge.com ~]$ ls -al /usr/bin/python
lrwxrwxrwx 1 root root 24 3月 25 06:18 /usr/bin/python -> /etc/alternatives/python
[ec2-user@hogehoge.com ~]$ ls -al /etc/alternatives/python
lrwxrwxrwx 1 root root 18 3月 25 06:18 /etc/alternatives/python -> /usr/bin/python2.6
2.6 になっている
python2.7 もあったので、import yum
を試してみたらエラーが出なかった
[ec2-user@hogehoge.com ~]$ /usr/bin/python2.6 -c "import yum"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named yum
[ec2-user@hogehoge.com ~]$ /usr/bin/python2.7 -c "import yum"
[ec2-user@hogehoge.com ~]$
そもそも以前の 2014.03
のサーバーには、python2.7 なんて無かったので、更にググる
そうすると新しい 2015.05
では、python の 2.7 デフォルトになっているみたい
http://aws.amazon.com/jp/amazon-linux-ami/2015.03-release-notes/
http://dev.classmethod.jp/cloud/aws/amazon-linux-ami-2015-03/
しかも、2.6 使う場合は、別途インストールが必要とある
けど、今回の構築した ec2 には 2.6 が入っている…何故????
色々調べた結果、構築した ec2 は 2015.03 と思っていたが、
使用した AMI を確認すると、amzn-ami-hvm-2014.09.2.x86_64-ebs
だった
結論としては、実行した recipe の最初で yum update
していたことを忘れていて、それにより 2014.09
から
2015.03
に update され、python2.7 が追加され、2014.09
時点で入っていた 2.6 が残っていると判断した
てか、そもそも、yum update で Amazon Linux のバージョンが変わることを知らなかった…恥ずかしい
対応内容 ( 第2次 - 最終 )
/usr/bin/python
の向き先が、python2.6 になっているので、2015.03
のデフォルトである python2.7 に変更
[ec2-user@hogehoge.com ~]$ sudo alternatives --set python /usr/bin/python2.7
再度 knife solo cook
を実行すると、正常に実行できた
まとめ
ec2 で yum update
すると最新バージョンにアップデートされてしまう
バージョン固定する方法もあるみたい
ec2 の最新バージョンを使用するのは慎重に
今回は、yum update
により意図せず最新になってしまった…
以前も、最新のバージョンが chef の recipe が対応しておらずハマったことがあるので
chef の導入よってサーバーの状態は固定化できるが、そもそも EC2 自体が最新バージョンを利用することを推奨しているため、その運用を行うと recipe のメンテが結構必要になる
なんだかんだ同じ構成のサーバーを構築する際には、毎回何かしら recipe の修正 ( cookbook の update ) が入る
結局 python2.6 で何故動かなかったかの原因はわからずじまい
2.6 の再インストールが必要??