【#Chef】Linux 環境での Chef Solo（chef-solo）と Berkshelf 3 の基本的な使い方 #GetChef_ja

Linux（RHEL系）環境での Chef Solo と Berkshelf の基本的な使い方について自分用のメモとしてまとめました。

AWS の EC2 インスタンス上に作成した Linux（RHEL6.5系）環境で Chef Solo と Berkshelf を使って Apache HTTP Server をインストールします。

## 1: iptables の無効化

AWS の セキュリティグループの機能で適切なセキュリティ設定が行われていることを前提に、 iptables を無効化します。

### 手順 1-1: iptables サービスを停止します

```bash
[bash]$ sudo service "iptables" stop
[bash]$ sudo service "iptables" status

iptables: Firewall is not running.
```

→ 上記のように表示されることを確かめます。

### 手順 1-2: iptables サービスの自動起動を無効化します

```bash
[bash]$ sudo chkconfig "iptables" off
[bash]$ chkconfig --list | grep "iptables"

iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

→ 上記のように表示されることを確かめます。

## 2: Chef Development Kit (Chef-DK) のセットアップ

Chef と Berkshelf のインストール手順です。

Chef-DK をインストールすることで、Chef と Berkshelf をまとめてインストールします。

### 手順 2-1: Chef-DK と Git をインストールします

```bash
[bash]$ sudo yum -y install "git" "https://packagecloud.io/chef/stable/download?distro=6&filename=chefdk-0.2.2-1.x86_64.rpm"
[bash]$ rpm -qa | egrep "git-|chefdk"

git-1.7.1-3.el6_4.1.x86_64
chefdk-0.2.2-1.x86_64
```

### 手順 2-2: ディレクトリ `/etc/chef/` を作成します

```bash
[bash]$ sudo mkdir -p /etc/chef
[bash]$ ls -ld /etc/chef/

drwxr-xr-x 2 root root 4096 Xxx XX XX:XX /etc/chef/
```

### 手順 2-3: Chef Solo の設定ファイル `solo.rb` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/solo.rb
environment_path "/etc/chef/environments"
data_bag_path "/etc/chef/data_bags"
cookbook_path "/var/chef/cookbooks"
file_cache_path "/var/cache/chef"
EOF
```

## 3: ラッパークックブックの作成

コミュニティに公開されているクックブック `Apache2` をラップするだけの簡単なクックブックを作成します。

### 手順 3-1: Cookbook の置き場を作成します

```bash
[bash]$ sudo mkdir -p /var/chef/site-cookbooks
[bash]$ ls -ld /var/chef/site-cookbooks/

drwxr-xr-x 2 root root 4096 Xxx XX XX:XX /var/chef/site-cookbooks
```

### 手順 3-2: berks コマンドを使って `wrapper-cookbook` という名前でクックブックのひな形を作成します

```bash
[bash]$ cd /var/chef/site-cookbooks/
[bash]$ sudo chef exec berks cookbook "wrapper-cookbook" --skip-vagrant --skip-test-kitchen  --license="reserved" --maintainer="YOUR_NAME" --maintainer-email="YOUR_EMAIL"
[bash]$ ls -ld /var/chef/site-cookbooks/wrapper-cookbook/

drwxr-xr-x 10 root root 4096 Xxx XX XX:XX /var/chef/site-cookbooks/wrapper-cookbook/
```

### 手順 3-3: Cookbook のメタデータ設定ファイル `metadata.rb` を編集します

```bash
[bash]$  echo "depends 'apache2'" | sudo tee -a /var/chef/site-cookbooks/wrapper-cookbook/metadata.rb
```

```rb:metadata.rb
name             'wrapper-cookbook'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures wrapper-cookbook'
long_description 'Installs/Configures wrapper-cookbook'
version          '0.1.0'

depends 'apache2'
```

### 手順 3-4: Cookbook のデフォルトレシピファイル `default.rb` を編集します

```bash
[bash]$ echo "depends 'apache2'" | sudo tee -a /var/chef/site-cookbooks/wrapper-cookbook/recipes/default.rb
```

```rb:default.rb
#
# Cookbook Name:: wrapper-cookbook
# Recipe:: default
#
# Copyright (C) 2014 YOUR_NAME
#
# All rights reserved - Do Not Redistribute
#
depends 'apache2'
```
## 4: クックブックの適用（Chef Solo の実行）

ここでは、Chef の Environment という機能を利用して Chef Solo の実行します。

Environment を利用することで、クックブック内で指定している Attribute（変数）の値を上書きすることができます。

開発環境と本番環境など、環境によって異なるパラメーターを設定する必要がある場合に便利です。

### 手順 4-1: Berkshelf を使って依存関係のあるクックブックをダウンロードします

```bash
[bash]$ cd /var/chef/site-cookbooks/wrapper-cookbook/
[bash]$ sudo chef exec berks vendor /var/chef/cookbooks
[bash]$ ls -l /var/chef/cookbooks/

total 24
drwxr-xr-x.  7 root root 4096 Sep 26 03:51 apache2
-rw-------.  1 root root  266 Sep 26 03:51 Berksfile.lock
drwxr-xr-x.  6 root root 4096 Sep 26 03:51 iptables
drwxr-xr-x.  7 root root 4096 Sep 26 03:51 logrotate
drwxr-xr-x.  6 root root 4096 Sep 26 03:51 pacman
drwxr-xr-x. 10 root root 4096 Sep 26 03:51 wrapper-cookbook
```

### 手順 4-2: Node の設定ファイル `node.json` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/node.json
{
  "run_list": "wrapper-cookbook::default"
}
EOF
```

### 手順 4-3: Environment の置き場を作成します

```bash
[bash]$ sudo mkdir -p /etc/chef/environments
[bash]$ ls -ld /etc/chef/environments/

drwxr-xr-x 2 root root 4096 Xxx xx xx:xx /etc/chef/environments
```

### 手順 4-4: Environment の設定ファイル `development.json` を作成します

```bash
[bash]$ cat << EOF | sudo tee /etc/chef/environments/development.json
{
  "name": "development",
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {
    "apache2": {
      "worker": {
        "startservers": 4,
        "serverlimit": 16,
        "maxclients": 1024,
        "minsparethreads": 64,
        "maxsparethreads": 192,
        "threadsperchild": 64,
        "maxrequestsperchild": 0
      }
    }
  }
}
EOF
```

### 手順 4-5: Chef Solo を実行します

```bash
[bash]$ sudo chef-solo -j "/etc/chef/node.json" -E "development"
```

→ レシピが実行され、エラーメッセージが表示されなければ成功です。


以上