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のテストケースの書き方は、以下を参考にしました。
- 入門Chef Solo - Infrastructure as Code を読みながらChef Soloで遊べるようになるまで
- Cookbookテストフレームワーク「ChefSpec」
- chefspecチートシート
- Cucumber, ChefSpecとchefでテスト駆動のサーバ構築管理
- はじめてのレシピ - kikumotoのメモ帳
- Chefのtemplateにrecipeからデータを渡すvariablesについて
今回使用する管理対象のノードは、前回のレシピを実行した状態になっているので、ApacheとMySQLのサービスは停止中で、自動起動設定もされていません。
そこで、今回作成する新しいレシピを実行することで、管理対象ノードのApacheとMySQLのサービスを自動起動するように設定し、サービスを開始します。
1.Apache 用のCookbook 修正
以下、管理サーバに chefユーザでログインして、Chefのワークステーションで作業します。
1.1.Chefspec のテストケース追加
以下のファイルにChefspecのテストケースを追加します。
- ~/chef-repo/cookbooks/apache/spec/default_spec.rb
内容は以下のとおり。赤字部分が修正箇所です。
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
内容は以下のとおり
# # 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 ] endChefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "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
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
内容は以下のとおり。赤字部分が修正箇所です。
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
内容は以下のとおり
# # 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 ] 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
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
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-8mysql コマンドでデータベースに接続してみます。
以下のようにアクセスできれば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