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


OpsWorksの実行

カスタムChefレシピの作成

定義ファイルの作成

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のインストール

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

Cookbook作成

basicという名前のCookbookの作成

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

Chef ファイル構成

$ 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サーバ構築

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の設定ファイル作成

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の作成

vim /opt/chef-test/solo.json
solo.json
{
  "run_list" : [
    "recipe[basic::install]"
  ]
}
$ 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 [[email protected]]
[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

設定ファイルの取り込み

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

予め用意しておいたhttpd.confを用いる場合 by template

用意したhttpd.confhttp.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ファイル中の定義ファイルに定義する。

%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