独自のResourceを定義する
Chefでは、Light Weight Resources and Providors(LWRP)を使うことで、独自のResourceが定義できます。LWRPは軽量なフレームワークであり、導入も簡単です。
LWRPの構成要素
LWRPは、ResourceとProviderの2つのコンポーネントで構成されています。下記で詳しく説明します。
Resource
Resourceはその名のとおり、Recipe内で使用するResourceの定義が可能です。Resourceは3種類のDSLを用いて実装します。
DSL名 | 説明 |
---|---|
actions |
Resourceで使用可能なactionを定義します。 定義されたactionはrecipe内で指定することができます。 先頭で示したfile Resourceの例では action :create 部分が該当します。 |
default_action | recipe内でactionが指定されなかった場合に実行するデフォルトのactionを指定できます。 |
attribute |
recipeで指定することができる独自のパラメータを定義できます。 先頭で示したfile Resourceの例では owner, group, modeがattributeに該当します。 |
Provider
Providerでは、Resourceで定義したactionの処理内容をRubyのメソッドのように実装していきます。例えば、先頭で示したfile Resourceではcreateのactionが呼び出された際に、指定されたパスに実際のファイルを作成する処理の内容がProviderに定義されます。
rbenv用のResourceを定義する
ここからLWRPを使って、rbenvのCookbook内に独自のResourceを定義します。以下のような内容でResourceを定義していきます。
-
対象OSはCentOS/RHELとUbuntu/Debianとします
- rbenvのインストールコマンド自体はCentOS/RHELとUbuntu/Debianは同一ですが、パッケージインストールをプラットフォームごとに分割する必要があります
- Resourceは「rbenv_settings」としてRecipeから呼び出せるようにします
- 定義するactionは前項目で定義したRecipeと同じくinstall_rbenv,install_rubyの2つとします
- install_rubyではインストールするRubyのバージョンを必須パラメータとします
これらを踏まえ、最終的に作成されるディレクトリ構成は下記のようになります。
├── attributes ├── definitions ├── files │ └── default ├── libraries ├── metadata.rb ├── providers │ └── settings.rb ・・・ 今回新規に作成するProvider ├── recipes │ └── default.rb ・・・ 動作確認のためのRecipe ├── resources │ └── settings.rb ・・・ 今回新規に作成するResource └── templates └── default
Resource定義
上記に示した条件でResourceを定義します。
actions :install_rbenv, :install_ruby default_action :install_rbenv attribute :version, :required => true, :kind_of => String attribute :install_dir, :default => '/opt', :kind_of => String
1行目にはこのResourceで使用可能なactionの一覧を定義しています。
2行目にはRecipe内でaction指定がない場合にinstall_rbenvを実行するようにデフォルトactionを定義しています。
3行目にはrbenvを使ってインストールするRubyのversionをString型で必須なパラメータとして定義しています。必須パラメータは、Provider内のactionブロックで定義を使っている場合にチェックされます。
4行目にはrbenvをインストールするディレクトリを定義しています。実行時にinstall_dirを指定しなかった場合は、/optにrbenvをインストールするようにデフォルト値を定義しています。
今回作成するサンプルのResourceはこれだけで定義できます。attributeでは、その他にもパラメータを使うことが可能です。その他使用可能なパラメータの詳細については、Chefの公式ドキュメントを参照してください。