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

chef-soloを使ったスタンドアロン構成

 Chefで用いられるRecipeは、スタンドアロン構成でもクライアント/サーバー構成でも、どちらの場合でも基本的には同じものが利用できる。そのため、まずはスタンドアロン構成でChefを利用してRecipeの作成方法やCookbookの管理方法などを把握すると良い。また、クライアント/サーバー構成を取る場合はサーバーのインストールや設定などが必要であるため、管理するサーバーが少数の場合はそれぞれのマシンでchef-soloを使ったスタンドアロン構成を取ったほうが手間がかからない場合もある。

Chefクライアントのインストール

 Chefはまだ歴史の浅いソフトウェアということもあり、ディストリビューションの公式パッケージとしては提供されていない場合が多い。また、提供されていてもそのバージョンが古いという場合もある。たとえばDebianでは安定版/不安定版の両方でパッケージが提供されているものの、提供されているのは現在の最新版であるバージョン11系(2013年8月現在でバージョン11.6.0)ではなく、その1つ前であるバージョン10系だ。そのため、最新版を利用したい場合はRubyのパッケージ管理システムであるRubyGemsを使ってChefクライアントを含む「chef」パッケージをインストールするのがおすすめだ。

 CentOSの場合、RubyGemsを利用するにはRubyだけでなく、rubygemsパッケージのインストールが必要だ。そのほか、バイナリのビルドのためにruby-develやgcc、makeといったパッケージも必要となる。これらは次のようにyumコマンドでインストールできる。

# yum install ruby ruby-devel rubygems make gcc

 続いて「gem install」コマンドでChefクライアントを含むchefパッケージをインストールする。

# gem install chef

 これで、Recipeを実行するchef-soloコマンドやCookbook管理ツールであるknifeコマンドなどが利用できるようになる。

リポジトリとCookbookの作成

 続いて、Cookbookの作成方法について紹介していこう。Chefでは、Cookbookなどのリソースを格納するディレクトリを「リポジトリ」と呼ぶ。まずは適当なディレクトリにリポジトリとして使用するディレクトリを作成する。

$ mkdir chef-repo

 次に、リポジトリ内にCookbookを格納するディレクトリを作成する。

$ mkdir chef-repo/cookbooks

 Cookbookはテキストファイルとディレクトリから構成される。手動で作成することも可能だが、「knife cookbook create <Cookbook名>」コマンドを利用することでそのひな形を自動生成できる。たとえば「setup-user」というCookbookを作成するには、以下のようにする。

$ cd chef-repo/cookbooks
$ knife cookbook create setup-user -o .

 knifeコマンドの「-o」オプションは、Cookbookを作成するディレクトリを指定するものだ。ここでは「.」を指定してカレントディレクトリに作成するよう指示している。なお、これを省略した場合は「/var/chef/cookbooks/」以下にCookbookが作成される。

Cookbookの構造

 「knife cookbook create」コマンドで作成されたCookbookには、表1のようなディレクトリおよびファイルが用意される。

表1 Cookbookディレクトリ内のファイルおよびディレクトリ
ファイル/ディレクトリ名説明
CHANGELOG.mdCookbookの変更履歴を記述する
README.mdCookbookの概要などを記述する
attributesCookbookで使用するデフォルトのAttributeを記述したファイルを格納するディレクトリ
definitions「Definition」と呼ばれる、リソースを組み合わせて新たなリソースを作成するための設定ファイルを格納するディレクトリ
filesCookbook内で利用されるファイルを格納するディレクトリ
libraries「Library」と呼ばれる、Chefの機能を拡張するためのRubyコードを格納するディレクトリ
metadata.rbCookbookに関する情報(メタデータ)を記述するファイル
providers「Provider」と呼ばれる、リソースに対する処理を実行するための設定ファイルを格納するディレクトリ
recipesRecipe本体を格納するディレクトリ
resources「Resource(リソース)」と呼ばれる、Recipe内で使われる設定対象を定義するための設定ファイルを格納するディレクトリ
templatesCookbook内で利用されるテンプレートファイルを格納するディレクトリ

 このように並べると複雑そうに見えるが、多くの場合使われるのはこの一部のみで、Chefの機能を拡張したり新しいリソースタイプを定義しようとしない限りはdefinitionsやlibraries、providers、resourcesといったディレクトリは不要だ。不要なディレクトリについては削除して構わない。

