[CentOS6][Chef] ChefでLAMP構成をつくる7 - パッケージを追加したらサービス再起動


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

今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、Apacheのサービスは起動中です。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのPHPパッケージを追加し、サービスを再起動するようにします。

1.PHP 用のCookbook 修正


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

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


以下のファイルにChefspecのテストケースを追加します。
  • ~/chef-repo/cookbooks/php/spec/default_spec.rb 
PHPのパッケージが追加された場合と、ついでに、"/etc/php.ini" が変更された場合に Apache のサービスを再起動するようになっているかチェックします。
内容は、以下のとおり。赤字部分を追加。
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
PHPのパッケージ(php-mbstring、php-gd)を追加した場合と、ついでに、"/etc/php.ini" を変更した場合に Apache のサービスを再起動するようにします。
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]"
end
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "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
赤字部分の番号を "'0.1.2" にし、Cookbookの依存関係を depends で定義します。
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