【问题标题】:Chef guard multiple resources with single not_ifChef 使用单个 not_if 保护多个资源
【发布时间】:2016-02-21 07:29:37
【问题描述】:

使用 chef 时,我只想在满足某个条件时执行一系列资源。目前,我必须为每个资源单独添加 not_if 保护。有没有办法用一个 not_if 保护来包装多个资源,如下所示:

wrap_resources do
  service 'my-service'
  package 'my-package'
  not_if certain_condition
end

而且我不想使用那个讨厌的通知!

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    编译时条件的简单解决方案:

    if !certain_condition
      service 'my-service'
      package 'my-package'
    end
    

    配方允许使用纯 ruby​​,您可以使用简单的 if 块跳过在配方中定义这些资源。


    根据您的示例,您正在寻找 LWRP 或厨师 12.5 custom_resource

    语法几乎相同,LWRP 使用两个文件(资源和提供者),而 custom_resource 只使用一个。

    这背后的想法是创建一个新资源,该资源将在收敛时进行一些测试,然后在需要时运行它的内部资源。 LWRP/custom_resource 内部资源在单独的上下文中运行。

    即:

    my_cookbook/resources/wrapper.rb

    property :name, RubyType, default: 'value'
    
    default_action: run
    
    action :run do
      service 'my-service'
      package 'my-package'
    end
    

    my_cookbook/recipes/default.rb

    my_cookbook_wrapper 'service and package' do
      not_if lazy { certain_condition }
    end
    

    请注意,如果您在食谱名称中使用 -,则 Ruby 类不允许使用此字符,如果找到,则替换为 _

    【讨论】:

    • 如果我需要延迟计算条件,这也可以吗?
    • 否,因为它将在配方编译时进行评估。如果您需要包装多个资源而只使用一个守卫,请使用 LWRP 或新的 custom_resource 方式来编写它们。更新答案
    • 另一种方法是重新考虑您的 not_if,这样它就不必变得懒惰,因此您可以使用更简单的编译时定义。您希望它们变得懒惰的事实是您要依赖首先运行的其他资源,但是这些资源还取决于它们何时运行的条件。如果你向后走,你应该能够到达一个你可以在编译时评估的条件。
    • 通过通知来构建它也可能更容易,这样之前的资源触发就会导致动作发生。
    • lamont 我想你忘了 ping @adracus ;)
    【解决方案2】:

    您还可以执行以下操作:

    unless certain_condition
      service 'my-service'
      package 'my-package'
    end
    

    这样您就不需要使用否定陈述。让它更干净一点!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      相关资源
      最近更新 更多