从变量配置提供,在一个通用的方法(Configure providers from variable

2019-10-23 07:20发布

我怎样才能创建一个通用的方法使用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

我们的目标是减少对食谱的维护。 比如今天早上我想补充上拉的图像所有配方厨师“重试”的属性。 我不得不修改所有的人 - 我不希望出现这种情况。 我已经能够一)添加属性到堆栈中的JSON B)编辑Ruby的包装类,以便它(实例即:$ auth_docker)获得“重试”字段,然后c)加试归因于lwrp发电机。 由于所有的食谱会使用相同的发电机,配方不会需要在所有进行编辑。

用大厨的方式,“通知”仍然工作这可能吗?

Answer 1:

引用的文档

的定义是跨食谱重用代码,类似于一个编译时间宏。 的定义是使用缠内置厨师客户资源文件,执行模板任意代码创建的,等等,通过声明这些资源投入的定义,如果他们在配方中声明。 的定义,然后在一个(或多个)配方中使用,好像它是一个资源。

虽然定义的行为像一个资源,存在着一些关键性的差异。 一个定义:

是不是一种资源或轻的资源是从一本菜谱的目录厨师的客户端运行时资源之前加载/定义中定义; 这保证了定义是提供给所有可能需要它可能不是资源集合中通知资源,因为一个定义的资源集合本身创建之前加载的资源; 然而,在一个定义可以通知相同的定义中存在的资源的资源自动支持,为什么经营的模式,不同于轻质资源跨时资源的简单,直接的方法是期望和/或当存在重复图案的使用确定指标。 有没有限制可以包括在定义资源的数量:使用尽可能多的内置厨师客户资源是必要的。

即:你可以在仅用于本库食谱创建此定义。

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的食谱



文章来源: Configure providers from variables, in a generic way