Knife-Zero bootstrapを用いてAmazon EC2にChefをインストールする際の手順

# 目的
Amaon EC2インスタンスにKnife-Zeroを介してChefをインストールする。

ほぼ以下のsawanoboly氏の記事の通りに進めるため、EC2にインストールする際に必要な手順のみを記述する。

* [Knife-Zeroを作った。](http://qiita.com/sawanoboly/items/218a7b03ddec6be45e34)


# 前提条件
## 環境
* ローカルホストOS : CentOS 6.5
* Vagrant : 1.6.5
* Bundler : 1.7.7
* EC2 AMI : Amazon Linux AMI 2014.09.1 (HVM)

* AWS上にEC2インスタンスを作成・SSH接続が可能であること。

```
[local@localhost VagrantEC2]$ vagrant up --provider=aws
Bringing machine 'default' up with 'aws' provider...
==> default: HandleBoxUrl middleware is deprecated. Use HandleBox instead.
　　　　　　　　　　　　...

[local@localhost VagrantEC2]$ vagrant ssh-config --host ec2 >> ~/.ssh/config
[local@localhost VagrantEC2]$ ssh ec2

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
16 package(s) needed for security, out of 41 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-29-xx ~]$ 
```

Vagrant経由でEC2インスタンス立ち上げからSSH接続が可能であることまでを確認。

# EC2ユーザーの作成

**※この項目は必須ではありません**
　*ec2デフォルトユーザー(ec2-user)でもこれ以降の処理は可能。*
　*ユーザー作成を行わない場合は、以降の処理のSSH接続ユーザーおよび認証鍵をデフォルトユーザーのものに読み替えること。*

　
Knife-Zero実行の際にEC2側で使用するユーザーを追加。

```
[ec2-user@ip-172-31-29-xx ~]$ sudo su -                                        
[root@ip-172-31-29-xx ~]# adduser remote
[root@ip-172-31-29-xx ~]# passwd remote 
```

sudo権限を持たせる。

```vim:visudo
remote ALL=(ALL) ALL
```

　
SSH認証鍵を作成し、ローカルからSSH接続を行えるよう環境を構築。

```
[local@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
　　　　　　　　...

[local@localhost VagrantEC2]$ ssh remote@(EC2インスタンスのIPアドレス） -i ~/.ssh/id_rsa
Enter passphrase for key '/home/local/.ssh/id_rsa': 
Last login: Wed Dec  3 08:13:20 2014 from penta.tokai-soft.net

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
16 package(s) needed for security, out of 41 available
Run "sudo yum update" to apply all updates.
[remote@ip-172-31-29-xx ~]$ 

```
　

* **SSH認証の設定の仕方がわからない場合** 

　　以下の記事を参考
　　[ssh公開鍵認証を実装する（自分メモ）](http://qiita.com/HamaTech/items/21bb9761f326c4d4aa65)
　　[SSH ログインで Permission Denied](http://qiita.com/youcune/items/2f427979403771f2e03a)

# Knife-Zeroインストールおよび実行
ホームディレクトリ以下にChef-Repoディレクトリを作成。
bundle initを行い、Knife-Zero実行環境を作成する。

```
[local@localhost Chef-Repo]$ bundle init
```

　
作成されたGemfileに、以下のようにKnife-Zeroおよび必要なgemを記述し、インストールする。

```ruby:Gemfile
source "https://rubygems.org"                                                                      

gem 'chef'                                           
gem 'knife-zero'
gem 'rb-readline'
```

```
[local@localhost Chef-Repo]$ bundle install --path vendor/bundle
```

　
インストールが無事成功したら、knifeコマンドのデフォルト動作をローカルモードにするためknife.rbを作る。

```
[local@localhost Chef-Repo]$ mkdir .chef
[local@localhost Chef-Repo]$ echo 'local_mode true' > .chef/knife.rb
```

次に、以下のコマンドを入力し、EC2にChefをインストールする。

```
[local@localhost Chef-Repo]$ bundle exec knife zero bootstrap <EC2インスタンスのIPアドレス> -x remote -i ~/.ssh/id_rsa --hint ec2 --sudo
```

オプション解説

* `-x user`　 　 ：SSH接続ユーザー名

* `-i key_path` ：SSH認証鍵のパス

* `--hint ec2`　：OhaiヒントをEC2に設定
　　　　　　　　Ohaiは接続先ノードの構成情報（メタデータ）を収集するツールであり、
　　　　　　　　設定されたヒントに従い、構成情報を収集、JSON形式に整形、またChef-Clientに提供を行う。
　　　　　　　　ここでは、EC2ノードの構成情報を収集するようヒントを設定している。

* `--sudo`　　　 ：sudo権限で実行させる

EC2への接続が開始される。
途中、SSH認証鍵および接続先ユーザーのパスワードを要求されるため、入力する。

```
DL is deprecated, please use Fiddle
ffi-yajl/json_gem is deprecated, these monkeypatches will be dropped shortly
WARNING: No knife configuration file found
WARN: No cookbooks directory found at or above current directory.  Assuming /home/local/Chef-Repo.
Connecting to (EC2のIPアドレス)
Enter passphrase for /home/local/.ssh/id_rsa:　← SSH認証鍵のパスワードを入力
knife sudo password:
Enter your password: ← 接続先ユーザーのパスワードを入力
Installing Chef Client...
```

　
認証が問題なく通れば、以下のメッセージが表示され、Chefがインストールされる。

```
Starting Chef Client, version 11.16.4
Creating a new client identity for ip-172-31-29-xx.ap-northeast-1.compute.internal using the validator key.
resolving cookbooks for run list: []
Synchronizing Cookbooks:
Compiling Cookbooks...
[2014-12-03T08:13:43+00:00] WARN: Node ip-172-31-29-xx.ap-northeast-1.compute.internal has an empty run list.
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 1.591018293 seconds
[local@localhost Chef-Repo]$ 
```

　
最後に、EC2側でChefがインストールされていることを確認する。

```
[remote@ip-172-31-29-xx ~]$ chef-
chef-apply   chef-client  chef-shell   chef-solo    
[remote@ip-172-31-29-xx ~]$ chef-client -v
Chef: 11.16.4
```

# レシピの適用

bootstrapが成功したことでEC2インスタンスが管理ノードとして登録された。

```
[local@localhost Chef-Repo]$ bundle exec knife node list

ip-172-31-29-xx.ap-northeast-1.compute.internal
```

　
参考元に従い、knife zero chef_clientを用いて、ノードにレシピを実行させる。
ここでは自作のscalaインストールレシピをEC2に適用する。
　
まずは、ノードのrun_listにsetup-scalaレシピを追加する。

```
[local@localhost Chef-Repo]$ bundle exec knife node run_list add ip-172-31-29-xx.ap-northeast-1.compute.internal setup-scala
```

次に、chef_client でrun_listに登録されたレシピを実行させる。

```

[local@localhost Chef-Repo]$ bundle exec knife zero chef_client 'name:*' --attribute ec2.public_ipv4 -x remote -i ~/.ssh/id_rsa.pem --sudo

```

オプション解説

* `--attribute attribute_name`

　　bootstrap時にOhaiが収集した構成情報を参照する。
　　ここでは、EC2インスタンスのパブリックIPを参照している。

　
最後に、EC2側で確認。問題なくインストールが完了している。

```
[remote@ip-172-31-29-xx ~]$ scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
```

# 参考

* [Knife-Zeroを作った。](http://qiita.com/sawanoboly/items/218a7b03ddec6be45e34)
* http://buta9999.hatenablog.jp/entry/2014/11/26/025708
* http://www.creationline.com/lab/6401