ユーザーの管理を行うRecipeを作成する

 それでは、実際にRecipeを作成して実行してみよう。ここで作成するのは、指定したグループおよびユーザーを作成するというものだ。Recipeは通常、knifeコマンドで作成されたCookbookのディレクトリ内にあるrecipesディレクトリ内に記述する。このディレクトリ内に「default.rb」というファイルが作成されているはずなので、今回はこのファイルにRecipeの内容を記述していく。

$ vi setup-user/recipes/default.rb

 Recipeの一般的な記述ルールは以下のとおりだ。

<リソースタイプ> <リソース名> do
  <属性> <その値>
 :
 :
  action <リソースに対し実行するアクション>
end

 「リソースタイプ」は、設定対象とするリソースの種別を指定するものだ。たとえばユーザーを作成するなら「user」、グループを作成するなら「group」となる。デフォルトのChefで利用できるリソース一覧はドキュメントのCookbooks項目にまとめられているので、そちらを参照してほしい。

 また、「リソース名」は設定対象とするリソースを識別するための名前だ。この値はリソースタイプによって意味が異なるが、多くの場合そのリソースの名前(たとえば設定対象がユーザー/グループであればそのユーザー名/グループ名、ファイルであればそのファイルパス、サービスであればそのサービス名)を指定する。

 「属性」は、そのリソースに対する設定値を指定するもので、また「action」はそのリソースに対してどのような処理(作成する、削除する、有効にする、無効にする、など)を実行するかを指示するものだ。属性やactionはリソースごとに指定できる値が異なるので、実際にRecipeを作成する際はドキュメントを参照してほしい。

 なお、Recipeファイルは先にも述べたとおりRubyスクリプトとして解釈される。そのため、その基本的な文法はRubyそのままだ。行中の「#」から行末まではコメントとして解釈され、文字列は「”」もしくは「’」で囲むことで指定する。変数や関数の定義および利用も可能だ。

 さて、今回記述する内容は、下記の太字で示した部分だ。default.rbファイル内にはあらかじめCookbook名やRecipe名、コピーライトなどの文言がヘッダとして記述されているので、それに続いてRecipe内で実行する処理を記述していくことになる。

#
# Cookbook Name:: setup-user
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

group "taro" do
  gid 1000
  action :create
end

user "taro" do
  home "/home/taro"
  password '$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0'
  shell "/bin/bash"
  uid 1000
  gid "taro"
  supports :manage_home => true
  action :create
end

 ここではまず、「group」で「taro」というgroup型のリソースを定義している。actionには「:create」(リソースの作成)を指定し、「gid」属性ではグループIDを指定している。つまり、ここで指定した処理内容は「taro」というグループを作成し、そのグループIDを1000とする、というものになる。

 続く「user」では、user型のリソースを定義している。user型のリソースもgroup型と同様、リソース名が作成するユーザー名となる。また、ホームディレクトリやパスワード、利用するシェル、ユーザーID、所属するグループなどの属性も指定している。なお、password属性の値にはハッシュ化したパスワードを指定する。ハッシュ化されたパスワードは「grub-crypt」コマンドで生成できる。

# grub-crypt --sha-512
Password:  ←ハッシュ化したいパスワードを入力
Retype password:  ←再度同じパスワードを入力
$6$OmC3KootOURrqOaP$63rwQ2bSE8op8wXa.ZWzgxm/iGvePTzEL5lOntmkPyYh5Qwh4lWs2DtyoEHcvsbYV5Q6a2ezzrZueb2ydrkhz0
↑ハッシュ化されたパスワードが表示される

 なお、ChefのRecipeではファイル内に記述した順番で処理が実行される。そのため、userの設定よりも先にgroupの設定を記述しておく必要がある。