AWS OpsWorksで速攻でカスタムChefレシピによるEC2へのプロビジョニング + Chefのおさらい

#OpsWorksの実行
##カスタムChefレシピの作成
###定義ファイルの作成

```bash
mkdir -p ops-works-base/base/recipes
vim ops-works-base/base/recipes/install.rb
```
PHPによるWebサーバ構築する簡単なレシピは例えば以下のようになる。

```install.rb
package "vim-enhanced" do
  action :install
end

%w{php mysql-server httpd}.each do |p|
  package p do
    action :install
  end
end

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

###GutHubのレポジトリに置く
GitHub中にレポジトリを作成し、そちらに直下にbaseディレクトリが来るように先ほど作成したファイルを配置する。
ここでは```ops-works-base```というレポジトリ名とする。

##OpsWorksの設定
1.マネジメントコンソールから[OpsWorks]を選択
2.[Add stack]を選択

3.以下の4つを設定する。Default SSH keyやRepository URLは適宜自分の使っているSSH Keyの物に置き換える。

Stack name: SampleStack
Default SSH key:aws-test

Use custom Chef cookbooks: Yes
Repository URL: https://github.com/xxxxxxx/ops-works-base.git

それ以外のVPCの設定などはデフォルトのまま進める。

4.[Add stack]を選択
5.[Add a layer]を選択

Name: Sample Web Server
Short name: sample

6.[Add layer]を選択


7.Layersの画面になるので、作成したlayerに対して、[Add instance]を選択

8.[New]のタブから、必要事項を入力する。
ここでは、Hostnameは記入して、Sizeをt2microに変更して、残りはデフォルトの設定にする。SSH keyは適当なものになっているか確認しておく。

Hostname: sample
Size: t2.micro


9.作成したhostに対して、[start]を選択。
10.起動したインスタンスのStatusがOnlineになったら、[Stack]を選択して[Run command]を選択。 
 
  Command: Execute Recipes
Recipes to execute: basic::install

  になっていることを確認して実行する。ここでは、残り全てデフォルトの設定で行う。

上記の実行結果が成功すれば完了。Chefbookでの設定内容がサーバに反映されているか確認してみてください。

#注意点
##Chef単体とOpsWorksにおける違い

- Cookbooksファイル以外のファイル(solo.json,solo.rb等)はGitHubのレポジトリに含める必要がない。
- Chefではrecipeファイルを```knife cookbook create```を用いて作成するが、OpsWorksでは必要なrubyファイルを作成して適切なディレクトリ中に配置する形でGitHubのレポジトリにおけば良い。


#Chef 要点おさらい
Chefには以下の2種類による方法がある。

* スタンドアロン構成
* クライアント/サーバ構成(Chef Server)

ここでは、スタンドアロン構成としてchef-soloによる方法を取り上げる。

なお、chef-soloがdepricatedな予定なので、代わりにChef Client Local Modeを使うことが推奨されている。
https://blog.chef.io/2014/06/24/from-solo-to-zero-migrating-to-chef-client-local-mode/

##chef-soloによるプロビジョニング
最低、recipeファイルとsolo.rb,solo,jsonの3つのファイルを編集することでプロビジョニングが可能になる。

###Chefのインストール

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

##Cookbook作成
basicという名前のCookbookの作成

```bash
knife cookbook create basic -o /opt/chef-test/
```

###Chef ファイル構成

```bash
$ tree /opt/chef-test/
/opt/chef-test/
├── basic
│   ├── CHANGELOG.md
│   ├── README.md
│   ├── attributes
│   ├── definitions
│   ├── files
│   │   └── default
│   ├── libraries
│   ├── metadata.rb
│   ├── providers
│   ├── recipes
│   │   ├── default.rb
│   │   └── install.rb
│   ├── resources
│   └── templates
│       └── default
├── solo.json
└── solo.rb

18 directories, 16 files
```

files: ソースファイル
temlates: 設定ファイル
attributes: レシピ、設定ファイルの値

###PHP Webサーバ構築
```bash
vim /opt/chef-test/basic/recipes/install.rb
```

```
package "vim-enhanced" do
  action :install
end

%w{php mysql-server httpd}.each do |p|
  package p do
    action :install
  end
end

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


chef-soloの設定ファイル作成

```bash
vim /opt/chef-test/solo.rb
```


```solo.rb
base = File.expand_path('..', __FILE__)
cookbook_path [base]
```

###※注意点
cookbook_pathは```/opt/chef-test```にCookbookを置くのであれば、このまま絶対パスで書く必要がある。
絶対パスを直書きしても良いが汎用性が下がるので、ここではFile.expand_path()を使用している。
```cookbook_path['/opt/chef-test/']```のように記述しても良い。


実行するRecipeを指定するJSONの作成

```bash
vim /opt/chef-test/solo.json
```

```solo.json
{
  "run_list" : [
    "recipe[basic::install]"
  ]
}
```


