1

我正在使用一本食谱 github.com opscode-cookbooks/openldap。我写了一个包装食谱“lab_openldap”,其中包括“openldap::server”配方。

server.rb 配方使用以下子句将 PEM 文件从说明书文件/ssl/*.pem 上传到服务器到位置节点 ['openldap']['ssl_cert']。

if node['openldap']['tls_enabled'] && node['openldap']['manage_ssl']
  cookbook_file node['openldap']['ssl_cert'] do
    source "ssl/#{node['openldap']['server']}.pem"
    mode 00644
    owner "root"
    group "root"
  end
end

尝试从“openldap”说明书文件/ssl/#{node['openldap']['server']}.pem”位置读取 PEM。

我的 PEM 文件位于包装器“lab_openldap”说明书文件/ssl/#{node['openldap']['server']}.pem" 位置。

是否可以修改“lab_openldap::server.rb”配方以从包装食谱加载 PEM?

注意:我知道https://github.com/bryanwb/chef-rewind但它似乎无法处理这种情况。

更新

提供的答案使用r.resource是正确的。

实际上,特定代码中的问题在于“source”关键字,根据http://docs.opscode.com/resource_cookbook_file.html指的是位于 chef-repo 的食谱中 /files 目录中文件的位置.

r = resources("cookbook_file[#{node['openldap']['ssl_cert']}]")
r.cookbook('lab_openldap')

cookbook_file node['openldap']['ssl_cert'] do
    source "ssl/#{node['openldap']['server']}.pem"
    mode 00644
    owner "root"
    group "root"
end
4

2 回答 2

2

您现在可以直接在 chef 中执行此操作:

include_recipe "openldap::server" 

edit_resource(:cookbook_file, node['openldap']['ssl_cert']) do
  cookbook cookbook_name
end

请注意,为避免需要使用这种情况,应将 openldap 之类的库食谱编写为自定义资源,而不是食谱。然后,他们应该使用此答案中的模式导出允许其模板被覆盖的属性:

https://stackoverflow.com/a/63570830/506908

于 2020-08-25T03:09:23.120 回答
1

当然是!您只需要cookbook在包装资源时设置资源的属性。默认情况下,它是“当前食谱”,但您可以更改它:

r = resources("cookbook_file[#{node['openldap']['ssl_cert']}]")
r.cookbook('my_wrapper_cookbook')

如果你看一下 Bryan 的 Chef Rewind,你会发现它做同样的事情

于 2014-01-10T14:54:53.253 回答