【问题标题】:Chef create directories recursively with owner厨师与所有者递归创建目录
【发布时间】:2018-01-17 07:52:26
【问题描述】:

我需要创建一个所有者为“testuser”的目录树。 但如果我指定“/foo/bar/baz”,则只有在“testuser”、“/foo”和“/foo/bar”下创建的“baz”属于“root”用户。

directory /foo/bar/baz do
  owner 'testuser'
  group 'testuser'
  recursive true
  action :create
  mode '0755'
end

基于此文档https://docs.chef.io/resource_directory.html 我们可以使用以下结构,直到我尝试将变量用作目录为止。

%w[ /foo /foo/bar /foo/bar/baz ].each do |path|
  directory path do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end

如果我在这个列表中指定变量,我会得到名称为“#{node[‘foo’]}”的目录等等。

%w[ #{node[‘foo’]} #{node[‘bar’]} #{node[‘baz’]} ].each do |path|
  directory path do
    owner 'testuser'
    group 'testuser'
    mode '0755'
  end
end

如何创建将被扩展的目录变量列表?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    避免字符串插值

    您自己的解决方案依赖于不同项目的字符串插值,稍后您再次将其拆分为各个部分。

    您可以避免这种情况,例如通过以下方式,虽然我不完全了解,这些属性来自哪里:

    [node['foo'], node['bar'], node['baz']].each do |path|
      directory path do
        owner 'testuser'
        group 'testuser'
       mode '0755'
      end
    end
    

    避免声明完整路径

    创建资源的更简单方法是递归地为完整路径 foo/baz/bar 创建 directory 资源,您可以使用以下代码,它将路径拆分为多个部分,而无需以您的问题的方式声明完整路径(%w{foo foo/bar foo/bar/baz}):

    dir = "foo/bar/baz"
    [].tap{|x| Pathname(dir).each_filename{|d| x << (x.empty? ? [d] : x.last + [d])}}.each do |dir|
      directory File.join(dir) do
        owner 'testuser'
        group 'testuser'
        mode '0755'
      end
    end
    

    在 Ruby 中可能存在更优雅、更短的方法。

    【讨论】:

      【解决方案2】:

      如果属性中有默认值,例如:

      default["foo"]["logpath"] = "/var/log/apps"
      

      然后在配方中定义为创建目录:

      directory node["foo"]["logpath"] do
        owner 'testuser'
        group 'testuser'
        recursive true
        mode '0755'
      end
      

      【讨论】:

        【解决方案3】:

        自己找到了答案。 如果要插入变量,请使用 %W 而不是 %w

        【讨论】:

        • 这里没有插值的理由。你是红宝石,所以@StephenKing 的答案是正确的。
        【解决方案4】:

        您不需要字符串插值。您只是在使用纯红宝石。

        path = ''
        path_ary = %w(foo bar baz) # or [node['foo'], node['bar'], node['baz'])
        path_ary.each |path_element|
          path += "/#{path_element}"
          directory File.join(path) do
            owner 'testuser'
            group 'testuser'
            mode '0755'
          end
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-17
          • 2012-10-03
          • 1970-01-01
          • 2011-10-10
          • 1970-01-01
          相关资源
          最近更新 更多