7

directory_listという名前の ruby​​_block に定義して設定する1 つの変数があるとしますget_directory_listdirectory_listレシピで後で使用できますか、それともコンパイル/収束プロセスでこれを防ぐことができますか?

例:

ruby_block "get_file_list" do
    block do
        transferred_files = Dir['/some/dir/*']
    end
end

transferred_files.each do |file|
    file "#{file}" do
        group "woohoo"
        user "woohoo"
    end
end
4

1 に答える 1

14

オプション 1: ファイル リソースを ruby​​_block 内に配置することもできます。

ruby_block "get_file_list" do
    block do
        files = Dir['/some/dir/*']

        files.each do |f|
            t = Chef::Resource::File.new(f)
            t.owner("woohoo")
            t.group("woohoo")
            t.mode("0600")
            t.action(:create)
            t.run_context=(rc)
            t.run_action(:create)
        end

    end
end

オプション 2: node.run_state を使用してデータを渡すことができます。

ruby_block "get_file_list" do
    block do
        node.run_state['transferred_files'] = Dir['/some/dir/*']
    end
end

node.run_state['transferred_files'].each do |file|
    file "#{file}" do
        group "woohoo"
        user "woohoo"
    end
end

オプション 3: これが 1 つのファイルである場合は、ファイル リソースを で宣言しaction :nothing、ruby_block 内からリソースを検索してファイル名を設定し、ruby_block が実行されたときにファイル リソースに通知することができます。

オプション 4: これが今日の IRC の例である場合、rsync と再帰的な chown を単一の bash リソース内に配置するだけです。rsync と chown はすでに冪等であるため、この特定のケースでは好ましくないと思います。

于 2015-10-07T01:47:11.470 に答える