2015-06-08 57 views
1

如何创建一个使用通用方式中的对象实例的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 

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

这是可能的使用厨师,在'通知'的方式仍然工作?

+1

具有可你考虑过使用'BasicObject#instance_eval'? [#instance_eval](http://ruby-doc.org/core-1.9.3/BasicObject.html#method-i-instance_eval) – floum

+0

嗯,不,我的Ruby语言知识和经验非常非常薄,而且这更复杂,因为Chef不提供完全纯粹的Ruby上下文......即使在阅读粘贴的文档后,我也不确定我将如何使用这种方法来对付LWRP。任何指针? – Joe

回答

2

引述Documentation

的定义是跨食谱重用代码,类似于 编译时宏。通过使用任意代码 创建一个定义,通过将内部厨师客户端资源(文件,执行,模板, 等)声明为定义,就好像它们在配方中声明了 一样。然后在一个(或多个)食谱中使用定义,就好像它是资源一样。

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

不是资源或轻量级资源是从一本食谱的 /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 

在你的食谱(需要有一个依赖于docker_library菜谱中metadata.rb):

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

定义的更完整为例处于logrotate cookbook

+0

@Joe我在资源调用上犯了一个错字。更新答案 – Tensibai

+0

谢谢,这肯定是要走的路,虽然参数在params []散列中,不能直接访问 - 我编辑了答案以反映这一点。 – Joe

+0

@Joe编辑合并,谢谢修正。 – Tensibai

相关问题