Chefを使ってより効率的にサーバを管理しよう。まずは用語から


## 関連記事

* Chefを使ってより効率的にサーバを管理しよう。まずは用語から
* [Berkshelfを使って外部クックブックをノードに適用する。](http://qiita.com/park-jh/items/751464a4cc6d8abcd6fd)
* [クックブックを作成してノードに適用する。- その１](http://qiita.com/park-jh/items/8d641809850b5930d39c)
* [クックブックを作成してノードに適用する。- その２](http://qiita.com/park-jh/items/88237342cfd202e6893f)
* [ChefでCentOS 6.7 + rbenv + ruby 2.3.0の環境を構築する。](http://qiita.com/park-jh/items/f249a18793899f2eb4bf)
* [ChefでCentOS 6.7 + Vim 7.4 + luaを設置する。](http://qiita.com/park-jh/items/371d179d5e71618a1f14)
* [ChefでVimプラグインマネージャーNeoBundleを設置する。](http://qiita.com/park-jh/items/ec09e40f9b4aaf9fedfd)
* [Chefのレシピをデバッグしてみよう。](http://qiita.com/park-jh/items/96a076e167327a6a5a39)
* [ChefでCentOS 6.7 + nginxを設置する。- 外部クックブック](http://qiita.com/park-jh/items/3013c49494e524fced31)
* [ChefでCentOS 6.7 + nginxを設置する。- カスタムクックブック](http://qiita.com/park-jh/items/43451cea21ee1724c24b)
* [ChefでCentOS 6.7 + nodejs + npmを設置する。](http://qiita.com/park-jh/items/96089e7e1c97b0fe3a6c)
* [ChefでVimプラグインマネージャーvim-plugを設置する。](http://qiita.com/park-jh/items/ba27ad412ce9926fd94d)
* [ohaiのカスタムプラグインを作ってみよう。](http://qiita.com/park-jh/items/34be55abb7c63b36cddb)
* [Chef SoloからChef Zeroへ](http://qiita.com/park-jh/items/44c249c9de768c53b423)
* [Chefでnginx + php(php-fpm) + mariadb + wordpressを設置する。](http://qiita.com/park-jh/items/7515e47dddc38257a454)

## Chefとは

* サーバの状態を扱うフレームワーク
* サーバ自身が保持しているサーバ状態をコードという外部表現で管理する。
* Chefでサーバプロビジョニングを行う場合はSSHを通じて直接設定を書き換えるのは禁止する。

## Chefの構成

### Chef Server / Chef Client

* サーバ・クライアント構成でChefを利用する。
* 設定を中央サーバから各ノード（管理対象サーバ、クライアント）に配布し、適用していくことでプロビジョニングを実行する。
* ローカル端末（クックブック）+ サーバ（Chef Server） + ノード（Chef Client）
* 各ノードからChef Serverに対して変更がないかを確認し、変更があれば適用する。

### Chef Solo

Chefのスタンドアロン版で、Chefのパッケージに含まれている。

* スタンドアロンでChefを利用する。
* ローカル端末（クックブック）+ ノード（chef-soloが設置されている）
* knife-soloを使いローカル端末上のクックブックをリモートで各ノードに転送してchef-soloのコマンドを実行する。

### Chef Zero（Chef Client Local Mode）

* Chef ClientをLocal Modeに運用することによってChef Soloと同様の機能を提供する。
* メモリ上で高速で動くChef Serverを作り、サーバ・クライアント構成と同じオペレーションが行われる。
* サーバ・クライアント構成に移行するとき便利
* 近頃はChef Soloの代わりに使っているようだが、ここではChef Soloを使う。

## knife

* Chefのための一連のコマンドツール群
* リモートでChef ServerやChef Soloを操作する。
* クライアント・サーバ構成の場合はknifeを、Chef Solo構成の場合はknife-soloを使う。

## knife-solo

* Chef Soloに特化したknifeのサブコマンドを提供する。
* knife-soloをインストールすると依存関係のあるChefも同時にインストールされる。
* 手元で作ったクックブックをリモートのサーバに転送してchef-soloコマンドを実行するといった一連の作業が自動化できる。

## クックブック

* サーバ構築の手順書が書かれた定義ファイル
* knifeを使ってクックブックを生成する。

## Berkshelf

* クックブックの依存関係を管理する。
* コミュニティから公開されたクックブックをbundlerのように管理することができる。

## 設置

### 環境

* ホスト：OS X El Capitan
* ゲスト：vagrant上のCentOS 6.7

### ローカル端末

* ここではホストが各ノード（ゲスト）を管理する。
* knife-soloはgemで提供されるため、rubyが必要だ。
* MACはrubyがデフォルトで設置されているが、rbenv環境のrubyを使うことを推奨する。
* この場合も二つの選択肢がある。
* グローバルのgem環境に設置する場合は、他のプロジェクトでもchefコマンドの利用ができる。
* ローカル（プロジェクトの直下）のgem環境に設置する場合は、該当プロジェクトだけchefコマンドの利用ができる。
* ここではグローバルのgem環境はできるだけ綺麗に管理したいので、ローカルのgem環境にknife-soloを設置する。
* 人の好みによる問題で別にグローバルのgem環境に設置しても問題はない。
* rbenvとvagrantのboxがすでに用意されていることを前提とする。
* 用意されていない場合は下記の記事を参考にしていただきたい。
  - [homebrewでrbenvを設置する](http://qiita.com/park-jh/items/4b610cc0f6cc2b373bf2)
  - [bentoからvagrantのboxを作る](http://qiita.com/park-jh/items/bb89dd659ce9cab2ce0a)

* knife-soloなどのgemをbundlerで管理する。

```sh
  % cd chef
  % bundle init
```
  
* 生成されたGemfileを開き下記のようにgemを追加する。

```sh
  % vi Gemfile

  ... snip ...
  gem 'knife-solo'
  gem 'berkshelf'
```

* vendor/bundle以下にgemを設置する。

```sh
  % bundle install --path vendor/bundle --jobs=4 --binstubs
```

* 設置したgem一覧を確認する。

```sh
  % bundle exec gem list
```

* knife-soloでリポジトリを生成する。

```sh
  % knife solo init .

  # リポジトリのディレクトリ構造
  % tree . -L 1
  .
  ├── Berksfile
  ├── Gemfile
  ├── Gemfile.lock
  ├── Vagrantfile
  ├── bin
  ├── cookbooks
  ├── data_bags
  ├── environments
  ├── nodes
  ├── roles
  ├── site-cookbooks
  └── vendor
```

* .gitignoreを下記のように修正する。

```sh
  % vi .gitignore
  /cookbooks/
  /.bundle/
  /bin/
  /vendor/bundle/
  Gemfile.lock
  Vagrantfile
```

* gitリポジトリを生成する。

```sh
  git init
  git add .
  git commit -m "Create knife-solo's repository"

  # githubのほうにchefというリポジトリを生成した場合
  git remote add origin git@github.com:devtopia/chef.git
  git push -u origin master
```

### ノード（vagrant上のCentOS 6.7）

* knife-soloでノードにChef Soloをインストールする。

```sh
  # 仮想サーバの状態を確認
  % vagrant status
  Current machine states:

  default                   running (virtualbox)

  # 仮想サーバのホストがdevの場合
  % bin/knife solo bootstrap dev
```

* 処理結果

```sh
  % bin/knife solo bootstrap dev
  Bootstrapping Chef...
    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                   Dload  Upload   Total   Spent    Left  Speed
  100 20022  100 20022    0     0   3451      0  0:00:05  0:00:05 --:--:-- 79452
  Getting information for chef stable 12.7.2 for el...
  downloading https://omnitruck-direct.chef.io/stable/chef/metadata?v=12.7.2&p=el&pv=6&m=x86_64
    to file /tmp/install.sh.3056/metadata.txt
  trying wget...
  url	https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
  md5	8c3ba2e797fc852fc557b0e7157556cc
  sha256	6af0eb1c7706fc6a36f74ae9f590135e37e6206f2fe7d5a1760c1e2da1b36068
  version	12.7.2downloaded metadata file looks valid...
  downloading https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-12.7.2-1.el6.x86_64.rpm
    to file /tmp/install.sh.3056/chef-12.7.2-1.el6.x86_64.rpm
  trying wget...
  Comparing checksum with sha256sum...
  Installing chef 12.7.2
  installing with rpm...
  警告: /tmp/install.sh.3056/chef-12.7.2-1.el6.x86_64.rpm: ヘッダ V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
  準備中...                ########################################### [100%]
     1:chef                   ########################################### [100%]
  Thank you for installing Chef!
  Generating node config 'nodes/dev.json'...
  Running Chef on dev...
  Installing Berkshelf cookbooks to 'cookbooks'...
  Resolving cookbook dependencies...
  Uploading the kitchen...
  WARNING: Local cookbook_path '/Users/devnote/Documents/study/chef/cookbooks' does not exist
  Generating solo config...
  Running Chef: sudo chef-solo -c ~/chef-solo/solo.rb -j ~/chef-solo/dna.json
  Starting Chef Client, version 12.7.2
  Compiling Cookbooks...
  Converging 0 resources

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

## 参考

* チーム開発実践入門
* Chef実践入門