Chef-Soloを使ってApacheをインストールする

# 1.はじめに
[前回の記事](http://qiita.com/_daisuke0802/items/670d92c8d69309fc3b85)でChefに興味のある方を対象といいつつ、Vagrant+VirtualBoxによる
仮想環境の構築で終わってしまいましたので今回こそはChefについて触れてみたいと思います。

+ 本稿の範囲：仮想環境上にChef SoloによるApacheインストール
+ 対象読者：Chefに興味があるものの未だ使用経験の無い方
+ 検証環境：OS X Meverics

今回はVagrant+VirtualBoxで構築した仮想環境を使います。
"Vagrant+VirtualBoxによる仮想環境構築"については[前回の記事](http://qiita.com/_daisuke0802/items/670d92c8d69309fc3b85)を参照のこと。

# 2. Chefとは
Chefとは、記述されたコードに基づきITインフラの自動構築を行なうプラットホームです。
（似たものでは"Puppet"というのも存在しますが、こちらは未検証。）
構築するITインフラの状態は"レシピ"と呼ばれるファイルにRubyの文法で記述します。

本稿ではChef Soloを使用しますが、これはChefServerとのやりとりを必要とせずに
ITインフラの構築を行なうツールです。

## 2.1. Chefを使って幸せになる
Chefはいかにして我々を幸せにしてくれるのでしょうか。
例えば、あなたがアプリケーションエンジニアだったとして何か面白いサービスを思いついたとします。
その時に、ゼロからITインフラの構築をするのは非常に面倒くさいものです。
(Apacheをインストールして、PHPをインストールして、MySQLをインストールして etc..)
こういったITインフラの構築作業はChefに任せてしまえばいくつかのコマンドを実行するだけで自動に、
そして、速やかに作業を終えてくれ、エンジニアは本来やるべき作業に速やかに着手することができます。
いやはや、素晴らしい！

それでは、実際にChef Soloを使ってのApacheのインストールを行なっていきます。

# 3. 仮想環境を作る
ターミナルを開いていただき適当な環境を作ります。

```ターミナル
$ mkdir HelloChefSolo
$ cd HelloChefSolo/
```

## 3.1. 初期化
適当なboxを追加します。今回は、CentOS 6.5のboxを追加します。
boxを追加したら`vagrant init`と入力しVagrantfileを作ります。

```ターミナル
$ vagrant box add github-centos-6.5 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box 
==> box: Adding box 'github-centos-6.5' (v0) for provider: 
    box: Downloading: https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
==> box: Successfully added box 'github-centos-6.5' (v0) for 'virtualbox'!

$ vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

## 3.2. Vagrantfileの編集
`vagrant init`で作られたVagrantfileを以下のように編集します。
（コメントは省略しています。）

```Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "github-centos-6.5"　　<--- addしたboxの名称
  config.vm.network "private_network", ip: "192.168.33.10"  <--- ゲストマシンのIPアドレス
end
```

## 3.3. ゲストマシン起動
`vagrant up`と入力し起動します。

```ターミナル
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'github-centos-6.5'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: HelloChefSolo_default_1402230557250_8293
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/nakagawadaisuke/HelloChefSolo
```

無事に起動しました。
起動したら、`vagrant ssh`でゲストマシンに接続します。

```ターミナル
$ vagrant ssh
[vagrant@vagrant-centos65 ~]$ 
```

以降は、ゲストマシン上での操作になります。

# 4. Chef Soloのインストール
Chefのインストーラを取得して実行します。
Chef本体をインストールすることでChef Soloも入ります。

```ゲストマシン
$ curl -L https://www.opscode.com/chef/install.sh | sudo bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15934  100 15934    0     0   2473      0  0:00:06  0:00:06 --:--:-- 31181
Downloading Chef  for el...
downloading https://www.opscode.com/chef/metadata?v=&prerelease=false&nightlies=false&p=el&pv=6&m=x86_64
  to file /tmp/install.sh.2045/metadata.txt
trying curl...
url	https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.12.8-1.el6.x86_64.rpm
md5	f5b6fd9c72f64fb8e11685e6fbffe189
sha256	0d3bba21a4abe19adb08993ce0b8bc24107b89c159edb15d8f82cfd8867ab3cc
downloaded metadata file looks valid...
downloading https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.12.8-1.el6.x86_64.rpm
  to file /tmp/install.sh.2045/chef-11.12.8-1.el6.x86_64.rpm
trying curl...
Comparing checksum with sha256sum...
Installing Chef 
installing with rpm...
warning: /tmp/install.sh.2045/chef-11.12.8-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 83ef826a: NOKEY
Preparing...                ########################################### [100%]
   1:chef                   ########################################### [100%]
Thank you for installing Chef!
```

成功しました。
`chef-solo -v`でバージョン情報が取得できるか確認してみましょう。

```ゲストマシン
[vagrant@vagrant-centos65 ~]$ chef-solo -v
Chef: 11.12.8
```

# 5.クックブック、レシピの作成
## 5.1. クックブックの作成
クックブックを作成するには`knie cookbook create`コマンドを使用します。
特に場所を指定しないとリポジトリディレクトリ（/var/chef）にクックブックを作成します。

コマンドの構文はこのようになっています。
`knife cookbook create {COOKBOOK_NAME} {option}`

クックブックの出力先を指定する場合にはオプションに`-o {PATH}`もしくは`--cookbook-path {PATH}`とします。
とりあえずデフォルトのリポジトリディレクトリにクックブックを作ります。

```ゲストマシン
[vagrant@vagrant-centos65 ~]$ sudo mkdir /var/chef
[vagrant@vagrant-centos65 bin]$ sudo knife cookbook create apache
WARNING: No knife configuration file found
** Creating cookbook apache
** Creating README for cookbook: apache
** Creating CHANGELOG for cookbook: apache
** Creating metadata for cookbook: apache
```

`/var/chef/cookbooks`に"apache"ディレクトリが作られました。
中身はこのようになっています。

```ゲストマシン
[vagrant@vagrant-centos65 apache]$ ll /var/chef/cookbooks/apache/
total 44
-rw-r--r-- 1 root root  451 Jun  8 13:21 CHANGELOG.md
-rw-r--r-- 1 root root 1448 Jun  8 13:21 README.md
drwxr-xr-x 2 root root 4096 Jun  8 13:21 attributes
drwxr-xr-x 2 root root 4096 Jun  8 13:21 definitions
drwxr-xr-x 3 root root 4096 Jun  8 13:21 files
drwxr-xr-x 2 root root 4096 Jun  8 13:21 libraries
-rw-r--r-- 1 root root  276 Jun  8 13:21 metadata.rb
drwxr-xr-x 2 root root 4096 Jun  8 13:21 providers
drwxr-xr-x 2 root root 4096 Jun  8 13:21 recipes
drwxr-xr-x 2 root root 4096 Jun  8 13:21 resources
drwxr-xr-x 3 root root 4096 Jun  8 13:21 templates
```

レシピは、recipesディレクトリの中に入っています。

## 5.2. レシピの編集
クックブックを作成した際に作られた"recipes"ディレクトリへ移動しましょう。

```ゲストマシン
[vagrant@vagrant-centos65 apache]$ cd /var/chef/cookbooks/apache/recipes/
[vagrant@vagrant-centos65 recipes]$ ll
total 4
-rw-r--r-- 1 root root 132 Jun  8 13:21 default.rb
```

`default.rb`というファイル（レシピ）があります。
これを以下のように編集します。

```default.rb
#
# Cookbook Name:: apache
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

package "httpd" do
  action :install
end

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

ざっくり二つの部分から構成されています。
まず最初に出てくるのがこの部分です。
ほとんど読んだままですが、ここで"httpd"パッケージをinstallしています。

```default.rb
package "httpd" do
  action :install
end
```

次に二つ目の部分です。
ここで"httpd"に対して"有効"かつ”開始"にしています。

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

非常にシンプルなレシピですが、これで何ができるのか。実際に動かしてみましょう。

# 6. Chef Solo実行
`chef-solo`コマンドで実行します。
`-o`オプションで作成したクックブックを指定します。

```ゲストマシン
[vagrant@vagrant-centos65 recipes]$ sudo chef-solo -o apache
[2014-06-08T13:51:54+00:00] WARN: *****************************************
[2014-06-08T13:51:54+00:00] WARN: Did not find config file: /etc/chef/solo.rb, using command line options.
[2014-06-08T13:51:54+00:00] WARN: *****************************************
[2014-06-08T13:51:54+00:00] WARN: 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
SSL validation of HTTPS requests is disabled. HTTPS connections are still
encrypted, but chef is not able to detect forged replies or man in the middle
attacks.

To fix this issue add an entry like this to your configuration file:

\```
  # Verify all HTTPS connections (recommended)
  ssl_verify_mode :verify_peer

  # OR, Verify only connections to chef-server
  verify_api_cert true
\```

To check your SSL configuration, or troubleshoot errors, you can use the
\`knife ssl check` command like so:

\```
  knife ssl check -c /etc/chef/solo.rb
\```

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

Starting Chef Client, version 11.12.8
[2014-06-08T13:52:02+00:00] WARN: Run List override has been provided.
[2014-06-08T13:52:02+00:00] WARN: Original Run List: []
[2014-06-08T13:52:02+00:00] WARN: Overridden Run List: [recipe[apache]]
Compiling Cookbooks...
Converging 2 resources
Recipe: apache::default
  * package[httpd] action install
    - install version 2.2.15-30.el6.centos of package httpd

  * service[httpd] action enable
    - enable service service[httpd]

  * service[httpd] action start
    - start service service[httpd]


Running handlers:
Running handlers complete

Chef Client finished, 3/3 resources updated in 387.471681083 seconds
```

いくつかのWARNが出たものの、無事にインストールから、有効、起動まで終了したようです。
では、実際にWEBブラウザから確認してみましょう。

# 7. WEBブラウザから確認
WEBブラウザからApacheへアクセスできるか確認します。
Vagrantfileで編集したIPアドレス（192.168.33.10）にアクセスします。

`http://192.168.33.10/`です。

以下のようにApacheが応答を返してくれました。

![apache.png](https://qiita-image-store.s3.amazonaws.com/0/43853/b0ad6d64-3100-490b-b2d5-4a41b443649a.png)

# 8. 後片付け
動作確認まで終わりましたのでゲストマシンを停止します。お疲れさまでした。

```
[vagrant@vagrant-centos65 recipes]$ exit
logout
Connection to 127.0.0.1 closed.

$ vagrant halt
==> default: Attempting graceful shutdown of VM...
```

# 9. まとめ
かなりの駆け足でしたがChef Soloのインストールからクックブックの作成、レシピの作成、Chef Solo実行と進んできました。
リポジトリはクックブックを包含しクックブックはレシピを包含する、`リポジトリ>クックブック>レシピ`という構成が何となく把握していただければ幸いです。

# 10. 次回予告
本稿では、プロビジョニングの対象となるサーバーに直接ログインして作業を行いましたが、これでは少し面倒なような？
というわけで、次回は"knife solo"というツールを使用して作業端末からプロビジョニング対象のサーバーに対し、Chef Soloの実行をリモートに行なう方法について書いてみたいと思います。