支持定义中的多个通知

时间:2015-06-09 14:24:12

标签: chef

这是来自Configure providers from variables, in a generic way

的后续问题

我将一些提供程序包装到定义中,我想知道如何处理通知。我成功地编写了一个廉价的实现,我可以传递一个数组数组,类似于:

provider_definition name do
    component $some_component
    notifies [[:redeploy, "docker_container[some_container]", :immediately],
              [:redeploy, "docker_container[some_other_cntr]", :delayed]]
end

然后在我的定义中,我有类似的东西:

params[:notifies].each do |notify_action, resource_name, notify_time|
    notifies notify_action, resource_name, notify_time
end

当然有更好的方法吗?我希望我能在配方中保持相同的格式:

provider_definition name do
    component $some_component
    notifies :redeploy, "docker_container[some_container]", :immediately
    notifies :redeploy, "docker_container[some_other_cntr]", :delayed
end

但是当我这样做时,只有最后一次通知才符合我的定义。

1 个答案:

答案 0 :(得分:1)

坚持定义,你已经有了更好的方式。

实现您希望将您的定义转换为LWRP的选项,这将创建一个自定义资源,可以将通知属性作为任何其他主厨资源。

docker_library /资源/ my_deploy.rb

action :deploy
default_action :deploy

attribute :component, kind_of: Hash, required: true

docker_library /提供者/ my_deploy.rb

action :deploy do
  params = new_resource.component
  docker_image params['name'] do
    registry params['registry']
    tag params['tag']
    action :pull
  end
end

我可能对组件的类型有误,我让你适应你的具体情况。从内存中写的,我可能忘记了一些内容,LWRP上有更多文档here

与之前的配方相同,只是LWRP名称将来自cookbook名称和文件名,所以在这种情况下:

my_component = $auth_docker
docker_library_my_deploy my_component.name do 
  component my_component
  notifies :redeploy, "docker_container[some_container]", :immediately
  notifies :redeploy, "docker_container[some_other_cntr]", :delayed
end