Create: 2013/07/17
LastUpdate: 2013/07/31
ここでは、Chef11を使用して、段階的にLAMP環境を構築していきます。
今回は、管理対象のノードに yum でApache、PHP、MySQLのパッケージをインストールするだけの単純なレシピを作ります。
Chef11のテスト環境の詳細については、「メニュー」を参照してください。
[テスト環境]
- 管理サーバ
192.168.1.67(chetos6g) ・・・ Chefサーバ + ワークステーション - 管理対象
192.168.1.68(centos6h) ・・・ ノード
進め方としては、テスト駆動開発のように、まずテストケースを作成してからレシピを作成し、実際にノードで実行する前に Cookbook が期待する動作を行うかテストすることにします。
Chefのレシピの書き方や、Chefspecのテストケースの書き方は、以下を参考にしました。
- 入門Chef Solo - Infrastructure as Code を読みながらChef Soloで遊べるようになるまで
- Cookbookテストフレームワーク「ChefSpec」
- chefspecチートシート
- Cucumber, ChefSpecとchefでテスト駆動のサーバ構築管理
今回、Cookbookは、Apache、PHP、MySQL用に3つ作成します。
作成した3つのCookbookは、LAMP環境用のRoleに設定して、まとめてノードに適用することにします。
なお、一応、テストツールを使用して Cookbook に間違いないことを確認してからノードに適用することにします。
1.Apache 用のCookbook 作成
以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
1.1.Cookbookのひな形作成
Apache用にCookbookのひな形を作成します。Cookbookの名称は "apache" とします。
$ cd ~/chef-repo/cookbooks $ knife cookbook create apache次に、Chefspec 用のひな形を作成します。
$ knife cookbook create_specs apacheこれで、~/chef-repo/cookbooks に、以下のようなディレクトリとファイルが作成されます。
"spec" ディレクトリが、Chefspec用のひな形です。ここに、テストケースを格納します。
$ tree apache apache ├── CHANGELOG.md ├── README.md ├── attributes ├── definitions ├── files │ └── default ├── libraries ├── metadata.rb ├── providers ├── recipes │ └── default.rb ├── resources ├── spec │ └── default_spec.rb └── templates └── default 11 directories, 5 files
1.2.Chefspec のテストケース作成
Cookbookのひな形ができたので、以下のファイルにChefspecのテストケース作成します。
- ~/chef-repo/cookbooks/apache/spec/default_spec.rb
内容は以下のとおり。赤字部分が修正箇所です。
require 'chefspec' describe 'apache::default' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'apache::default' } it 'should install apache' do chef_run.should install_package 'httpd' end endまだ、レシピを作成していませんが、試しに、このテストケースを実行すると以下のようにエラーが表示されます。
テストケースは、"example" と表記され、"1 example, 1failure" は、全部で1件のテストケースがあり、そのうち1件が失敗したという意味になります。
$ cd ~/chef-repo/cookbooks/apache $ rspec -fd apache::default should install apache (FAILED - 1) Failures: 1) apache::default should install apache Failure/Error: chef_run.should install_package 'httpd' No package resource named 'httpd' with action :install found. # ./spec/default_spec.rb:6:in `block (2 levels) in <top (required)>' Finished in 0.00423 seconds 1 example, 1 failure Failed examples: rspec ./spec/default_spec.rb:5 # apache::default should install apache
1.3.レシピ作成
以下のファイルにレシピを作成します。
- ~/chef-repo/cookbooks/apache/recipes/default.rb
内容は以下のとおり
# # Cookbook Name:: apache # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # package "httpd" do action :install end
1.4.Cookbookのテスト
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks/apache
$ rspec -fd --color
apache::default
should install apache
Finished in 0.00467 seconds
1 example, 0 failures
Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)を行います。$ cd ~/chef-repo/cookbooks/apache $ foodcritic ./ FC008: Generated cookbook metadata needs updating: ./metadata.rb:2 FC008: Generated cookbook metadata needs updating: ./metadata.rb:3上記の結果では、"metadata.rb" の2行目と3行目にエラーがあります。
初期値のままだとエラーになるようなので、以下のように "metadata.rb" を修正します。(赤字部分)
name 'apache' maintainer 'blue21' maintainer_email 'canopus@blue21.ddo.jp' license 'All rights reserved' description 'Installs/Configures apache' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.0'もう一度、Foodcriticを実行してテストします。以下のように 何も表示されなければOKです。
$ foodcritic ./
2.PHP 用のCookbook作成
手順は上記1と同じです。Cookbookの名称は "php" とします。
今回は、"php"、"php-mysql"の2つのパッケージをインストールすることにします。
作成したテストケースは以下のとおり。
- ~/chef-repo/cookbooks/php/spec/default_spec.rb
require 'chefspec' describe 'php::default' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'php::default' } %w{ php php-mysql }.each do |s| it "should install #{s}" do chef_run.should install_package s end end end作成したレシピは以下のとおり。
- ~/chef-repo/cookbooks/php/recipes/default.rb
# # Cookbook Name:: php # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # %w{ php php-mysql }.each do |s| package s do action :install end end
3.MySQL用のCookbook作成
手順は上記1と同じです。Cookbookの名称は "php" とします。
今回は、"php"、"php-mysql"の2つのパッケージをインストールすることにします。
作成したテストケースは以下のとおり。
- ~/chef-repo/cookbooks/mysql/spec/default_spec.rb
require 'chefspec' describe 'mysql::default' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'mysql::default' } %w{ mysql mysql-server }.each do |s| it "should install #{s}" do chef_run.should install_package s end end end作成したレシピは以下のとおり。
- ~/chef-repo/cookbooks/mysql/recipes/default.rb
# # Cookbook Name:: mysql # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # %w{ mysql mysql-server }.each do |s| package s do action :install end end
4.CookbookをChefサーバに登録
管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
以下のようにコマンドを実行して、作成した Cookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks $ knife cookbook upload apache Uploading apache [0.1.0] Uploaded 1 cookbook. $ knife cookbook upload php Uploading php [0.1.0] Uploaded 1 cookbook. $ knife cookbook upload mysql Uploading mysql [0.1.0] Uploaded 1 cookbook.ブラウザ(WebGUI)で確認すると下図のとおり。
5.LAMP用のRoleを作成
Roleの設定は、knifeコマンドでもできるのですが、今回は、ブラウザ(WebGUI)で Roleを設定します。
ここで作成する Role の名称は、"LAMP" とします。
ブラウザで下図の画面を開き、[Name]、[Descprition]を入力、[Default Run List]にレシピを設定して、[Cretae Role]ボタンをクリックします。
[Available Recipes]には、有効なレシピが表示されているので、それを、マウスでドラッグして、[Default Run List]へドロップすると、[Default Run List]を設定できます。
作成した Role を見ると、下図のとおり。この Role で適用されるレシピを確認できます。
6.ノードにレシピを設定
ブラウザで下図のノード設定画面を開き、[Available Roles] の "LAMP" をマウスでドラッグして、[Run List]へドロップします。
[Available Recipes]からレシピをドラッグ&ドロップしても同じことができますが、今回は、Role を試します。
[Save Node]ボタンをクリックします。
設定後のノードを参照すると、下図のとおり。適用されるレシピを確認することができます。
7.ノードでレシピの実行
管理対象のノードでレシピを実行してパッケージをインストールします。
ノードのChefクライアントをデーモン化していれば、自動的にレシピが実行されるのですが、今回はデーモン化していないので、管理対象のノードにログインして、Chefクライアントを実行します。
管理対象に、root ユーザでログインし、以下のようにコマンドを実行します。
# /opt/chef/bin/chef-client Starting Chef Client, version 11.4.4 resolving cookbooks for run list: ["apache", "php", "mysql"] Synchronizing Cookbooks: - mysql - php - apache Compiling Cookbooks... Converging 5 resources Recipe: apache::default * package[httpd] action install - install version 2.2.15-28.el6.centos of package httpd Recipe: php::default * package[php] action install - install version 5.3.3-23.el6_4 of package php * package[php-mysql] action install - install version 5.3.3-23.el6_4 of package php-mysql Recipe: mysql::default * package[mysql] action install - install version 5.1.69-1.el6_4 of package mysql * package[mysql-server] action install - install version 5.1.69-1.el6_4 of package mysql-server Chef Client finished, 5 resources updatedもう一度、同じレシピを適用すると以下のように表示されます。
# /opt/chef/bin/chef-client Starting Chef Client, version 11.4.4 resolving cookbooks for run list: ["apache", "php", "mysql"] Synchronizing Cookbooks: - mysql - php - apache Compiling Cookbooks... Converging 5 resources Recipe: apache::default * package[httpd] action install (up to date) Recipe: php::default * package[php] action install (up to date) * package[php-mysql] action install (up to date) Recipe: mysql::default * package[mysql] action install (up to date) * package[mysql-server] action install (up to date) Chef Client finished, 0 resources updated一応、パッケージがインストールされたことを確認してみます。
# rpm -aq | egrep "httpd|php|mysql" httpd-tools-2.2.15-28.el6.centos.x86_64 php-common-5.3.3-23.el6_4.x86_64 php-cli-5.3.3-23.el6_4.x86_64 php-pdo-5.3.3-23.el6_4.x86_64 mysql-libs-5.1.69-1.el6_4.x86_64 httpd-2.2.15-28.el6.centos.x86_64 php-mysql-5.3.3-23.el6_4.x86_64 mysql-server-5.1.69-1.el6_4.x86_64 php-5.3.3-23.el6_4.x86_64 mysql-5.1.69-1.el6_4.x86_64