レシピの作成を通してChefの具体的な使用イメージをつかもう
(2)レシピの作成
試しに簡単なレシピを作成してみましょう。
ここでは、リソース(Resource)を使用してレシピを作成します。
まず、リソースについて説明しましょう。リソースは、レシピで状態を定義するために作成された言語(DSL )です。例えば、“ユーザーが作成されている”“ディレクトリが作成されている”など同じフォーマットで様々な状態を定義できます。基本的なフォーマットは以下の通りです。
<リソースタイプ> "<リソース名>" do <属性(Attribute)> "<属性値>" action :<アクションタイプ> end
リソースで状態を定義する対象や、それに対するアクションには主に以下のものがあります。
カテゴリ | リソース例 | 主なアクション |
---|---|---|
ユーザー | user | 作成/削除/変更/ロック/アンロック |
グループ | group | 作成/削除/変更 |
ディレクトリ | directory | 作成/削除 |
パッケージ | apt_package/gem_package/rpm_package/yum_package | インストール/アップグレード/削除 |
ファイル | cookbook_file/file/remote_file/template | 作成/削除/touch |
シンボリックリンク ハードリンク |
link | 作成/削除 |
下記のリファレンスページに、上記リソースも含めた各リソースに関する説明があります。属性の説明やサンプルも豊富に例示されていますので参考になると思います。リソースを組み合わせると数多くの状態が定義できます。
> Resources and Providers Reference
それでは、リソースを使用して実際にレシピを作成してみましょう。下記のレシピでは、/tmp以下にsampleというファイルがある状態を定義しています。
/home/user01/cookbooks/sample_book/recipesディレクトリにsample_recipe.rbという名前のレシピファイルを以下の通りに作成します。
sample_recipe.rb
file "/tmp/sample" do owner "user01" group "user01" mode "0644" action :create end
chef-soloの実行
(1)実行するレシピ・クックブックの登録
ノード(chef-client/chef-soloを実行するマシン)に実行するレシピを設定します。ここではファイル名をnode.jsonとし、先程作成したレシピをランリストに設定しています。基本的なフォーマットは以下の通りです。
{ "run_list": [ "recipe[<クックブック名>::<レシピ名>]" ] }
/home/user01/node.jsonファイルを作成し以下の通りに記載します。下記のファイルは、ノード固有の変数やランリストと呼ばれる実行レシピリストを定義します。
node.json
{ "run_list": [ "recipe[sample_book::sample_recipe]" ] }
これで準備完了です。
ちなみにクックブックを作成すると、recipesディレクトリにdefault.rbが作成されますが、このファイルは、ランリストに設定する際に名前を省略できるレシピファイルです。下記の通りに設定すると、default.rbレシピが適用されます。
{ "run_list": [ "recipe[sample_book]" ] }
つまり、下記の設定と同じです。
{ "run_list": [ "recipe[sample_book::default]" ] }
(2)実行
それでは、chef-soloを実行してみましょう。/home/user01で以下のコマンドを実行します。root権限が必要となるため、ここではsudoを使用して実行します。
$ sudo chef-solo -c solo.rb -j node.json [sudo] password for user01: Starting Chef Client, version 11.8.0 Compiling Cookbooks... Converging 5 resources Recipe: apache::default ・・・省略・・・ Chef Client finished, X resources updated $
/tmp以下に、“sample”という名前のファイルが存在することを確認しましょう。ファイルのowner・group・modeも定義した内容になっているはずです。
$ ls -lh /tmp ・・・省略・・・ -rwxr-xr-x. 1 user01 user01 0 X月 X X:X X sample ・・・省略・・・ $
Chefはレシピとノードの状態を比較し、異なる場合のみ変更を行います。そのため、レシピの定義と同じ状態でchef-soloを何度実行しても同じ実行結果になります。このように何度実行しても同じ状態になる特徴は、冪等性(べきとうせい)と呼ばれています。
次に、Webサーバのレシピ作成を通して、ファイルの配布やパッケージのインストールなど、Chefでできることについて具体的に紹介します。
Webサーバのレシピを作成してみよう!
(1)レシピを作成する範囲
下記の構築をchef-soloで行います。
- Apacheパッケージのインストール
- httpd.confファイルの配布
- HTMLファイルを配布するディレクトリの作成
- HTMLファイルの配布
- httpdサービスの起動
(2)クックブックの作成
新たに“apache”という名前のクックブックを作成します。
# knife cookbook create apache
まず、配布するファイルを作成します。
今回配布するのは、2. と4. で定義しているhttpd.confとsample.htmlファイルです。
/home/user01/cookbooks/apache/files/defaultディレクトリに作成します。各ファイルの設定を掲載しておきます。
httpd.conf
Listen 80 ServerRoot "/etc/httpd" DocumentRoot "/var/www/html"
User apache Group apache ErrorLog logs/error_log
sample.html
<html> <body> <h1>Hello Chef!</h1> </body> </html>
次に、/home/user01/cookbooks/apache/recipes/default.rbに以下を追記します。
default.rb
以下、リソースごとに各パートについて説明します。
1. Apacheパッケージのインストール(package リソース)
“package”リソースは、パッケージの状態を定義するリソースの1つです。
パッケージとは、例えばRPMやGemパッケージです。パッケージのインストール・削除された状態の定義の他、バージョンの指定も可能です。
1. では、Apacheのパッケージがインストールされた状態を定義しています。
2. httpd.confファイルの配布(cookbook_fileリソース)
“cookbook_file”リソースは、ファイルの状態を定義するリソースの1つです。
2. では、ownerやgroupを指定してファイルの状態を定義しています。ファイルの中身については、クックブックの“files”ディレクトリに意図している内容のファイルを格納しておき、クックブックの“source”属性で配置したファイルを指定します。
3. HTMLファイルを配布するディレクトリの作成(directoryリソース)
“directory”リソースは、ディレクトリの状態を定義するリソースです。
3. では、ディレクトリの状態を定義しています。“directory”リソースを使用すれば、ディレクトリが作成された状態の他、削除された状態の定義も行えます。
4. HTMLファイルの配布
4. は、2. と同様です。
5. httpdサービスの起動(serviceリソース)
“service”リソースは、サービスの状態を定義するリソースです。
5. では、Webサーバのサービスである“httpd”サービスが起動した状態を定義しています。
リソースは、順序立てて定義する必要があります。例えば、1. と5. の順序を逆にした場合、Apacheパッケージがインストールされていない状態でサービスの起動を試みてエラーになります。
パッケージ・ファイルの削除を行う場合は、“削除された状態”を定義しchef-soloを実行する必要があります。レシピの定義部分を削除しただけで実環境のパッケージやファイルが削除されることはありませんので注意が必要です。
最後に、作成したapacheレシピをランリストに設定します。/home/user01/node.jsonファイルを以下の様に設定します。
node.json
{ "run_list": [ "recipe[apache]" ] }