Chefをさわってみる

# もくじ
1. Chefとは
2. インストールする
3. Repositoryをつくる
4. Cookbookをつくる
5. Recipeをつくる
6. 設定ファイルをつくる
7. 実行してみる
8. まとめ

# 1.Chefとは
Chefとはパッケージのインストールや設定ファイル変更を行うサーバ構築の自動化ツール（プロビジョニングツール）です。
手作業によるサーバ構築のオペミスを防ぐことができ、コードベースのためメンテナンスがしやすいことが特徴で、有名どころではFacebookが採用しています。

使うといいこと
・オペミスがなくなる
・複数台へ一括適用できる
・手順書がコードでできてる
・使い回しができる


今回はクライアントで単独コマンドが実行可能なChef Soloを使用して、Nginxのインストールを行なっていきます。

### 概要図
ざっとしたイメージはこんな感じです。

![chef.png](https://qiita-image-store.s3.amazonaws.com/0/121223/fc90b8e0-c14f-cf69-6240-18941c82ea3e.png)
###### ※今回やる範囲を元に作成しているので、これが全てではありません。。

# 2.インストールする
さっそく手を動かしましょう。
Chef のインストールは以下のコマンドを叩くだけです。
```
$ curl -L http://www.opscode.com/chef/install.sh | sudo bash
```

# 3.Repositoryをつくる
RepositoryとはCookbookをまとめたもので、一般的に１システム１レポジトリとなってます。
テンプレートとなるRepositoryをopscodeから落としてCookbookを作成していきましょう。

```
$ git clone git://github.com/opscode/chef-repo.git
```

# 4.Cookbookをつくる
CookbookとはRecipeやデータ、ファイルをまとめる本です。NginxのCookbookや、PostfixのCookbookなど
ミドルウェア別に管理します。
Chefをインストールしたらknifeというツールも一緒にインストールされるので、
このknifeでCookbookを作成していきます。
まずは以下のコマンドを叩いてknifeの初期設定をしましょう。

```
$ knife configure
```

いろいろ聞かれますが、エンターキー連打で問題ありません。
初期設定が終わったら、knifeを使ってCookbookを作成します。

```
$ cd chef-repo 
$ knife cookbook create hello_nginx -o cookbooks
```

# 5.Recipeをつくる
cookbooks ディレクトリ内に hello_nginx というCookbookを作りました。
次はRecipeを作ります。Recipeとはざっくり言うと料理のレシピと同じで、作り方が書いてあります。
RecipeをもとにChefが料理をしてシステムの構築を行なってくれるわけです。

今回のRecipeではNginxのインストールと起動を行います。長くなるのでconf等の設定は端折ります。。。
Cookbookを作った時点でRecipeファイルのテンプレートができていますので、
以下のように編集してください。

```
$ vi cookbooks/hello_nginx/recipes/default.rb
```

```
#
# Cookbook Name:: hello_nginx
# Recipe:: default
#
# Copyright 2016, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
package "nginx" do
  action :install
end

service "nginx" do
  action    [ :enable, :start ]
  supports  :status => true, :restart => true, :reload => true
end
```

packageやserviceは概要図にあったRecipeの命令単位で、
命令自体はResourceに定義されています。

補足)
 package:パッケージのインストールや削除を行う。
 service:サービスの実行や停止、再起動を行う。 


# 6.設定ファイルをつくる
実行する前に、chef-repoディレクトリ直下に以下の二つのファイルを
作成しましょう。

Chef Solo実行時に実行するRecipeを記述するJSONファイルを用意します。
今回はhello_nginxというRecipeを作成したので、run_listに追加します。

```
vi localhost.json
```

```
// localhost.json
{
      "run_list" : [ "recipe[hello_nginx]" ]
}
```

続いて、Chefが利用するtmpやCookbookのパスを指定する設定ファイルを作成します。

```
vi solo.rb
```

```
# solo.rb
file_cache_path "/tmp/chef-solo"
cookbook_path ["/home/user/chef-repo/cookbooks"]
```

# 7.実行してみる
chef-solo コマンドを実行して、Nginxをインストールしてみましょう。
先ほど作った設定ファイルを指定し、実行します。
実行にはsudoが必要なのでお忘れなく。

```
$ sudo chef-solo -c solo.rb -j ./localhost.json
```

実行結果
Nginxがインストールされて、

```
[root@d2f4b0fa1322 chef-repo]# rpm -qa | grep nginx
nginx-1.10.2-1.el6.ngx.x86_64
```

プロセスが立ち上がっているのが確認できます

```
[root@d2f4b0fa1322 chef-repo]# ps aux | grep nginx
root      9596  0.0  0.0  45052   896 ?        Ss   06:44   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     9597  0.0  0.1  45432  2992 ?        S    06:44   0:00 nginx: worker process
root      9604  0.0  0.0   6500   544 ?        S+   06:45   0:00 grep nginx
```


# 8.まとめ
今更ながらChef入門をやってみました。
今回は本当に触りの部分だけとなりましたが、雰囲気を感じていただければ幸いです。
学習コストが比較的高く、今回出てきていない用語もまだたくさんありますが、使いこなせれば非常に強力なツールです。