Chef実践入門 第2章


備忘録として使ったコマンドやハマったことなどメモしていきます。
本の方ではVagrantでCentOS 6.5をインストールしていますが、自分の環境では6.4をインストールしているので多少違いがあるかもしれません。
手元のマシンはMacOSです。


### ChefSoloについて
ChefSoloはオープンソースて提供されているChefのスタンドアロン版。
ChefServerを使用しない場合はこちらを使う。



---

##2.4 Chefを動かしてみる

* インストーラでChefをインストールする

```bash
curl -L https://www.opscode.com/chef/install.sh | sudo bash
```

* cookbookを作成する

```bash
sudo knife cookbook create hello -o /var/chef/cookbooks
cd /var/chef/cookbooks
sudo vim /hello/recipes/default.rb
```

* "Hello chef!"と出力するレシピを書く

```bash
vim recipes/default.rb
```

```ruby"var/chef/cookbooks/hello/recipes/default.rb"
 #
 # Cookbook Name:: hello
 # Recipe:: default
 #
 # Copyright 2014, YOUR_COMPANY_NAME
 #
 # All rights reserved - Do Not Redistribute
 #
 #
 log "Hello Chef!!"
```

* レシピを実行
	* -o オプションで実行するレシピを指定

```bash
chef-solo -o hello
```


##2.5 パッケージをインストールする

"dstat"というモニタリングツールをインストールします。
先ほどと同じく、

```bash
sudo knife cookbook create dstat -o /var/chef/cookbooks
```

```ruby"var/chef/cookbooks/dstat/recipes/default.rb"
package "dstat" do 
  action :install
end 
```

```bash
sudo chef-solo -o hello,dstat
```

* rpmでインストール確認

```bash
rpm  -q dstat
> dstat-0.7.0-1.el6.noarch
```


##2.6 knife-soloでchef-soloをリモート実行する

Vmをログアウトして手元の環境に戻ります。

knife-soloはChefをChefSolo環境で利用するためのツール。
手元で作ったクックブックをリモートのサーバーに転送してchef-soloを実行するといったことができるようになる。
berkshelfはクックブックの依存関係を管理するツール。

```bash
gem install knife-solo
gem install berkshelf
```


* knife-soloでリポジトリを作る

Vagrantファイルの置いてあるディレクトリにて実行します。

```bash
pwd
> /Users/yuto/Work/vagrant/centos
knife solo init.
```

```bash
$ tree
.
├── Berksfile
├── Vagrantfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
└── site-cookbooks
```


* knifeを使ってリモートでVMにChefSoloをインストールする

```bash
knife solo bootstrap centos
```


* 先ほどと同じようにdstatのクックブックを作る

```bash
knife cookbook create dstat -o site-cookbooks
vim site-cookbooks/dstat/recipes/default.rb
```

### Nodeオブジェクト
ノード（Chefで管理するサーバ）の状態を記述する設定ファイル。

* dstatレシピを追記しておく

```json"nodes/centos.json"
{
  "run_list": [
    "recipe[dstat]"
  ],
  "automatic": {
    "ipaddress": "centos"
  }
}
```

Nodeオブジェクトに追記することで、2.5のときは実行するレシピを指定していたのが不要になりました。

* プロビジョニング

```bash
knife solo cook centos
```



##2.7 ChefSoloでApache,MySQLをセットアップする


```bash
knife cookbook create apache -o site-cookbooks
knife cookbook create mysql -o site-cookbooks
tree
└── site-cookbooks
    ├── apache
    │   ├── CHANGELOG.md
    │   ├── README.md
    │   ├── attributes
    │   ├── definitions
    │   ├── files
    │   │   └── default
    │   ├── libraries
    │   ├── metadata.rb
    │   ├── providers
    │   ├── recipes
    │   │   └── default.rb
    │   ├── resources
    │   └── templates
    │       └── default
    ├── dstat
    │   ├─ (省略)
    │
    └── mysql
        ├── CHANGELOG.md
        ├── README.md
        ├── attributes
        ├── definitions
        ├── files
        │   └── default
        ├── libraries
        ├── metadata.rb
        ├── providers
        ├── recipes
        │   └── default.rb
        ├── resources
        └── templates
            └── default
```


* Nodeオブジェクトを編集する

```json"nodes/centos.json"
{
  "run_list": [
    "recipe[dstat]",
    "recipe[apache]",
    "recipe[mysql]"
  ],
  "automatic": {
    "ipaddress": "centos"
  }
}
```

* レシピを書く

```ruby"site-cookbooks/apache/recipes/default.rb"
package "httpd" do
  action :install
end

service "httpd" do
  action [:enable, :start]
end
```

```ruby"site-cookbooks/mysql/recipes/default.rb"
package "mysql-server" do
  action :install
end

service "mysqld" do
  action [:enable, :start]
end
```

* レシピを適用

```bash
knife solo cook centos
```


#### Apacheの設定ファイルをChefで扱う
* httpd.confの設定ファイルをVMからコピーしてくる

```bash
# VM側で実行
cp /etc/httpd/conf/httpd.conf /vagrant/site-cookbooks/apache/templates/default/httpd.conf.erb
```

* ServerNameを変えてみる

```erb"site-cookbooks/apache/templates/default/httpd.conf.erb"
ServerName centos-chef:80
```

* apacheのレシピにて、templates以下のhttpd.conf.erbを読むように以下を追記
	* テンプレートを/etc/httpd/conf/httpd.conf 以下に配置
	* owner,groupはrootで、パーミッションは644で
	* notifiesはテンプレートの配置が終わったらhttpdのサービスをリロードしろ、という設定

```ruby"site-cookbooks/apache/recipes/default.rb"
template "httpd.conf" do
  path "/etc/httpd/conf/httpd.conf"
  owner "root"
  group "root"
  mode 0644
  notifies :reload, "service[httpd]"
end
```

* 実行する

```bash
knife solo cook centos
```

* VMを一度削除する

```bach
vagrant destroy -f
```

##2.8 Chefリポジトリの扱い

*これまで作成したレシピをGitで管理します

```bash
git init 
git add .
git commit -m "first commit"
```