Chef入門(No.01 : インストール)

Chefの導入メモです。
Chefを始めたい人の最初の一歩にでもなって頂ければ幸いです。
chef-soloからchef-clientのローカルモードへの移行が囁かれていますが…

## 環境構成
今回の構築環境は以下の通りです。

Chef：12.0.3
ホストOS：Windows 7 Professional SP1(64bit)
仮想化環境：VirtualBox 4.3.20
ゲストOS(WorkStation：操作用)：CentOS 6.5
ゲストOS(RemoteNode：構築対象)：CentOS 6.5

## 環境準備
各ゲストOSで以下の設定を行います。

```bash:前準備
# Chef用ユーザの作成

# SSH鍵認証の設定(Chefでの接続(SSH)をパスワード認証ではなく鍵認証で行う)
$ sudo vi /etc/ssh/sshd_config
# 以下をアンコメント
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile    .ssh/authorized_keys

# 操作対象ユーザでのパスワード無しsudo実行権限を付与
$ sudo visudo
# 以下を追加
<username>       ALL=(ALL)       NOPASSWD: ALL

# knifeが通信するSSH(22番ポート)でのアクセスを許可する
# iptablesの設定等の確認
```

## 操作側Chefインストール
操作する側のサーバにChefをインストールする。

```bash:Chefインストール
# Chefインストール
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
…
Thank you for installing Chef!
# Chefバージョン確認
$ chef-solo -v
Chef: 12.0.3
# rubyバージョン確認
$ /opt/chef/embedded/bin/ruby -v
ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-linux]
# gemバージョン確認
$ /opt/chef/embedded/bin/gem -v
2.4.1

# knife設定(任意で設定、デフォルト設定は空白)
$ knife configure
Where should I put the config file? [/home/infradmin/.chef/knife.rb] <空白>
Please enter the chef server URL: [https://hostname:443] <空白>
Please enter an existing username or clientname for the API: [username] <空白>
Please enter the validation clientname: [chef-validator] <空白>
Please enter the location of the validation key: [/etc/chef-server/chef-validator.pem] <空白>
Please enter the path to a chef repository (or leave blank): <空白>
…
Configuration file written to /home/infradmin/.chef/knife.rb

# knife-soloインストール
$ sudo /opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc
…
Successfully installed knife-solo-0.4.2
1 gem installed
```

## Let's Cook!!
早速、料理(cook)しましょう。
ここでのcook対象は操作サーバです。

流れは
1. 台所(kitchen：またはレポジトリと呼ばれる料理本を置く場所)作成
2. 料理本(cookbook)作成
3. レシピ(recipe)編集
4. 料理(cook)！

全てknifeコマンドで実行する。

```bash:cook!!
# カレントディレクトリにレポジトリ(chef-repo)作成
$ knife solo init chef-repo

# ディレクトリ構成(.gitkeepは表示から外しています)
$ cd chef-repo
$ find . | grep -v .gitkeep
./cookbooks
./roles
./nodes
./site-cookbooks
./environments
./.gitignore
./.chef
./.chef/knife.rb
./data_bags

# 最初の料理本作成
# knife cookbook create <cookbook name> -o <directory>
# cookbooks : サードパーティ製cookbook置き場
# site-cookbooks : 自作cookbook置き場
# ※通常はdirectoryの指定にsite-cookbooksを指定する。
$ knife cookbook create hello -o site-cookbooks

# ディレクトリ構成(.gitkeepは表示から外しています)
$ find . | grep -v .gitkeep
./site-cookbooks
./site-cookbooks/hello
./site-cookbooks/hello/files
./site-cookbooks/hello/files/default
./site-cookbooks/hello/attributes
./site-cookbooks/hello/README.md
./site-cookbooks/hello/metadata.rb
./site-cookbooks/hello/recipes
./site-cookbooks/hello/recipes/default.rb
./site-cookbooks/hello/templates
./site-cookbooks/hello/templates/default
./site-cookbooks/hello/libraries
./site-cookbooks/hello/resources
./site-cookbooks/hello/CHANGELOG.md
./site-cookbooks/hello/providers
./site-cookbooks/hello/definitions

# デフォルトレシピを編集
$ vi site-cookbooks/hello/recipes/default.rb

#以下を入力
log "Hello, Chef!"

# Let's Cook!(まだ、空実行)
# knife solo cook [username@][servername | ip] -i <ssh secret key>
$ knife solo cook localhost -i ../id_rsa
Running Chef on localhost...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 12.0.3
Compiling Cookbooks...
Converging 0 resources

Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 1.073342596 seconds

# レシピ適用ノード情報を編集
# ※対象ノードへのcookを一度でも実行するとノード情報ファイルが自動で作成される
$ vi nodes/localhost.json
# recipe～行を追加
{
  "run_list": [
    "recipe[hello]"
  ],
  "automatic": {
    "ipaddress": "localhost"
  }
}

# 再度料理する
$ knife solo cook localhost -i ../id_rsa
Running Chef on localhost...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 12.0.3
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, Chef!] action write


Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 1.12555665 seconds

```

これで操作サーバのChefのセットアップは完了です。

## 構築対象へのChefインストール & Cook!!


次に構築対象のサーバにChefをインストール & Cookします。
操作は操作用サーバで実行します。

```bash:Chefインストール
# Chefインストール
# knife solo prepare [username@][servername | ip] -i <ssh secret key>
$ knife solo prepare remote_ip -i ../id_rsa
…
Thank you for installing Chef!
Generating node config 'nodes/remote_ip.json'...

# 空実行でCook
# knife solo cook [username@][servername | ip] -i <ssh secret key>
$ knife solo cook remote_ip -i ../id_rsa
…
Running handlers:
Running handlers complete
Chef Client finished, 0/0 resources updated in 2.349205415 seconds

# レシピ適用ノード情報を編集
# ※対象ノードへのcookを一度でも実行するとノード情報ファイルが自動で作成される
$ vi nodes/remote_ip.json
# recipe～行を追加
{
  "run_list": [
    "recipe[hello]"
  ],
  "automatic": {
    "ipaddress": "remote_ip"
  }
}

# 再度料理する
$ knife solo cook remote_ip -i ../id_rsa
Running Chef on remote_ip...
Checking Chef version...
Uploading the kitchen...
Generating solo config...
Running Chef...
Starting Chef Client, version 12.0.3
Compiling Cookbooks...
Converging 1 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 0.898161507 seconds

```

これで構築対象のサーバへのChefインストール、Cookが出来ました。

基本的なインストールとCook操作については以上となります。
次の段階として
・Cookbookの追加、レシピの作成
・構築対象サーバの追加
を覚えていくことでレベルアップできると思います。

Let's Cook!!

参考：
> ◆ Chef Documents
http://docs.chef.io/
◆ chef-client
https://www.getchef.com/download-chef-client/
◆ knife solo
http://matschaffer.github.io/knife-solo/
◆ サーバー構築自動化ツール Chef 最新版のインストール方法
http://hivecolor.com/id/46