[CentOS6][Chef] ChefでLAMP構成をつくる3 - PHPの設定ファイル変更


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のテストケースの書き方は、以下を参考にしました。

今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、PHPの設定ファイル(php.ini)は、パッケージのデフォルト設定になっています。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのPHPの設定ファイル(php.ini)を変更します。
 

1.PHP 用のCookbook 修正


以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。

1.1.Chefspec のテストケース追加


以下のファイルにChefspecのテストケースを追加します。
  • ~/chef-repo/cookbooks/php/spec/default_spec.rb 
今回は、レシピに php.ini を作成する記述があるかチェックするテストケースを1つ追加します。
内容は以下のとおり。赤字部分が修正箇所です。
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
今回は、テンプレートを用意してPHPの設定ファイル(php.ini)を作成します。
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"
end
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "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
赤字部分の番号を "'0.1.1" にします。
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の設定ファイル変更」を参考にしてください。