如何在食谱

时间:2017-02-16 22:51:57

标签: chef chef-recipe

我有一个配方循环遍历属性中定义的一堆数据:

node["repos"].each do |repo, data|
  ...do stuff...
end

...do stuff...部分相当长,我想在多个配方中重复使用它,唯一的区别是属性中的数据集不同。

我尝试将循环内部移动到另一个配方并包括它:

node["repos"].each do |repo, data|
   include_recipe "other_recipe"
end

但是当它试图运行other_recipe时,data变量不存在。

什么是"适当的"在食谱之间共享代码的方式?

2 个答案:

答案 0 :(得分:3)

最简单的方法是将此do stuff移至库。

my_cookbook /库/ myhelper.rb:

module Myhelper
  def do_stuff( repo, data )
    [...you can use all kinds of resources here as in recipe...]
  end
end

然后你可以在这样的食谱中使用这个模块:

another_cookbook /食谱/ some_recipe.rb:

extend Myhelper
do_stuff( node[:attribute1], node[:attribute2] )

只需确保在元数据中添加对my_cookbook的依赖:

another_cookbook / metadata.rb:

depends 'my_cookbook'

答案 1 :(得分:1)

不幸的是,这不起作用,因为include_recipe两者都不允许传递参数,并且已经去掉了#34;意味着它只对给定的食谱运行一次。

这些天最简单的选择就是制作自定义资源。其他选项包括定义和辅助方法,但我会从自定义资源开始,然后从那里开始。东西块的输入(在这种情况下为repodata)成为资源属性,配方代码块进入资源的动作方法。