[CentOS6][Chef] ChefでLAMP構成をつくる8 - MySQLのユーザとDB作成


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

今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、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


end
ruby 用パッケージ(ruby-mysql)のインストールと、シンボリック・リンクを作成をチェックします。

1.2.レシピ修正


以下のファイルにレシピを追加します。
  • ~/chef-repo/cookbooks/mysql/recipes/database.rb
MySQLのユーザ(app_user)とデータベース(appdb)を作成します。
内容は以下のとおり。
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]
end
Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "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
赤字部分の番号を "'0.1.3" にします。
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>