LoginSignup
6
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-15

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5