2017-09-12 3 views
0

2016の時点でOpsCodeはLWRPと代替のHWRPを推奨しています。むしろcustom resourcesを使用することをお勧めします。シェフのカスタムリソース:変更可能なプロパティまたは代替

、これは理にかなっている間、それが活用ルビーの観点から望まれるためにたくさんの葉(私が誤解していない限り?)

私はいくつかのブール値プロパティに基づいて、配列を変更できるようにしたいと思います。私はその後のように、テンプレートに渡すためにその配列を使用することができます。

property :get_iptables_info, [TrueClass, FalseClass], default: false 
property :get_pkglist, [TrueClass, FalseClass], default: false 
property :cw_logs, Array, default: [], required: false 

action :create do 

    ruby_block 'cw_iptables' do 
    block do 
     new_resource.cw_logs.push({ "#{new_resource.custom_dir}/iptables/iptables.txt" => { "log_group_name" => new_resource.log_group_name+"/iptables"}}) 
    end 
    action :run 
    only_if {new_resource.get_iptables_info} 
    end 

    template "my_template" do 
    variables ({:logstreams => cw_logs}) 
    end 

end 

その後、私のテンプレートで:

<% @logstreams.each_pair do |path, _object| %> 
["#{path}"] 
log_group_name = _object["log_group_name"] 
<% end %> 

問題は性質がimmutableであるということです。だからエラーが出る:

RuntimeError 
------------ 
ruby_block[cw_iptables] (/tmp/kitchen/cache/cookbooks/custom_cw/resources/logs.rb line 43) had an error: RuntimeError: can't modify frozen Array 

これを行う正しい方法は何ですか?リソース内でルビコードを書いてモジュール化し、methods/functionsを使用する正しい方法は何ですか?

答えて

2

カスタムリソース内でのプロパティの変更は、一般的には悪い考えです(例外はありますが、これはその1つではありません)。ローカル変数を使用する方が良いでしょう。

action :create do 
    cw_logs = new_resource.cw_logs 
    if new_resource.get_iptables_info 
    cw_logs += [whatever extra stuff you want] 
    end 

    template "my_template" do 
    variables logstreams: cw_logs 
    end 
end 

を注目すべきことではなく、オリジナルを変異させていないプッシュの+=を使用しています:あなたはカスタムリソースのアクションにすでにいるときに関連して、あなたはそのようruby_blockを使用する必要はありません。 pushを使用した場合、cw_logs = new_resource.cw_logs.dupまたはそれに類するものが必要です。

+0

私は、ドキュメント 'prefix = '/ opt/languages/node''に変数を定義することができました。 –

+0

どのようにして再利用可能な関数をリソース? –

+0

アクションブロック内で機能を使用できるようにするには、 'action_class do ... end'ヘルパーを使用します。ブロック内で定義したメソッドは、内部のアクションから使用できます。 – coderanger

関連する問題