【问题标题】:Chef: Can a variable set within one ruby_block be used later in a recipe?厨师:一个 ruby​​_block 中的变量集可以稍后在食谱中使用吗?
【发布时间】:2015-10-07 19:16:40
【问题描述】:

假设我有一个变量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

【问题讨论】:

  • 我觉得今天有人在#chef的Freenode上反复问过这个问题。
  • 这当然是可能的。听起来有人真的想要一个答案。
  • 哈哈哈。 @grill 不错。

标签: ruby chef-infra devops


【解决方案1】:

选项 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 已经是幂等的,所以我认为在这种特殊情况下它并不令人反感。

【讨论】:

  • 有趣。我什至不知道这些选项是可能的。感谢您的帮助。
猜你喜欢
  • 2015-11-02
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
相关资源
最近更新 更多