[CentOS6][Chef] ChefでLAMP構成をつくる1 - パッケージインストール


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

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

今回は、管理対象のノードに yum でApache、PHP、MySQLのパッケージをインストールするだけの単純なレシピを作ります。

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

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

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

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

今回、Cookbookは、Apache、PHP、MySQL用に3つ作成します。
作成した3つのCookbookは、LAMP環境用のRoleに設定して、まとめてノードに適用することにします。
なお、一応、テストツールを使用して Cookbook に間違いないことを確認してからノードに適用することにします。

1.Apache 用のCookbook 作成


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

1.1.Cookbookのひな形作成


Apache用にCookbookのひな形を作成します。Cookbookの名称は "apache" とします。
$ cd ~/chef-repo/cookbooks
$ knife cookbook create apache
次に、Chefspec 用のひな形を作成します。
$ knife cookbook create_specs apache
これで、~/chef-repo/cookbooks に、以下のようなディレクトリとファイルが作成されます。
"spec" ディレクトリが、Chefspec用のひな形です。ここに、テストケースを格納します。
$ tree apache
apache
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
│   └── default
├── libraries
├── metadata.rb
├── providers
├── recipes
│   └── default.rb
├── resources
├── spec
│   └── default_spec.rb
└── templates
    └── default

11 directories, 5 files


1.2.Chefspec のテストケース作成


Cookbookのひな形ができたので、以下のファイルにChefspecのテストケース作成します。
  • ~/chef-repo/cookbooks/apache/spec/default_spec.rb 
今回は、Apacheのパッケージをyumでインストールするだけなので、レシピに "httpd"パッケージのインストールが記述されているかチェックするテストケースを1つ作成します。
内容は以下のとおり。赤字部分が修正箇所です。
require 'chefspec'

describe 'apache::default' do
  let (:chef_run) { ChefSpec::ChefRunner.new.converge 'apache::default' }
  it 'should install apache' do
    chef_run.should install_package 'httpd'
  end
end
まだ、レシピを作成していませんが、試しに、このテストケースを実行すると以下のようにエラーが表示されます。
テストケースは、"example" と表記され、"1 example, 1failure" は、全部で1件のテストケースがあり、そのうち1件が失敗したという意味になります。
$ cd ~/chef-repo/cookbooks/apache
$ rspec -fd

apache::default
  should install apache (FAILED - 1)

Failures:

  1) apache::default should install apache
     Failure/Error: chef_run.should install_package 'httpd'
       No package resource named 'httpd' with action :install found.
     # ./spec/default_spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 0.00423 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/default_spec.rb:5 # apache::default should install apache

1.3.レシピ作成


以下のファイルにレシピを作成します。
  • ~/chef-repo/cookbooks/apache/recipes/default.rb
今回は、Apacheのパッケージをyumでインストールするだけです。
内容は以下のとおり
#
# Cookbook Name:: apache
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

package "httpd" do
  action :install
end

1.4.Cookbookのテスト


Chefspecのテストケースを実行してレシピをチェックします。
結果が、以下のように "0 failures" であればOKです。
$ cd ~/chef-repo/cookbooks/apache
$ rspec -fd --color

apache::default
  should install apache

Finished in 0.00467 seconds
1 example, 0 failures

Foodcritic で Cookbookの全体的なチェック(文法、矛盾など)を行います。
$ cd ~/chef-repo/cookbooks/apache
$ foodcritic ./
FC008: Generated cookbook metadata needs updating: ./metadata.rb:2
FC008: Generated cookbook metadata needs updating: ./metadata.rb:3
上記の結果では、"metadata.rb" の2行目と3行目にエラーがあります。
初期値のままだとエラーになるようなので、以下のように "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.0'
もう一度、Foodcriticを実行してテストします。以下のように 何も表示されなければOKです。
$ foodcritic ./


2.PHP 用のCookbook作成


手順は上記1と同じです。Cookbookの名称は "php" とします。
今回は、"php"、"php-mysql"の2つのパッケージをインストールすることにします。

作成したテストケースは以下のとおり。
  • ~/chef-repo/cookbooks/php/spec/default_spec.rb
require 'chefspec'