```bash
$ cd /opt/chef-test
$ sudo chef-solo -c solo.rb -j solo.json
[2016-09-13T02:03:21+00:00] INFO: Started chef-zero at chefzero://localhost:8889 with repository at /opt/chef-test
  One version per cookbook

[2016-09-13T02:03:21+00:00] INFO: Forking chef instance to converge...
[2016-09-13T02:03:21+00:00] INFO: *** Chef 12.13.37 ***
[2016-09-13T02:03:21+00:00] INFO: Platform: x86_64-linux
[2016-09-13T02:03:21+00:00] INFO: Chef-client pid: 26603
[2016-09-13T02:03:23+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found: chefzero://localhost:8889/nodes/test1.localdomain
[2016-09-13T02:03:23+00:00] INFO: Setting the run_list to ["recipe[basic::install]"] from CLI options
[2016-09-13T02:03:23+00:00] INFO: Run List is [recipe[basic::install]]
[2016-09-13T02:03:23+00:00] INFO: Run List expands to [basic::install]
[2016-09-13T02:03:23+00:00] INFO: Starting Chef Run for test1.localdomain
[2016-09-13T02:03:23+00:00] INFO: Running start handlers
[2016-09-13T02:03:23+00:00] INFO: Start handlers complete.
[2016-09-13T02:03:23+00:00] INFO: HTTP Request Returned 404 Not Found: Object not found:
[2016-09-13T02:03:23+00:00] WARN: Cookbook 'local-mode-cache' is empty or entirely chefignored at /home/ec2-user/local-mode-cache
[2016-09-13T02:03:23+00:00] INFO: Loading cookbooks [basic@0.1.0]
[2016-09-13T02:03:23+00:00] INFO: Storing updated cookbooks/basic/CHANGELOG.md in the cache.
[2016-09-13T02:03:23+00:00] INFO: Storing updated cookbooks/basic/metadata.rb in the cache.
[2016-09-13T02:03:23+00:00] INFO: Storing updated cookbooks/basic/recipes/install.rb in the cache.
[2016-09-13T02:03:23+00:00] INFO: Storing updated cookbooks/basic/recipes/default.rb in the cache.
[2016-09-13T02:03:23+00:00] INFO: Storing updated cookbooks/basic/README.md in the cache.
[2016-09-13T02:03:23+00:00] INFO: Processing yum_package[vim-enhanced] action install (basic::install line 1)
[2016-09-13T02:03:24+00:00] INFO: Processing yum_package[php] action install (basic::install line 6)
[2016-09-13T02:03:24+00:00] INFO: Processing yum_package[mysql-server] action install (basic::install line 6)
[2016-09-13T02:03:24+00:00] INFO: Processing yum_package[httpd] action install (basic::install line 6)
[2016-09-13T02:03:24+00:00] INFO: Processing service[httpd] action start (basic::install line 11)
[2016-09-13T02:03:24+00:00] INFO: Processing service[httpd] action enable (basic::install line 11)
[2016-09-13T02:03:24+00:00] INFO: Chef Run complete in 1.189445961 seconds
[2016-09-13T02:03:24+00:00] INFO: Running report handlers
[2016-09-13T02:03:24+00:00] INFO: Report handlers complete
```

[](
solo.jsonでのRecipeの指定名が間違っていると以下のようなエラーが出る¥
¥
```bash¥
================================================================================¥
Error Resolving Cookbooks for Run List:¥
================================================================================¥
¥
Missing Cookbooks:¥
------------------¥
No such cookbook: apache:install¥
¥
Expanded Run List:¥
------------------¥
* apache:install¥
¥
Platform:¥
---------¥
x86_64-linux¥
```¥
)

##設定ファイルの取り込み
設定ファイルの取り込み方について、```template```と```cookbook_file```のそれぞれによる方法を取り上げる。両者の違いは、```template```が静的ファイルを対象としているのに対して、```cookbook_file```は```.erb```のファイルを読み込み可能で動的な設定が可能である。


###予め用意しておいたhttpd.confを用いる場合 by template
用意した```httpd.conf```を```http.conf.erb```としておき、templates/default以下に置く。また、recipeファイル中の定義ファイルでhttpdをインストールしてから、読み込む宣言の前にtemplateを用いて、以下を追記する。

```
template '/etc/httpd/conf/httpd.conf' do
  source 'httpd.conf.erb'
  action :create
end
```

###PHPの各種モジュールをインストールしてphp.iniの内容をWebサーバに反映 by cookbook_file
httpdがインストールされた後に以下をrecipeファイル中の定義ファイルに定義する。

```rb
 %w[php php-devel php-mbstring gd-devel php-gd php-mysql].each do |pkg|
        yum_package pkg do
          action :install
        end
end

cookbook_file "/etc/php.ini" do
  mode 0644
  notifies :reload, 'service[httpd]'
end
```


#参考
公式ドキュメント
https://aws.amazon.com/jp/opsworks/
AWS OpsWorksでカスタムChefレシピを実行をする方法
http://aws.typepad.com/sajp/2014/05/opsworks-custom-recipe.html
Chefでサーバを構築する方法 入門編 [httpd,php,mysqlを一発で入れる]
http://tkoyama1988.hatenablog.com/entry/2015/01/05/144656
Chefレシピ逆引きメモ
http://qiita.com/makoto_kw/items/53a84380559c087eb8fb