Amazon Linux 2015.03 に chef を適用したらコケてハマった件

# はじめに

最新の `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` でコケてる人がいるみたい

https://forums.aws.amazon.com/thread.jspa?threadID=174341

`-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` すると最新バージョンにアップデートされてしまう__
　[バージョン固定する方法](http://dev.classmethod.jp/cloud/specify-amazon-linux-version/)もあるみたい

__ec2 の最新バージョンを使用するのは慎重に__
　今回は、`yum update` により意図せず最新になってしまった…
　以前も、最新のバージョンが chef の recipe が対応しておらずハマったことがあるので

__chef の導入よってサーバーの状態は固定化できるが、そもそも EC2 自体が最新バージョンを利用することを推奨しているため、その運用を行うと recipe のメンテが結構必要になる__
　なんだかんだ同じ構成のサーバーを構築する際には、毎回何かしら recipe の修正 ( cookbook の update ) が入る

__結局 python2.6 で何故動かなかったかの原因はわからずじまい__
　2.6 の再インストールが必要？？