describe 'php::default' do
  let (:chef_run) { ChefSpec::ChefRunner.new.converge 'php::default' }
  %w{ php php-mysql }.each do |s|
    it "should install #{s}" do
      chef_run.should install_package s
    end
  end
end

作成したレシピは以下のとおり。
  • ~/chef-repo/cookbooks/php/recipes/default.rb 
#
# Cookbook Name:: php
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
%w{ php php-mysql }.each do |s|
  package s do
    action :install
  end
end


3.MySQL用のCookbook作成


手順は上記1と同じです。Cookbookの名称は "php" とします。
今回は、"php"、"php-mysql"の2つのパッケージをインストールすることにします。

作成したテストケースは以下のとおり。
  • ~/chef-repo/cookbooks/mysql/spec/default_spec.rb
require 'chefspec'

describe 'mysql::default' do
  let (:chef_run) { ChefSpec::ChefRunner.new.converge 'mysql::default' }
  %w{ mysql mysql-server }.each do |s|
    it "should install #{s}" do
      chef_run.should install_package s
    end
  end
end

作成したレシピは以下のとおり。
  • ~/chef-repo/cookbooks/mysql/recipes/default.rb 
#
# Cookbook Name:: mysql
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
%w{ mysql mysql-server }.each do |s|
  package s do
    action :install
  end
end

4.CookbookをChefサーバに登録


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



5.LAMP用のRoleを作成


Roleの設定は、knifeコマンドでもできるのですが、今回は、ブラウザ(WebGUI)で Roleを設定します。
ここで作成する Role の名称は、"LAMP" とします。
ブラウザで下図の画面を開き、[Name]、[Descprition]を入力、[Default Run List]にレシピを設定して、[Cretae Role]ボタンをクリックします。



[Available Recipes]には、有効なレシピが表示されているので、それを、マウスでドラッグして、[Default Run List]へドロップすると、[Default Run List]を設定できます。



作成した Role を見ると、下図のとおり。この Role で適用されるレシピを確認できます。



6.ノードにレシピを設定 


ブラウザで下図のノード設定画面を開き、[Available Roles] の "LAMP" をマウスでドラッグして、[Run List]へドロップします。
[Available Recipes]からレシピをドラッグ&ドロップしても同じことができますが、今回は、Role を試します。



[Save Node]ボタンをクリックします。



設定後のノードを参照すると、下図のとおり。適用されるレシピを確認することができます。



7.ノードでレシピの実行


管理対象のノードでレシピを実行してパッケージをインストールします。
ノードの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 5 resources
Recipe: apache::default
  * package[httpd] action install
    - install version 2.2.15-28.el6.centos of package httpd

Recipe: php::default
  * package[php] action install
    - install version 5.3.3-23.el6_4 of package php

  * package[php-mysql] action install
    - install version 5.3.3-23.el6_4 of package php-mysql

Recipe: mysql::default
  * package[mysql] action install
    - install version 5.1.69-1.el6_4 of package mysql

  * package[mysql-server] action install
    - install version 5.1.69-1.el6_4 of package mysql-server

Chef Client finished, 5 resources updated
もう一度、同じレシピを適用すると以下のように表示されます。
# /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 5 resources
Recipe: apache::default
  * package[httpd] action install (up to date)
Recipe: php::default
  * package[php] action install (up to date)
  * package[php-mysql] action install (up to date)
Recipe: mysql::default
  * package[mysql] action install (up to date)
  * package[mysql-server] action install (up to date)
Chef Client finished, 0 resources updated

一応、パッケージがインストールされたことを確認してみます。
# rpm -aq | egrep "httpd|php|mysql"
httpd-tools-2.2.15-28.el6.centos.x86_64
php-common-5.3.3-23.el6_4.x86_64
php-cli-5.3.3-23.el6_4.x86_64
php-pdo-5.3.3-23.el6_4.x86_64
mysql-libs-5.1.69-1.el6_4.x86_64
httpd-2.2.15-28.el6.centos.x86_64
php-mysql-5.3.3-23.el6_4.x86_64
mysql-server-5.1.69-1.el6_4.x86_64
php-5.3.3-23.el6_4.x86_64
mysql-5.1.69-1.el6_4.x86_64