Create: 2013/07/26
LastUpdate: 2013/07/31
ここでは、Chef11を使用して、段階的にLAMP環境を構築していきます。
今回は、前回の「 [CentOS6][Chef] ChefでLAMP構成をつくる2 - Apacheの設定ファイル変更」に引き続き、PHPの設定ファイル(php.ini)を定義するレシピを追加します。
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について
今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、PHPの設定ファイル(php.ini)は、パッケージのデフォルト設定になっています。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのPHPの設定ファイル(php.ini)を変更します。
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' } # package %w{ php php-mysql }.each do |s| it "should install #{s}" do chef_run.should install_package s 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') end endこのテストケースでは、php.ini ファイルの所有者(root,root)とパーミション(0644)もチェックしています。
まだ、レシピを作成していませんが、試しに、このテストケースを実行すると以下のようにエラーが表示されます。
テストケースは、"example" と表記され、"3 example, 1failure" は、全部で3件のテストケースがあり、そのうち1件が失敗したという意味になります。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color php
php::default
should install php
should install php-mysql
should create php.ini (FAILED - 1)
Failures:
1) php::default should create php.ini
Failure/Error: expect(chef_run).to create_file '/etc/php.ini'
No file resource named '/etc/php.ini' with action :create found.
# ./php/spec/default_spec.rb:15:in `block (2 levels) in <top (required)>'
Finished in 0.24995 seconds
3 examples, 1 failure
Failed examples:
rspec ./php/spec/default_spec.rb:14 # php::default should create php.ini
1.2.レシピ修正
以下のファイルにレシピを追加します。
- ~/chef-repo/cookbooks/php/recipes/default.rb
Timezone を変更可能なパラメータとしてアトリビュートで定義することにしますが、
Apacheのレシピ のように variables の機能は使わずに、アトリビュートに定義したパラメータを直接テンプレートで設定することにします。
内容は以下のとおり
# # Cookbook Name:: php # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # # package %w{ php php-mysql }.each do |s| package s do action :install end end # php.ini template "/etc/php.ini" do source "php.ini.erb" owner "root" group "root" mode "0644" endChefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color php
php::default
should install php
should install php-mysql
should create php.ini
Finished in 0.03205 seconds
3 examples, 0 failures
まだ、テンプレートを作成していませんが、試しに、Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をしてみます。以下のようにテンプレートが無いというエラーになります。
$ cd ~/chef-repo/cookbooks $ foodcritic ./php FC033: Missing template: ./php/recipes/default.rb:18
1.3.テンプレート作成
以下のファイルにPHPの設定ファイル(php.ini)のテンプレートを作成します。
- ~/chef-repo/cookbooks/php/templates/default/php.ini.erb
$ cd ~/chef-repo/cookbooks/php/templates/default $ ssh root@192.168.1.68 'cat /etc/php.ini' > ./php.ini.erb次に、テンプレート(php.ini.erb)を修正して、変更可能なパラメータを設定します。
~省略~ ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; [Date] ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone = "<%= node["php"]["timezone"] %>" ~省略~これで、もう一度、Foodcritic を実行します。以下のように何も表示されなければOKです。
$ foodcritic ./phpこの時点で、アトリビュートは定義していませんがエラーにはなりません。
1.4.アトリビュートの設定
アトリビュートはWebGUIでも設定できますが、今回は、以下のファイルにデフォルト値を定義しておきます。
- ~/chef-repo/cookbooks/php/attributes/default.rb
default["php"]["timezone"] = "Asia/Tokyo"
1.5.バージョンの変更
以下のファイルを修正して 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.1'
2.CookbookをChefサーバに登録
管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
以下のようにコマンドを実行して、修正した Cookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks $ knife cookbook upload php Uploading php [0.1.1] Uploaded 1 cookbook.ブラウザ(WebGUI)で確認すると下図のとおり。バージョンが2つ表示されます。
3.ノードでレシピの実行
管理対象のノードでレシピを実行してPHPの設定ファイルを変更します。
ノードの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 7 resources Recipe: apache::default * package[httpd] action install (up to date) * template[/etc/httpd/conf/httpd.conf] action create (up to date) Recipe: php::default * package[php] action install (up to date) * package[php-mysql] action install (up to date) * template[/etc/php.ini] action create - update template[/etc/php.ini] from e662c5 to ab75ba --- /etc/php.ini 2013-07-13 05:40:34.000000000 +0900 +++ /tmp/chef-rendered-template20130726-22612-ot0wc4 2013-07-26 11:06:59.355054595 +0900 @@ -228,7 +228,7 @@ ; http://www.php.net/manual/en/ini.core.php#ini.short-open-tag short_open_tag = Off -; Allow ASP-style <% %> tags. +; Allow ASP-style tags. ; http://www.php.net/manual/en/ini.core.php#ini.asp-tags asp_tags = Off @@ -943,7 +943,7 @@ [Date] ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone -;date.timezone = +date.timezone = "Asia/Tokyo" ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.default-latitude ;date.default_latitude = 31.7667 Recipe: mysql::default * package[mysql] action install (up to date) * package[mysql-server] action install (up to date) Chef Client finished, 1 resources updatedパッケージのインストールを行うレシピやApacheの設定ファイルの作成については実行済みなので、何も行われていません。(up to date)
PHPの設定ファイルについては、変更箇所が表示されています。
ちゃんと修正されたか、確認してみます。
# egrep timezone /etc/php.ini ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone = "Asia/Tokyo"WebGUIでノードを見ると下図のとおり。アトリビュートの値が表示されるようになります。
この値は、knifeコマンドやWebGUIで変更できます。
WebGUIで php のアトリビュートを変更する手順は、 「 [CentOS6][Chef] ChefでLAMP構成をつくる2 - Apacheの設定ファイル変更」を参考にしてください。