以通用方式从变量配置提供程序

时间:2015-06-08 13:30:29

标签: ruby chef aws-opsworks

如何创建一个配方,以通用方式使用来自对象实例的fiels填充其属性?

例如,请考虑以下方法:

component = $auth_docker
docker_image component.name do
    registry component.registry
    tag component.tag
    action :pull
end

当你有50个看起来像这样的食谱时,保持它们真的很难。

在Python中,我可能会实现一个看起来有点像这样的解决方案:

docker_image = DockerImage(**$auth_docker)

或者,我会创建一些辅助函数来为我构建它:

def generate_docker_image_lwrp(attributes):
    lwrp = DockerImage()
    lwrp.registry = attributes.registry
    lwrp.tag = attributes.tag
    return lwrp

目标是减少食谱的维护。例如,今天早上我想在所有拉动图像的食谱上添加Chef的“retries”属性。我不得不编辑所有这些 - 我不希望这样。我应该能够a)将属性添加到堆栈的JSON中b)编辑Ruby包装类,以便它的实例(即:$ auth_docker)获得“重试”字段,然后c)将重试属性添加到lwrp发电机。由于所有配方都使用相同的生成器,因此根本不需要编辑配方。

这是否可以使用Chef,以“通知”的方式仍在工作?

1 个答案:

答案 0 :(得分:2)

引用Documentation

  

定义是跨配方重复使用的代码,类似于a   编译时宏。使用任意代码创建定义   包含内置的chef-client资源 - 文件,执行,模板,   等等 - 通过将这些资源声明为定义,就好像它们一样   在食谱中宣布。然后在一个(或多个)中使用定义   食谱好像是一种资源。

     

虽然定义的行为类似于资源,但一些关键差异   存在。定义:

     

不是资源或轻量级资源是从内部定义的   / definitions目录的菜谱在资源之前加载   厨师 - 客户经营;这确保了所有人都可以使用该定义   可能需要它的资源可能无法通知资源   资源集合,因为在资源之前加载了定义   集合本身已创建;但是,定义中的资源可以   自动通知同一定义中存在的资源   支持为什么运行模式,与轻量级资源不同使用定义   当重复模式存在于资源和/或简单时,   需要直接的方法。数量没有限制   可能包含在定义中的资源:使用尽可能多的内置资源   必要的厨师 - 客户资源。

即:您可以在专门为此使用的库食谱中为此创建一个定义。

docker_library / defintions / default.rb

define :my_docker_image, :component => nil do
  component = params[:component]
  docker_image component.name do
    registry component.registry
    tag component.tag
    action :pull
  end
end 
你的食谱中的

(需要有一个取决于metadata.rb中的docker_library食谱):

my_component = $auth_docker
my_docker_image my_component.name do 
  component my_component
end

logrotate cookbook

中提供了更完整的定义示例