Chef レシピの書き方


全開でChefで運用する環境が整いましたので
実際にレシピを作成してみましょう
>> Chef-Serverの構築

やっとChefを触れます
いろいろな単語や機能ができてきますが

やっていることはスクリプトでサーバに設定を適応するのと同じです。
Rubyコーディングができなくても、簡単なライブラリや構文の利用だけでも十分
Rubyコーディングを利用しなくても十分できます。

ではレッツクッキング!
の前に、せっかくサーバがあり、機能を視覚的にわかるので
どのような調理器具があるか確認しながら行きましょう。

Chefリポジトリの作成


Chefでレシピを作成するに当たり、「リポジトリ」というディレクトリ構成を作成します
リポジトリのディレクトリ構成をOpscodeがGitHubに公開しているので
それを利用しましょう。
# git clone https://github.com/opscode/chef-repo.git
リポジトリを作成後、レシピを作成していくわけですが
ChefServerをインストールした後に見てみると
ChefCerverの各項目がそのままリポジトリのディレクトリ構成になっていますね

リポジトリのディレクトリ構成イメージになります。


このリポジトリの中に「クックブック」というレシピの集合体を作ります。

CookBookの作成


クックブックはChefの環境設定ファイルに定義された場所に作成されます
たとえば、ChefSoloの場合
# vi /etc/chef/solo.rb
cookbook_path "/chef/chef-repo/cookbooks"
CookBookの作成
# knife cookbook create <クックブック名>
クックブックを作成すると、下記のようなディレクトリ群がCookBook内に作成されます

CHANGELOG.mdCookBookの変更内容を記録する
README.mdCookBookの概要を記述
attributesCookBookで利用する変数Attributeを格納するディレクトリ
definitionsDefinitionというファンクションを格納するディレクトリ
filesCookBookで利用するファイルを配置するディレクトリ
librariesChefを拡張させるためのRubyコードを格納するディレクトリ
metadata.rbCookBookのメタデータ、バージョン情報を記録する
providersプロバイダーを定義するファイルを格納するディレクトリ
recipesレシピを格納するディレクトリ
resourcesリソースを定義するファイルを格納するディレクトリ
templatesレシピで使用する設定ファイルを格納するディレクトリ

各機能に触れながら、レシピを実行していきましょう

レシピの作成・テクニック


■レシピの作成
レシピはRubyで記述する以外にリソースというDSLを利用し記述します。
<リソースタイプ> <リソース名> do
 <属性> <値>
 :
 :
 action <リソースに対し実行するアクション>
end
たとえば、Apacheをインストールする場合
# vim cookbooks/apache/recipes/default.rb
yum_package "httpd" do
 action :install
end

■変数の利用
レシピ内で変数を利用したい場合、attributeを使用します。
変数はattributesディレクトリ配下に格納します。

変数の定義
# vim cookbooks/apache/attributes/default.rb
default['yum']['package'] = "httpd"
レシピから変数を呼び出し
# vim cookbooks/apache/recipes/default.rb
yum_package "#{node['yum']['package']}" do
 action :install
end
変数を定義する場合、名前空間の階層を増やす事でグルーピングのような事ができる
この空間はChefServer側で見たとき、設定値として見ることができます。

また、Chefはデフォルトでいくつかの変数を持っています
ChefSeverにクライアントを登録すると、最初いくつか登録されているのが確認できます。
このデフォルトの変数を上書きしてしまわないよう
変数を利用する場合、名前空間の命名規則には注意しましょう。

デフォルトの設定値はコマンドでも確認できます
# ohai

■definitionsの利用
リソースの処理をサンクションのように、関数化できます
# vim cookbooks/apache/definitions/httpd_install.rb
define :httpd_install do
 yum_package "#{node['yum']['package']}" do
  action :install
 end
end
レシピからの呼び出し
# vim cookbooks/apache/recipes/default.rb
httpd_install
定義したdefinitionはほかのCookBookからも参照できます。

■ファイルの配布
スクリプトファイルやソースファイル等をレシピ実行環境に配布できる。

たとえば、何らかのスクリプトファイルを配布したいとき
配布したいスクリプトを配置
# ls cookbooks/scripts/files/default/logrotate.sh
レシピから呼び出し
# vim cookbooks/scripts/recipes/default.rb
cookbook_file "logrotate.sh" do
 action :create
 path /opt/scripts/logrotate.sh
 mode "0755"
end

■librariesの利用
レシピやattribute、自作リソースで利用できるクラスやメソッドを定義できる
Rubyがわからないので後で。

■providersの利用
自作のリソース処理等で利用できるプロバイダを定義できる
Rubyがわからないので後で。

■resourcesの利用
自作のリソースを定義できる
Rubyがわからないので後で。

■templateの利用
レシピで使用する設定ファイルを配置する
filesと違い、ruby処理により動的にファイルの内容を変更・記述できる。

テンプレートファイルの配置
# vim cookbooks/host/template/default/hosts.erb
127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
<%= node['network']['ipaddress'] %>  <%= node['network']['host_name'] %>
::1        localhost localhost.localdomain localhots6 localhost6.localdomain6
attributeとの連携
# vim cookbooks/host/attributes/default.rb
default['network']['ipaddress'] = "192.168.1.10"
default['network']['host_name'] = "hogehoge"
レシピからの呼び出し
# vim cookbooks/host/recipes/default.rb
template "hosts" do
 action :create
 path "/etc/hosts"
 mode "0644"
 backup 5
end

レシピの管理


作成したCookBookをChefServerにアップロードしましょう
# knife cookbook upload <クックブック名>
アップロードされたCookBookはChefServerでバージョン管理のような事も可能です
Chefの管理推奨はGitHubらしいですが

バージョンを変えたい場合metadata.rbを編集します
# vim cookbooks/apache/metadata.rb
version       '0.1.1'

CookBookの構文テスト


作成したレシピ、CookBookのテストは下記のような方法があります

CookBook全体の構文チェック
# knife cookbook test <クックブック名>
レシピ単体の動作確認例
# chef-solo -W -o <クックブック名>::<レシピ名>
「-W」オプションで、「DRY RUN」のような動作確認を行うことができます。


レシピ記述の基本は以上ですね
レシピも書ける!ChefServerとの連携もできる!
次は一歩進んで、ランリストの作成、環境変数の利用を行ってみましょう!


0 コメント:

コメントを投稿