厨师使用单个not_if保护多个资源

时间:2015-11-19 08:51:55

标签: ruby chef

使用厨师时,我只想在满足某个条件的情况下执行一系列资源。目前,我必须单独为每个资源添加not_if防护。有没有办法用一个not_if后卫包含多个资源,如下所示:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

即:

my_cookbook /资源/ wrapper.rb

property :name, RubyType, default: 'value'

default_action: run

action :run do
  service 'my-service'
  package 'my-package'
end

my_cookbook /食谱/ default.rb

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

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

答案 1 :(得分:0)

您还可以执行以下操作:

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

这样您就不需要使用否定语句。让它更清洁一点!