Chef 用单个 not_if 保护多个资源

Chef guard multiple resources with single not_if

使用 chef 时,我只想在满足特定条件时执行一系列资源。目前,我必须分别向每个资源添加 not_if 守卫。有没有办法像这样用一个 not_if 守卫将多个资源包装在里面:

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

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

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

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

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


根据您的示例,您正在寻找 LWRP 或 chef 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 类 不允许使用此字符,如果找到,将替换为 _

您还可以执行以下操作:

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

这样你就不需要使用否定语句了。让它更干净一点!