Edited at

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

More than 3 years have passed since last update.


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 [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


設定ファイルの取り込み

設定ファイルの取り込み方について、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