オープンソースなシステム自動管理ツール Puppet
第16回 リソースタイプの拡張(その2)
前回はリソースタイプを拡張し,カスタムリソースを適用するための全体的な流れについて解説しました。今回はカスタムリソースタイプの,タイプを定義するためのコードについて,前回のサンプルであるfilesimpleタイプを元に解説します。
filesimpleタイプの定義は,以下のようなRubyコードになっています。このコードについて順次解説していきます。
0001: module Puppet
0002: newtype(:filesimple) do
0003: @doc = "Manage a file (the simple version)."
0004:
0005: ensurable
0006:
0007: newparam(:name) do
0008: desc "The full path to the file."
0009: end
0010:
0011: newproperty(:mode) do
0012: desc "Manage the file's mode."
0013: defaultto "640"
0014: end
0015:
0016: end
0017:
0018: end
1行目では,Puppetモジュールとしてカスタムリソースタイプを定義しています。
2行目のnewtypeメソッドで,filesimpleタイプの定義を開始しています。
3行目では@docというインスタンス変数に,このカスタムリソースタイプのドキュメントを記述しています。ドキュメントはreStructuredTextで記述します。Puppet標準のリソースタイプでは,ここで記述されたドキュメントが,Puppet WikiのType Referenceの自動生成に利用されています。
5行目のensurableというヘルパメソッドを実行することによって,リソース宣言でensureパラメータが利用できるようになります。ensureパラメータは値によって,プロバイダで定義されたcreate,destroy,exists?の3つのメソッドを呼び出します。たとえば,リソース宣言でensure => present と指定されていれば,存在確認のためにexists?メソッドが呼ばれ,存在しなければcreateメソッドが呼ばれます。
7行目のnewparamメソッドでは,filesimpleタイプで利用するnameパラメータを定義しています。nameパラメータはnamevarとして扱われます。(namevarについては第3回 マニフェストはじめの一歩をご参照ください。)
namevarをnameパラメータ以外にしたい場合には,以下のように記述します。
newparam(:path, :namevar => true) do
...
end
パラメータの値を決まったものの中から指定できるようにしたい場合には,以下のように記述します。
newparam(:color) do
newvalues(:red, :green, :blue, :purple)
end
正規表現も指定できます。
newparam(:color) do
newvalues(:blue, :red, /.+/)
end
この場合,blue,redはシンボルとして扱われますが,それ以外は文字列として扱われます。
値のバリデーションも可能です。以下のコード例では,colorパラメータの値にgreenが指定された場合,ArgumentErrorをraiseします。
newparam(:color) do
desc "Your color, and stuff."
newvalues(:blue, :red, /.+/)
validate do |value|
if value == "green"
raise ArgumentError,
"Everyone knows green databases don't have enough RAM"
else
super
end
end
end
ここで定義されたvalidateメソッドは,デフォルトのvaldateメソッドを継承してオーバーライドしています。そのため,デフォルトのvalidateメソッドも実行するために,superを呼び出しています。
値を変換することもできます。以下のコード例では,colorパラメータの値に,mauveかvioletが指定された場合は,purpleに変換します。
newparam(:color) do
desc "Your color, and stuff."
newvalues(:blue, :red, /.+/)
munge do |value|
case value
when :mauve, :violet # are these colors really any different?
:purple
else
super
end
end
end
mungeメソッドもvalidateメソッドと同様,superを呼び出してデフォルト定義されたmungeメソッドを実行しています。
8行目のdescではnameパラメータの説明を記述しています。これは@docと同様に,Type Referenceの自動生成に利用されています。
11行目のnewpropertyでは,modeプロパティを定義しています。プロパティはパラメータとは異なり,プロバイダで定義されたメソッドが呼び出されます。
例えばmodeプロパティであれば,リソース宣言でmode => 644と指定されると,プロバイダ中のmodeメソッドが呼び出され,ファイルのモードが設定される,という動作をします。
13行目のdefaulttoでは,modeプロパティが指定されない場合のデフォルト値が640であると定義しています。
プロパティで指定される値のバリデーションを行うこともできます。以下のコード例では,enableプロパティの値をtrueまたはfalseに制限しています。
newproperty(:enable) do
newvalue(:true)
newvalue(:false)
end
正規表現でバリデーションすることもできます。
newproperty(:owner) do
validate do |value|
unless value =~ /^\w+/
raise ArgumentError, "%s is not a valid user name" % value
end
end
end
次回はプロバイダのコードについて解説予定です。
- 参考リンク
- URL:Creating Custom Types

