假设我有一个变量directory_list,我在一个名为get_directory_list的ruby_block中定义和设置了该变量。我可以稍后在我的配方中使用 directory_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

最佳答案

选项 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:如果这只是一个文件,你可以用 action :nothing 声明一个文件资源,从 ruby​​_block 中查找资源,并设置文件名,然后在 ruby​​_block 运行时通知文件资源。

选项4:如果这是今天IRC的示例,只需将rsync和递归chown放在单个bash资源中。 rsync和chown已经是幂等的,因此在这种特殊情况下,我认为它并不令人反感。

关于ruby - 厨师 : Can a variable set within one ruby_block be used later in a recipe?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32979974/

10-13 08:43