【问题标题】:How to do an "unless" conditional when changing permissions in a ruby_block in chef?在厨师的 ruby​​_block 中更改权限时如何执行“除非”条件?
【发布时间】:2020-08-25 09:53:48
【问题描述】:

在 chef 我有一个 ruby_block 我正在更改目录的权限和所有权。如果“FileUtils.chown”语句尚未更改权限,我如何才能检查仅更改权限的位置?如果可能的话,我需要在 ruby​​_block 中执行此操作,因为我想在 ruby​​ 块中有其他代码。我的“除非”陈述是什么?这是我的代码:

  ruby_block 'exe' do
    block do
      FileUtils.chmod 0755, '/make/news'
      FileUtils.chown('root', 'root', '/make/news')
    end
  end

【问题讨论】:

  • 如果使用得当,Chef的文件和目录资源已经是幂等的了。使用它们并为自己省点麻烦!
  • 在这里同意@ToddA.Jacobs。喜欢使用 Chef 资源,只要有一个满足您的要求。添加“脚本”逻辑会使食谱复杂化。您可能想用“在 ruby​​ 块中有其他代码”来更新您的问题。这将有助于了解您对ruby_block 的要求。

标签: ruby chef-infra


【解决方案1】:

正确的做法是使用 Chef 的文件资源:

file '/make/news' do
  mode 0755
  owner 'root'
  group 'root'
end

您正在尝试重写文件资源,这不是一个好主意。

【讨论】:

    【解决方案2】:

    使用 Chef 资源的 not_if Guard

    Chef 资源有许多共同的功能。 ruby_block 资源支持 not_if 属性作为 conditional guard。一般格式为:

    ruby_block 'custom chmod' do
      block do
        #
      end
    
      not_if { true }
    end
    

    所以,您可以以这种方式编写您的逻辑,但它最终会对您造成严重影响。如果您使用 filedirectory 资源以声明方式使用单独的块来管理权限,然后(如有必要)将其与来自需要给定权限集的其他块的通知链接,Chef 通常会更好地工作。例如:

    directory '/make/news' do
      mode  '0755'
      owner 'root'
      group 'root'
      action :nothing
    end
    
    ruby_block 'do something with news' do
      block do
        #
      end
    
      only_if { true }
      notifies :create, 'directory[/make/news]', :before
    end
    

    也就是说,配置管理的目标是不断收敛,所以我强烈质疑在资源块之间创建这种相互依赖关系是否真的有必要首先。如果可能,只需每次收敛您的目录权限以强制执行它们。虽然这可能会在您的配方中创建顺序依赖关系,但从长远来看,更具声明性的方法通常会简化说明书和配方调试。您的个人里程可能会有所不同。

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 2015-11-02
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多