在不同配方之间重复使用模板

时间:2019-02-11 12:10:37

标签: ruby chef

我有一本厨师食谱,除了许多其他特殊内容外,还包含许多具有相同代码的食谱。

template 'stack_file' do
    local true
    source File.join(base_dir, 'stack_templates/admin.yml.erb')
    path File.join(base_dir, 'stacks/admin.yml')
    variables(context)
end

template 'settings_file' do
    sensitive true
    local true
    source File.join(base_dir, 'config_templates/settings_admin.yml.erb')
    path File.join(base_dir, 'configs/settings_admin.yml')
    variables(context)
end

是否可以通过某种方式将这段代码放在我可以用source_filedestination_filevariables调用的方法中?

2 个答案:

答案 0 :(得分:0)

我想您可以像在普通Ruby中一样编写一个模块并将其包含在配方中。

module StackFile
...the code you want to share...
end

然后您可以使用:

inlclude StackFile

Chef::Recipe.send(:include, StackFile)

或在使用*_if条件时

Chef::Resource.send(:include, StackFile)

答案 1 :(得分:0)

执行以下操作:

  1. 创建新食谱。
  2. 不要在其中创建配方,而是创建资源
  3. 您可以定义任何参数(输入,如您提到的源文件,dest文件等)
  4. 将模板添加到新食谱中。
  5. 在其他食谱中,创建对先前创建的食谱的依赖关系。这将使您能够调用在此创建的资源(请记住,当您从另一本食谱调用资源并正在创建模板时,它将尝试从当前食谱中获取模板文件,而不是从定义该资源的模板中获取模板文件。这就是为什么在创建模板时(在共享食谱的资源中)需要指定食谱名称的原因-请参见https://docs.chef.io/resource_template.html的cookbook属性
  6. 重复任意数量的食谱。