Create: 2013/07/30
LastUpdate: 2013/07/31
ここでは、Chef11を使用して、段階的にLAMP環境を構築していきます。
今回は、前回の「 [CentOS6][Chef] ChefでLAMP構成をつくる7 - パッケージを追加したらサービス再起動」に引き続き、MySQLのユーザとデータベースを作成するレシピを追加します。
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でテスト駆動のサーバ構築管理
- chef で mysql のユーザやデータベースを管理する
今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、MySQLのサービスは起動中です。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのMySQLにユーザとデータベースを作成するようにします。
なお、今回作成するレシピは、database.rb の名称で、別ファイルに作成します。
また、MySQLのユーザとデータベースを作成するレシピは、Opscodeコミュニティで公開されている database cookbook から、MySQL用のライブラリをコピーして使用します。
1.MySQL 用のCookbook 修正
以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
1.1.Chefspec のテストケース追加
新しく作成するレシピの database.rb 用に、以下のファイルにChefspecのテストケースを作成します。
- ~/chef-repo/cookbooks/mysql/spec/database_spec.rb
MySQLのユーザとデータベースを作成する処理については、Chefspecでチェックする方法(できるかどうかも)がわからなかったので、今回は、テストケースを作成しませんでした。
require 'chefspec' describe 'mysql::database' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'mysql::database' } # package it "should install ruby-mysql" do chef_run.should install_chef_gem "ruby-mysql" expect(chef_run.link("/tmp/mysql.sock")).to link_to "/var/lib/mysql/mysql.sock" end endruby 用パッケージ(ruby-mysql)のインストールと、シンボリック・リンクを作成をチェックします。
1.2.レシピ修正
以下のファイルにレシピを追加します。
- ~/chef-repo/cookbooks/mysql/recipes/database.rb
内容は以下のとおり。
link "/tmp/mysql.sock" do to "/var/lib/mysql/mysql.sock" end chef_gem "ruby-mysql" do source "http://production.cf.rubygems.org" action :install end mysql_connection_info = { :host => "localhost", :username => 'root', :password => '' } mysql_database "appdb" do connection mysql_connection_info action :create end mysql_database_user "app_user" do connection mysql_connection_info password "app_pass" database_name "appdb" privileges [:select, :update, :insert, :delete] action [:create, :grant] endChefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks $ rspec -fd --color mysql mysql::database should install ruby-mysql mysql::default should install mysql should install mysql-server should create my.cnf should start searvice Finished in 0.08435 seconds 5 examples, 0 failures
1.4.ライブラリの作成
Opscodeコミュニティで公開されている database cookbook をダウンロードして解凍します。
$ cd /tmp $ curl -L -o ./database.tgz http://community.opscode.com/cookbooks/database/versions/1_4_0/downloads $ tar xvfz ./database.tgz以下の赤字で示したライブラリを、MySQL用のCookcookにコピーします。
$ ls -l database/libraries/ 合計 60 -rw-r--r-- 1 chef chef 3273 5月 28 12:48 2013 provider_database_mysql.rb -rw-r--r-- 1 chef chef 3070 5月 28 12:48 2013 provider_database_mysql_user.rb -rw-r--r-- 1 chef chef 5113 5月 28 12:48 2013 provider_database_postgresql.rb -rw-r--r-- 1 chef chef 2659 5月 28 12:48 2013 provider_database_postgresql_user.rb -rw-r--r-- 1 chef chef 3351 5月 28 12:48 2013 provider_database_sql_server.rb -rw-r--r-- 1 chef chef 3984 5月 28 12:48 2013 provider_database_sql_server_user.rb -rw-r--r-- 1 chef chef 2548 5月 28 12:48 2013 resource_database.rb -rw-r--r-- 1 chef chef 2025 5月 28 12:48 2013 resource_database_user.rb -rw-r--r-- 1 chef chef 1083 5月 28 12:48 2013 resource_mysql_database.rb -rw-r--r-- 1 chef chef 1110 5月 28 12:48 2013 resource_mysql_database_user.rb -rw-r--r-- 1 chef chef 1155 5月 28 12:48 2013 resource_postgresql_database.rb -rw-r--r-- 1 chef chef 1182 5月 28 12:48 2013 resource_postgresql_database_user.rb -rw-r--r-- 1 chef chef 1101 5月 28 12:48 2013 resource_sql_server_database.rb -rw-r--r-- 1 chef chef 1128 5月 28 12:48 2013 resource_sql_server_database_user.rbコピー後のMySQL用Cookbookのライブラリは以下のとおり。
$ ls -l ~/chef-repo/cookbooks/mysql/libraries/ 合計 24 -rw-rw-r-- 1 chef chef 3273 7月 30 10:56 2013 provider_database_mysql.rb -rw-rw-r-- 1 chef chef 3070 7月 30 10:56 2013 provider_database_mysql_user.rb -rw-rw-r-- 1 chef chef 2548 7月 30 10:56 2013 resource_database.rb -rw-rw-r-- 1 chef chef 2025 7月 30 10:56 2013 resource_database_user.rb -rw-rw-r-- 1 chef chef 1083 7月 30 10:56 2013 resource_mysql_database.rb -rw-rw-r-- 1 chef chef 1110 7月 30 10:56 2013 resource_mysql_database_user.rb
1.4.metadata の変更
以下のファイルを修正して Cookbookの metadata 変更します。
- ~/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.3' recipe 'mysql', "install mysql." recipe 'mysql::database', "create user & database."Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)をします。
以下のように何も表示されなければOKです。
$ cd ~/chef-repo/cookbooks $ foodcritic ./mysql
1.5.CookbookをChefサーバに登録
修正した ApacheのCookbook をChefサーバにアップロードします。
$ cd ~/chef-repo/cookbooks $ knife cookbook upload mysql Uploading mysql [0.1.3] Uploaded 1 cookbook.
2.ノードの Run List にレシピを追加
WebGUI を使用して、管理対象ノードの Run List に 今回作成したレシピ(mysql::database)を追加します。
下図のようにノード編集の画面を開き、[Available Recipes]に表示された mysql::database をマウスでドラッグして、[Run List]へドロップします。
[Run List]に mysql::database が表示されていることを確認して、[Save Node]ボタンをクリックします。
3.ノードでレシピの実行
管理対象のノードに、root ユーザでログインして作業します。
以下のようにコマンドを実行して、レシピを実行します。
# /opt/chef/bin/chef-client Starting Chef Client, version 11.4.4 resolving cookbooks for run list: ["apache", "php", "mysql", "mysql::database"] Synchronizing Cookbooks: - mysql - apache - php Compiling Cookbooks... Recipe: mysql::database * chef_gem[ruby-mysql] action install - install version 2.9.11 of package ruby-mysql Converging 16 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 (up to date) * package[php-gd] 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 (up to date) * service[mysqld] action start (up to date) Recipe: mysql::database * link[/tmp/mysql.sock] action create - create symlink at /tmp/mysql.sock to /var/lib/mysql/mysql.sock * chef_gem[ruby-mysql] action install (up to date) * mysql_database[appdb] action create * mysql_database_user[app_user] action create * mysql_database_user[app_user] action grant Chef Client finished, 5 resources updated適用済みのレシピは、何も行われていません。(up to date)
MySQLのユーザとデータベースが作成されたことが確認できます。
作成したデータベースに接続してみます。
# mysql --user=app_user --password=app_pass appdb Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 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>