Create: 2013/07/31
LastUpdate: 2013/07/31
ここでは、Chef11を使用して、段階的にLAMP環境を構築していきます。
今回は、前回の「 [CentOS6][Chef] ChefでLAMP構成をつくる6 - 設定ファイルを修正したらサービス再起動」に引き続き、PHPのパッケージを追加したらサービスを再起動するレシピを追加します。
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でテスト駆動のサーバ構築管理
- はじめてのレシピ - kikumotoのメモ帳
- Chefのtemplateにrecipeからデータを渡すvariablesについて
今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、Apacheのサービスは起動中です。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのPHPパッケージを追加し、サービスを再起動するようにします。
1.PHP 用のCookbook 修正
以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
1.1.Chefspec のテストケース追加
以下のファイルにChefspecのテストケースを追加します。
- ~/chef-repo/cookbooks/php/spec/default_spec.rb
内容は、以下のとおり。赤字部分を追加。
require 'chefspec' describe 'php::default' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'php::default' } # include it 'should include recipe' do expect(chef_run).to include_recipe 'apache' end # package %w{ php php-mysql php-mbstring php-gd }.each do |s| it "should install #{s}" do chef_run.should install_package s chef_run.package(s).should notify( 'service[httpd]', :restart ) end end # template it 'should create php.ini' do expect(chef_run).to create_file '/etc/php.ini' file = chef_run.template('/etc/php.ini') expect(file.mode).to eq "0644" expect(file).to be_owned_by('root', 'root') expect(file).to notify( 'service[httpd]', :restart ) end end
1.2.レシピ修正
以下のファイルにレシピを追加します。
- ~/chef-repo/cookbooks/php/recipes/default.rb
Apacheサービスのレシピについては、ApacheのCookbookのデフォルトのレシピを include_recipe して使用します。
内容は以下のとおり。赤字部分を追加
# # Cookbook Name:: php # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # include_recipe "apache" # package %w{ php php-mysql php-mbstring php-gd }.each do |s| package s do action :install notifies :restart, "service[httpd]" end end # php.ini template "/etc/php.ini" do source "php.ini.erb" owner "root" group "root" mode "0644" notifies :restart, "service[httpd]" endChefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color php
php::default
should include recipe
should install php
should install php-mysql
should install php-mbstring
should install php-gd
should create php.ini
Finished in 0.06316 seconds
5 examples, 0 failures
1.3.バージョンと依存関係の変更
以下のファイルを修正して Cookbookのバージョン番号を変更します。
- ~/chef-repo/cookbooks/php/metadata.rb
name 'php' maintainer 'blue21' maintainer_email 'canopus@blue21.ddo.jp' license 'All rights reserved' description 'Installs/Configures php' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.2' depends "apache"Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をします。
以下のように何も表示されなければOKです。
$ cd ~/chef-repo/cookbooks $ foodcritic ./apache
1.4.CookbookをChefサーバに登録
修正した PHPのCookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks $ knife cookbook upload php Uploading php [0.1.2] Uploaded 1 cookbook.
2.ノードでレシピの実行
管理対象のノードに、root ユーザでログインして作業します。
ノードのChefクライアントをデーモン化していれば、自動的にレシピが実行されるのですが、今回はデーモン化していないので、管理対象のノードにログインして、Chefクライアントを実行します。
以下のようにコマンドを実行します。
# /opt/chef/bin/chef-client
Starting Chef Client, version 11.4.4
resolving cookbooks for run list: ["apache", "php", "mysql"]
Synchronizing Cookbooks:
- mysql
- apache
- php
Compiling Cookbooks...
Converging 12 resources
Recipe: apache::default
* package[httpd] action install (up to date)
* template[/etc/httpd/conf/httpd.conf] action create (up to date)
* service[httpd] action enable (up to date)
* service[httpd] action start (up to date)
Recipe: php::default
* package[php] action install (up to date)
* package[php-mysql] action install (up to date)
* package[php-mbstring] action install
- install version 5.3.3-23.el6_4 of package php-mbstring
* package[php-gd] action install
- install version 5.3.3-23.el6_4 of package php-gd
* template[/etc/php.ini] action create (up to date)
Recipe: mysql::default
* package[mysql] action install (up to date)
* package[mysql-server] action install (up to date)
* template[/etc/my.cnf] action create (up to date)
* service[mysqld] action enable (up to date)
* service[mysqld] action start (up to date)
Recipe: apache::default
* service[httpd] action restart
- restart service service[httpd]
Chef Client finished, 3 resources updated
適用済みのレシピは、何も行われていません。(up to date)PHPのパッケージが追加されて、赤字部分で、Apacheのサービスを再起動しているのがわかります。
ちゃんとパッケージが追加されたか、確認してみます。
# rpm -aq | grep php php-gd-5.3.3-23.el6_4.x86_64 php-cli-5.3.3-23.el6_4.x86_64 php-mysql-5.3.3-23.el6_4.x86_64 php-mbstring-5.3.3-23.el6_4.x86_64 php-common-5.3.3-23.el6_4.x86_64 php-pdo-5.3.3-23.el6_4.x86_64 php-5.3.3-23.el6_4.x86_64