サーバー設定ツール「Chef」の概要と基礎的な使い方 4ページ

公開されているCookbookを使う

 続いては、Chefの開発元であるOpscodeやサードパーティが公開しているCookbookを利用する方法について述べていこう。

 Chefが注目されている理由の1つに、非常に多数のCookbookが公開されている点がある。Opscodeが運営するコミュニティ向けサイト(http://community.opscode.com/)ではOpscodeやサードパーティが作成したCookbookが公開されており、その数は1000を超えている。公開されているCookbookはGCCやmakeなどの基本的なコンパイル環境を構築する「build-essential」やJava環境を構築する「java」といったものから、「apache2」や「mysql」といった特定のアプリケーションのインストールおよび設定を行うもの、「application」などの独自のCookbookやRecipe作成を支援するライブラリ的なもの、特定の設定ファイルやOS設定を操作するための「ssh_knows_hosts」や「sudo」、「iptables」など、多岐にわたる。

 ChefにはCookbook実行時の処理内容を変数などで制御できるattributeや、設定処理に必要となるデータを一括管理するData Bagといった仕組みが用意されており、公開されているCookbookとこれらを組み合わせることで、Recipeを一切自作することなしにサーバー設定を行うことも可能になる。

 以下ではこのような外部で公開されているCookbookを利用する例として、MySQLやそのクライアント、関連ライブラリなどをインストールする「mysql」と、データベースの作成や管理を行う「database」というCookbookを利用する例を紹介しよう。

Cookbookのインストール

 Opscodeのコミュニティサイトで公開されているCookbookは、その個別ページ内にある「Download」リンクからダウンロードできる。ダウンロードしたファイルはtarおよびgzipで圧縮されており、これをCookbookを格納しているディレクトリに展開すれば良い。

$ cp mysql.tgz ~/chef-repo/cookbooks  ←ダウンロードしたCookbookのアーカイブをCookbook格納ディレクトリにコピー
$ cd ~/chef-repo/cookbooks  ←Cookbook格納ディレクトリに移動
$ tar xvzf mysql.tgz  ←Cookbookを展開する

 また、Gitなどのバージョン管理システムのリポジトリが公開されているものもある。この場合、そのリポジトリから直接ソースツリーを入手しても良い。mysql Cookbookの場合、「https://github.com/opscode-cookbooks/mysql.git」というリポジトリからの入手が可能だ。

$ cd ~/chef-repo/cookbooks
$ git clone https://github.com/opscode-cookbooks/mysql.git

 なお、mysql CookbookではRuby向けのクライアントライブラリのインストールなどを行うため、build-essentialというCookbookを内部で呼び出している。また、パスワードのハッシュ化などのためにopensslというCookbookも同様に利用する。これらもダウンロードして展開しておく。

$ git clone https://github.com/opscode-cookbooks/build-essential.git
$ git clone https://github.com/opscode-cookbooks/openssl.git

 なお、このように依存関係にあるCookbookについては、必要となった時点で自動的に実行されるため、明示的にユーザーが実行する必要は通常はない。

 インストールが完了したら、Cookbookを実行してみよう。たとえばMySQLクライアントをインストールするには、「mysql::client」というRecipeを実行する。

# chef-solo -o mysql::client
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Converging 2 resources
Recipe: mysql::client
  * package[mysql] action install
    - install version 5.1.69-1.el6_4 of package mysql

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

Chef Client finished, 2 resources updated

 Recipeの実行結果から、「mysql」および「mysql-devel」というパッケージがインストールされていることが分かる。ここではCentOS環境でこのRecipeを実行しているが、たとえばDebianなど異なる環境では、それぞれの環境に対応したパッケージ(Debianの場合「mysql-client」および「libmysqlclient15-dev」)がインストールされる。これは、環境に応じて適切なパッケージをインストールするようにRecipeが記述されているからだ。

 mysql Cookbookでは、RubyからMySQLにアクセスするために必要なgemパッケージ(mysqlパッケージ)をインストールするための「mysql::ruby」というRecipeも用意されている。

# chef-solo -o mysql::ruby
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
Recipe: build-essential::rhel
  * package[autoconf] action install
    - install version 2.63-5.1.el6 of package autoconf
  
  
Recipe: mysql::ruby
  * chef_gem[mysql] action install
    - install version 2.9.1 of package mysql

 この場合、gemをビルドしてインストールするために必要な関連ツールも同時にインストールされていることが分かる。これらは、build-essential Cookbookを利用してインストールされている。

 MySQLサーバーをインストールするためのRecipeは「mysql::server」となっている。このRecipeを利用する場合、MySQLサーバーのルートパスワードの指定が必要となる。これはRecipeやCookbook内ではなく、chef_soloコマンドの-jオプションで指定するJSONファイル内で指定する。たとえばパスワードを「FooBar13579」に設定する場合、JSONファイルは以下のようになる。

{
  "mysql": {
    "server_root_password": "FooBar13579",
    "server_repl_password": "FooBar13579",
    "server_debian_password": "FooBar13579"
  },
  "run_list": [
    "recipe[mysql::server]"
  ]
}

 なお、「server_root_password」だけでなく、「server_repl_password」や「server_debian_password」の設定も必須のようだ。設定ファイルを作成したら、次のように実行することでMySQLサーバーをインストールできる。

# chef-solo -j /etc/chef/solo.json
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
  
  
Recipe: mysql::client
  * package[mysql] action install (up to date)
  * package[mysql-devel] action install (up to date)
Recipe: mysql::server
  * package[mysql-server] action install
    - install version 5.1.69-1.el6_4 of package mysql-server
  
  
  * template[/etc/mysql_grants.sql] action create
    - create new file /etc/mysql_grants.sql
    - update content in file /etc/mysql_grants.sql from none to 2b12ef
  
  
  * service[mysql] action start (up to date)
Chef Client finished, 11 resources updated

 実行結果は一部省略しているが、Recipeを実行するとMySQLサーバーのインストールや設定ファイルの作成、サービスの実行、rootユーザーのパスワード設定などが行われる。

 ここではrootユーザーのパスワードのみをJSONファイル内で指定しているが、それ以外にも設定ファイルのディレクトリやPIDファイルの作成先、待ち受けを行うIPアドレスやポートなどを同じくJSONファイル内で指定することが可能だ。これらについては、ドキュメントを参照してほしい。

Cookbookダウンロードツールを利用する

 さて、CookbookはOpscodeのコミュニティサイトやGitリポジトリから入手できるが、先のmysql Cookbookの場合でもあったように、Cookbookを利用する際に別のCookbookが必要になることがある。依存するCookbookが多い場合、それぞれを手動でダウンロードするのは面倒だ。そこで、そのような作業を自動で行うための「librarian-chef」や「berkshelf」といったツールが公開されている。

 両者ともに「依存するCookbookをまとめてインストールする」という機能は同じだが、最近ではberkshelfが勧められている。しかし、berkshelfの実行にはRuby 1.9.3以上が必要であるため、環境によっては利用できないことがある。そこで、今回はRuby 1.8系でも利用できるlibrarian-chefのほうを紹介しておこう。

 librarian-chefはRubyGemsで公開されており、gemコマンドでインストールできる。

# gem install librarian-chef

 librarian-chefでは、「Cheffile」と呼ばれる設定ファイルを作成して「librarian-chef install」コマンドを実行することでCookbookをインストールできる。Cheffileのひな形は、「librarian-chef init」コマンドで作成可能だ。

$ librarian-chef init
      create  Cheffile

 インストールするCookbookは、このファイル内の「cookbook」行で指定する。たとえば「database」というCookbookをインストールするCheffileの内容は以下のようになる。

#!/usr/bin/env ruby
#^syntax detection

site 'http://community.opscode.com/api/v1'

cookbook 'database'

 ここで、太字の行がひな形に追記した部分だ。続いて「librarian-chef install」コマンドを実行すると、実行したディレクトリにcookbooksディレクトリが作成され、そこに指定したCookbookと、依存するCookbookがインストールされる。

$ librarian-chef install
Installing aws (0.101.2)
Installing apt (2.0.0)
Installing build-essential (1.4.0)
Installing openssl (1.0.2)
Installing postgresql (3.0.2)
Installing mysql (3.0.2)
Installing xfs (1.1.0)
Installing database (1.4.0)

 なお、このコマンドを実行すると既存のcookbooksディレクトリは上書きされてしまうため、実行の際は注意したい。

既存のCookbookを利用してMySQLデータベースを作成する

 さて、先にlibrarian-chefでインストールしたdatabase Cookbookは、MySQLなどのデータベースやそのユーザー設定を行うものだ。続いてはこのCookbookを使って、データベースおよびユーザーを作成する例を紹介しておこう。

 まず、データベースやユーザーを作成するためのCookbookのひな形をknifeコマンドで作成する。今回は「mysql-db」という名称でこのCookbookを作成することとした。

$ knife cookbook create mysql-db -o .

 次に、作成したCookbookのRecipeのひな形を編集する。

$ vi mysql-db/recipes/default.rb

 Recipeの内容は以下のようにした。処理内容はコメントを参照してほしいが、始めに「include_recipe “database::mysql”」でdatabase Cookbook内の「mysql」というRecipeを読み込んでいる。これにより、database Cookbookで定義されている「mysql_database」や「mysql_database_user」といったリソースが利用可能となる。これらのリソースについては、database Cookbookのドキュメントを参照してほしい。それぞれのリソースでは「connection」属性でデータベース接続に使用するアカウントを定義するが、ここでは「connection_info」変数にそれらの情報を格納して利用している。

# database::mysqlレシピを使用する
include_recipe "database::mysql"

# データベース接続に使用するアカウント情報を定義する
# パスワードはJSONファイル内に記述されたものを使用する
connection_info = ({
  :host => "localhost",
  :username => "root",
  :password => "FooBar2000"
})

# 「testdb」データベースを作成する
mysql_database 'testdb' do
  connection connection_info
  action :create
end

# 「testuser」ユーザーを作成しそのアクセス権とパスワードを設定する
mysql_database_user 'testuser' do
  connection connection_info
  password 'testpassword'
  database_name 'testdb'
  host '%'
  privileges [:all]
  action :grant
end

 Recipeを作成したら、続いてchef-soloを実行する際に指定するsolo.jsonファイルを以下のように変更する。

{
  "run_list": [
    "recipe[database::mysql]",
    "recipe[mysql-db]"
  ]
}

 最後にchef-soloコマンドを実行すると、以下のようにデータベースやユーザーの作成、権限の設定が行われる。

# chef-solo -j /etc/chef/solo.json
Starting Chef Client, version 11.6.0
Compiling Cookbooks...
  
  
Recipe: mysql-db::default
  * mysql_database[testdb] action create
  * mysql_database_user[testuser] action grant

Chef Client finished, 2 resources updated