2018年版 chef-solo&knife-soloでサーバ構成管理入門


# TL; DR
Ansibleを使おう(´･_･｀)

# やること
chef-solo&knife-soloでcentosサーバにhttpdを用意して起動し、welcomeページを見るまでやります。

# 参考資料
- [/kadoyau/Chef周りの用語集](https://scrapbox.io/kadoyau/Chef%E5%91%A8%E3%82%8A%E3%81%AE%E7%94%A8%E8%AA%9E%E9%9B%86)
- [AnsibleとChefの比較](https://www.ossnews.jp/compare/Ansible/Chef)
- [ChefからAnsibleに乗り換えた5つの理由](https://techracho.bpsinc.jp/yamasita-taisuke/2014_05_29/17567)

# 参考書
 [chef実践入門](http://amzn.asia/aqt5AQ9)

# 前提知識
ものすごくざっくり書きますが悪しからず…

## chefとは？

<img src="https://upload.wikimedia.org/wikipedia/commons/8/8a/Chef_logo.svg" width=30%>

- https://www.chef.io/
- Ansibleみたいなサーバー環境構築・構成管理ツール。
- プロビジョニングを実行するエージェント（chef-server）と、プロビジョニングされるマシン（chef-client）に別れます。
- 個人で使うには手に余りすぎるし学習コスト高くて最近は敬遠されがち。

## chef-soloとは？
- https://docs.chef.io/chef_solo.html
- エージェントが無くてもプロビジョニングしたい！というアナタの夢を叶えるツール。
- とはいえ、プロビジョニングしたい対象マシンにインスコしてsshで入り、対象マシン上で実行する必要があってまだめんどくさい。

## knife-soloとは？

<img src="https://jenssegers.com/uploads/images/knife-solo.png.pagespeed.ce.3_WAnNWpcB.png" width=30%>

- お手元のPCからでもchef-soloを実行したい！というアナタの夢を叶えるツール。
- 入手方法はかんたん、`gem install knife-solo` するだけ。


# knife-soloを使ってみよう

## Dev Kitのインストール
- まずはお手元のPCにDev Kitをインスコしましょう、これでいろいろついてきます。
    - https://downloads.chef.io/chefdk

```sh:
 $ chef -v
 # Chef Development Kit Version: 2.4.17
 # chef-client version: 13.6.4
 # delivery version: master (73ebb72a6c42b3d2ff5370c476be800fee7e5427)
 # berks version: 6.3.1
 # kitchen version: 1.19.2
 # inspec version: 1.45.13
```

- ※昔はchefが無くてもchef-soloだけでknife-soloを実行できたぽいが、今はchefが無いとcookbookを作れないっぽいです。
  - [このへんの事情による](https://qiita.com/paranishian/items/92875d52bf18706e129d)

## ディレクトリの準備

```sh:
  # knife-testというリポジトリにします
  mkdir knife-test && cd knife-test
  
  # gemfile ほしい
  bundle init
  
  # gemfileに "knife-solo" たす
  echo 'gem "knife-solo"' >> Gemfile
  
  # ./vendor/bundle以下にインストールして./binに実行ラッパーを置く
  bundle install --path vendor/bundle --binstubs
  
  # かくにん
  bin/knife -v
  # Chef: 13.8.0
```

これでお手元からknife soloが実行できるようになります。

## VMの準備
- VagrantやDockerなどでプロビジョニング対象マシンを用意しましょう。
- 自分は `knife-test` というホスト名のcentos7 Vagrant boxを使います。

## knife-soloを使ってVMにchef-soloをインストールさせる

```sh:
 # cookbookのひな型を作る
 bin/knife solo init .
 
 # knife-testにchef-soloをインスコ
 bin/knife solo prepare knife-test
```

## chefでcookbookを作る
- chefコマンドでcookbookを作ります。
- cookbookはAnsibleでいうplaybookで、あるひとまとまりのサーバ状態を定義できます。

```sh:
 # chefで"test-book"というcookbookを作る
 cd site-cookbooks
 chef generate cookbook test-book
 cd ..
```

## 入れたいソフトウェアを書く
- httpdを入れて起動させるコードを書きます。
- chefのDSLを調べたりしながら…
- こんな感じでcookbookにサーバの状態定義をしていくことを「レシピを書く」と言ったりします

```ruby:site-cookbooks/test-book/recipes/default.rb
 package "httpd" do
   action :install
 end
 
 service "httpd" do
   action [ :enable, :start ]
 end
```

## レシピを加える
- 自分でrun_listにレシピを書き加えます。

```json:nodes/knife-test.json
 {
   "run_list": [
     "recipe[test-book]"
   ],
   "automatic": {
     "ipaddress": "knife-test"
   }
 }
```

## knife-soloでchef-soloを実行させる
- やっと実行まできました。
- 実行してVMにapacheをインストール＆起動させましょう

```:sh
 # 実行
 bin/knife solo cook knife-test
 
 # (中略)
 # Converging 2 resources
 # Recipe: test-book::default
 # * yum_package[httpd] action install
 #   - install version 2.4.6-67.el7.centos.6 of package httpd
 # * service[httpd] action enable
 #   - enable service service[httpd]
 # * service[httpd] action start
 #   - start service service[httpd]
```

## 確認（welcomeページを見る）
- ブラウザからVMに割り当てたIPにアクセスしてみます

<img width=50% src="https://qiita-image-store.s3.amazonaws.com/0/103754/3d35b7fc-aeb6-c3e7-16e4-d0d33497fc05.png">

apacheが動いていることが確認できました。

# おわりに
chef-soloはコマンドでひな形を作ってくれるのでどんなプロダクトでも構成が同じようになる（はず）という利点もありますが、小さなサーバ構成でも大きめのひな形が必要だったり、変数がどこで宣言されているのかわかりづらかったり、気軽に始めづらかったり……と微妙に使いづらいところがあります。

さらに、chef-soloではなくchefを使うのはプロビジョニングを行うエージェントとなるサーバが必要で大掛かりになってしまうことや、chef-solo＆knife-soloでできることはAnsibleで（たぶんだいたい）できてしまうので、最近はAnsibleの方が人気なのが頷けるなぁと思いました。