[CentOS6][Chef] ChefでLAMP構成をつくる5 - サービス開始と自動起動設定


Create: 2013/07/26
LastUpdate: 2013/07/31
[メニューに戻る]

ここでは、Chef11を使用して、段階的にLAMP環境を構築していきます。

今回は、前回の「 [CentOS6][Chef] ChefでLAMP構成をつくる4 - MySQLの設定ファイル変更」に引き続き、ApacheとMySQLのサービスを開始して自動起動設定するレシピを追加します。

Chef11のテスト環境の詳細については、「メニュー」を参照してください。

  [テスト環境]
  • 管理サーバ
    192.168.1.67(chetos6g) ・・・ Chefサーバ + ワークステーション
  • 管理対象
    192.168.1.68(centos6h) ・・・ ノード

前回同様、テスト駆動開発のように、まずテストケースを作成してからレシピを作成し、実際にノードで実行する前に Cookbook が期待する動作を行うかテストすることにします。

Chefのレシピの書き方や、Chefspecのテストケースの書き方は、以下を参考にしました。

今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、ApacheとMySQLのサービスは停止中で、自動起動設定もされていません。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのApacheとMySQLのサービスを自動起動するように設定し、サービスを開始します。
 

1.Apache 用のCookbook 修正


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

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


以下のファイルにChefspecのテストケースを追加します。
  • ~/chef-repo/cookbooks/apache/spec/default_spec.rb 
今回は、レシピにサービス開始と自動起動設定する記述があるかチェックするテストケースを1つ追加します。
内容は以下のとおり。赤字部分が修正箇所です。
require 'chefspec'

describe 'apache::default' do
  let (:chef_run) { ChefSpec::ChefRunner.new.converge 'apache::default' }

  # package
  it 'should install apache' do
    chef_run.should install_package 'httpd'
  end

~ 省略 ~

  # service
  it 'should start searvice' do
    expect(chef_run).to set_service_to_start_on_boot 'httpd'
    expect(chef_run).to start_service 'httpd'
  end

end

1.2.レシピ修正


以下のファイルにレシピを追加します。
  • ~/chef-repo/cookbooks/apache/recipes/default.rb
Apacheのサービスが自動起動するように設定し、サービスを開始するようにします。
内容は以下のとおり
#
# Cookbook Name:: apache
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

# package
package "httpd" do
  action :install
end

~ 省略 ~

# service
service "httpd" do
  supports :status => true, :restart => true
  action [ :enable, :start ]
end
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color apache

apache::default
  should install apache
  should create httpd.conf
  should start searvice

Finished in 0.02134 seconds
3 examples, 0 failures
Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をします。
以下のように何も表示されなければOKです。
$ cd ~/chef-repo/cookbooks
$ foodcritic ./apache

1.3.バージョンの変更


以下のファイルを修正して Cookbookのバージョン番号を変更します。
  • ~/chef-repo/cookbooks/apache/metadata.rb
赤字部分の番号を "'0.1.2" にします。
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.2'

1.4.CookbookをChefサーバに登録


修正した ApacheのCookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks
$ knife cookbook upload apache
Uploading apache         [0.1.2]
Uploaded 1 cookbook.

2.MySQL 用のCookbook 修正


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

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


以下のファイルにChefspecのテストケースを追加します。
  • ~/chef-repo/cookbooks/mysql/spec/default_spec.rb 
今回は、レシピにサービス開始と自動起動設定する記述があるかチェックするテストケースを1つ追加します。
内容は以下のとおり。赤字部分が修正箇所です。
require 'chefspec'

describe 'mysql::default' do
  let (:chef_run) { ChefSpec::ChefRunner.new.converge 'mysql::default' }

  # package
  %w{ mysql mysql-server }.each do |s|
    it "should install #{s}" do
      chef_run.should install_package s
    end
  end

~ 省略 ~

  # service
  it 'should start searvice' do
    expect(chef_run).to set_service_to_start_on_boot 'mysqld'
    expect(chef_run).to start_service 'mysqld'
  end

end


2.2.レシピ修正


以下のファイルにレシピを追加します。
  • ~/chef-repo/cookbooks/mysql/recipes/default.rb
MySQLのサービスが自動起動するように設定し、サービスを開始するようにします。
内容は以下のとおり
#
# Cookbook Name:: mysql
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

# package
%w{ mysql mysql-server }.each do |s|
  package s do
    action :install
  end
end

~ 省略 ~

# service
service "mysqld" do
  supports :status => true, :restart => true
  action [ :enable, :start ]
end
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color mysql

mysql::default
  should install mysql
  should install mysql-server
  should create my.cnf
  should start searvice

Finished in 0.03124 seconds
4 examples, 0 failures
Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をします。
以下のように何も表示されなければOKです。
$ cd ~/chef-repo/cookbooks
$ foodcritic ./mysql

2.3.バージョンの変更


以下のファイルを修正して Cookbookのバージョン番号を変更します。
  • ~/chef-repo/cookbooks/mysql/metadata.rb
赤字部分の番号を "'0.1.2" にします。
name             'mysql'
maintainer       'blue21'
maintainer_email 'canopus@blue21.ddo.jp'
license          'All rights reserved'
description      'Installs/Configures mysql'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version          '0.1.2'

2.4.CookbookをChefサーバに登録


修正した MySQLのCookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks
$ knife cookbook upload mysql
Uploading mysql          [0.1.2]
Uploaded 1 cookbook.

3.ノードでレシピの実行


管理対象のノードでレシピを実行してMySQLの設定ファイルを変更します。
ノードの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 10 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
    - enable service service[httpd]

  * service[httpd] action start
    - start service service[httpd]

Recipe: php::default
  * package[php] action install (up to date)
  * package[php-mysql] action install (up to date)
  * 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
    - enable service service[mysqld]

  * service[mysqld] action start
    - start service service[mysqld]

Chef Client finished, 4 resources updated
適用済みのレシピは、何も行われていません。(up to date)
ApacheとMySQLのサービスが開始され、自動起動設定されているか、確認してみます。
# chkconfig --list | egrep 'httpd|mysqld'
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
mysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off
# service httpd status
httpd (pid  317) を実行中...
# service mysqld status
mysqld (pid  602) を実行中...
curlコマンドでApacheにアクセスしてみます。
"index.html" を用意していないので、以下のようにステータスが 403 になりますが、Apacheが開始していることは確認できます。
# curl -I http://192.168.1.68:8888/
HTTP/1.1 403 Forbidden
Date: Fri, 26 Jul 2013 05:49:07 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 5039
Connection: close
Content-Type: text/html; charset=UTF-8
mysql コマンドでデータベースに接続してみます。
以下のようにアクセスできればOKです。
# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.69 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.1.69, for redhat-linux-gnu (x86_64) using readline 5.1

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.1.69 Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 3 min 56 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 15  Flush tables: 1  Open tables: 8  Queries per second avg: 0.21
--------------

mysql> Bye