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


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

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

今回は、前回の「 [CentOS6][Chef] ChefでLAMP構成をつくる3 - PHPの設定ファイル変更」に引き続き、MySQLの設定ファイル(my.cnf)を定義するレシピを追加します。

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

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

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

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

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

1.MySQL 用のCookbook 修正


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

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


以下のファイルにChefspecのテストケースを追加します。
  • ~/chef-repo/cookbooks/mysql/spec/default_spec.rb 
今回は、レシピに my.cnf を作成する記述があるかチェックするテストケースを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

  # template
  it 'should create my.cnf' do
    expect(chef_run).to create_file '/etc/my.cnf'
    file = chef_run.template('/etc/my.cnf')
    expect(file.mode).to eq "0644"
    expect(file).to be_owned_by('root', 'root')
  end

end
このテストケースでは、my.cnf  ファイルの所有者(root,root)とパーミション(0644)もチェックしています。
まだ、レシピを作成していませんが、試しに、このテストケースを実行すると以下のようにエラーが表示されます。
テストケースは、"example" と表記され、"3 example, 1failure" は、全部で3件のテストケースがあり、そのうち1件が失敗したという意味になります。
$ cd ~/chef-repo/cookbooks
$ rspec -fd --color mysql

mysql::default
  should install mysql
  should install mysql-server
  should create my.cnf (FAILED - 1)

Failures:

  1) mysql::default should create my.cnf
     Failure/Error: expect(chef_run).to create_file '/etc/my.cnf'
       No file resource named '/etc/my.cnf' with action :create found.
     # ./mysql/spec/default_spec.rb:15:in `block (2 levels) in <top (required)>'

Finished in 0.01811 seconds
3 examples, 1 failure

Failed examples:

rspec ./mysql/spec/default_spec.rb:14 # mysql::default should create my.cnf

1.2.レシピ修正


以下のファイルにレシピを追加します。
  • ~/chef-repo/cookbooks/mysql/recipes/default.rb
今回は、テンプレートを用意してMySQLの設定ファイル(my.cnf)を作成します。
Charset を変更可能なパラメータとしてアトリビュートで定義することにしますが、
Apacheのレシピ のように variables の機能は使わずに、アトリビュートに定義したパラメータを直接テンプレートで設定することにします。
内容は以下のとおり
#
# 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

# my.cnf
template "/etc/my.cnf" do
 source "my.cnf.erb"
 owner "root"
 group "root"
 mode "0644"
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

Finished in 0.02368 seconds
3 examples, 0 failures
まだ、テンプレートを作成していませんが、試しに、Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をしてみます。
以下のようにテンプレートが無いというエラーになります。
$ cd ~/chef-repo/cookbooks
$ foodcritic ./mysql
FC033: Missing template: ./mysql/recipes/default.rb:18

1.3.テンプレート作成


以下のファイルにMySQLの設定ファイル(my.cnf)のテンプレートを作成します。
  • ~/chef-repo/cookbooks/mysql/templates/default/my.cnf.erb
まずは、管理対象ノードにあるデフォルトの設定ファイルをコピーします。
$ cd ~/chef-repo/cookbooks/mysql/templates/default
$ ssh root@192.168.1.68 'cat /etc/my.cnf' > ./my.cnf.erb
次に、テンプレート(my.cnf.erb)を修正して、変更可能なパラメータを設定します。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# server charset
character-set-server = <%= node["mysql"]["charset"] %>
skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
# client charset
default-character-set = <%= node["mysql"]["charset"] %>
これで、もう一度、Foodcritic を実行します。以下のように何も表示されなければOKです。
$ foodcritic ./php

この時点で、アトリビュートは定義していませんがエラーにはなりません。

1.4.アトリビュートの設定


アトリビュートはWebGUIでも設定できますが、今回は、以下のファイルにデフォルト値を定義しておきます。
  • ~/chef-repo/cookbooks/mysql/attributes/default.rb
内容は、以下のとおり。
default["mysql"]["charset"] = "utf8"

1.5.バージョンの変更


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

2.CookbookをChefサーバに登録


管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
以下のようにコマンドを実行して、修正した Cookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks
$ knife cookbook upload mysql
Uploading mysql          [0.1.1]
Uploaded 1 cookbook.
ブラウザ(WebGUI)で確認すると下図のとおり。バージョンが2つ表示されます。



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 8 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 (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
    - update template[/etc/my.cnf] from 3ba593 to 3935bc
        --- /etc/my.cnf 2013-04-26 03:44:25.000000000 +0900
        +++ /tmp/chef-rendered-template20130726-29865-e4qj8t    2013-07-26 13:42:01.982054594 +0900
        @@ -5,6 +5,14 @@
         # Disabling symbolic-links is recommended to prevent assorted security risks
         symbolic-links=0

        +# server charset
        +character-set-server = utf8
        +skip-character-set-client-handshake
        +
         [mysqld_safe]
         log-error=/var/log/mysqld.log
         pid-file=/var/run/mysqld/mysqld.pid
        +
        +[client]
        +# client charset
        +default-character-set = utf8

Chef Client finished, 1 resources updated
パッケージのインストールを行うレシピやApache、PHPの設定ファイルの作成については実行済みなので、何も行われていません。(up to date)
MySQLの設定ファイルについては、変更箇所が表示されています。
ちゃんと修正されたか、確認してみます。
# egrep 'character' /etc/my.cnf
character-set-server = utf8
skip-character-set-client-handshake
default-character-set = utf8
WebGUIでノードを見ると下図のとおり。アトリビュートの値が表示されるようになります。
この値は、knifeコマンドやWebGUIで変更できます。



WebGUIで mysql のアトリビュートを変更する手順は、 「 [CentOS6][Chef] ChefでLAMP構成をつくる2 - Apacheの設定ファイル変更」を参考にしてください。