オープンソースなシステム自動管理ツール 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

次回はプロバイダのコードについて解説予定です。

参考リンク
URLCreating Custom Types

おすすめ記事

記事・ニュース一覧