如何创建一个配方,以通用方式使用来自对象实例的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,以“通知”的方式仍在工作?
答案 0 :(得分:2)
定义是跨配方重复使用的代码,类似于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
中提供了更完整的定义示例