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のテストケースの書き方は、以下を参考にしました。
- 入門Chef Solo - Infrastructure as Code を読みながらChef Soloで遊べるようになるまで
- Cookbookテストフレームワーク「ChefSpec」
- chefspecチートシート
- Cucumber, ChefSpecとchefでテスト駆動のサーバ構築管理
- はじめてのレシピ - kikumotoのメモ帳
- Chefのtemplateにrecipeからデータを渡すvariablesについて
今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、MySQLの設定ファイル(my.cnf)は、パッケージのデフォルト設定になっています。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのMySQLの設定ファイル(my.cnf)を変更します。
1.MySQL 用のCookbook 修正
以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
1.1.Chefspec のテストケース追加
以下のファイルにChefspecのテストケースを追加します。
- ~/chef-repo/cookbooks/mysql/spec/default_spec.rb
内容は以下のとおり。赤字部分が修正箇所です。
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
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" endChefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "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
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 = utf8WebGUIでノードを見ると下図のとおり。アトリビュートの値が表示されるようになります。
この値は、knifeコマンドやWebGUIで変更できます。
WebGUIで mysql のアトリビュートを変更する手順は、 「 [CentOS6][Chef] ChefでLAMP構成をつくる2 - Apacheの設定ファイル変更」を参考にしてください。