替换包装器手册中的模板

时间:2013-04-10 18:05:22

标签: chef

我正在尝试为chef graphite repo

编写包装食谱

在配方carbon.rb中,出现以下行:

template "#{node['graphite']['base_dir']}/conf/storage-schemas.conf" do
  owner node['apache']['user']
  group node['apache']['group']
end

在templates / default / storage-schemas.conf中有一个不受我喜欢的storage-schemas.conf文件。我可以内联编辑文件并实现我想要的,但如果我希望能够在不发生合并冲突的情况下保持我的仓库更新,它似乎不是一个好厨师的做法。所以我想知道我是否可以用包装食谱来解决这个问题。

我的第一个就像是

include_recipe "graphite"
template "#{node['graphite']['base_dir']}/conf/storage-schemas.conf" do
  owner node['apache']['user']
  group node['apache']['group']
end

我将在基本配方完成后重新运行该命令,并将我想要的文件放在wrappercookbook / templates / storage-schemas.conf.erb中。这是一种常见做法吗?它感觉不太干,但我想不出更清洁的方式。

4 个答案:

答案 0 :(得分:27)

你非常接近。假设您的包装器手册中有storage-schemas.conf.erb文件的修改版本,您可以这样做:

include_recipe "graphite"
begin
  r = resources(:template => "#{node['graphite']['base_dir']}/conf/storage-schemas.conf")
  r.cookbook "my-cookbook"
rescue Chef::Exceptions::ResourceNotFound
  Chef::Log.warn "could not find template to override!"
end

您还可以使用以下行:

r.source "graphite-stuff/my-storage-schemas.conf.erb"

如果您想以不同的方式组织包装器食谱中的文件。

答案 1 :(得分:14)

作为Dave答案的替代方案,您还可以使用chef-rewind

https://github.com/bryanwb/chef-rewind

github repo的快速使用示例

#file postgresql / recipes / server.rb

template "/var/pgsql/data/postgresql.conf" do
  source  "postgresql.conf.erb"
  owner "postgres"
end

#file my-postgresql / recipes / server.rb

chef_gem "chef-rewind"
require 'chef/rewind'

include_recipe "postgresql::server"
# my-postgresql.conf.erb located inside my-postgresql/templates/default/my-postgresql.conf.erb
rewind :template => "/var/pgsql/data/postgresql.conf" do
  source "my-postgresql.conf.erb"
  cookbook_name "my-postgresql"
end

答案 2 :(得分:1)

使用knife时,建议使用补丁并与上游合并,因为刀会自动为您执行一些git分支合并,并且您可以跟踪最初更改的内容。

简单地覆盖你的包装菜谱中的文件是我之前没有遇到过但看起来很有趣的一种做法^^缺点:你必须手动维护并将上游更改合并到修改过的模板中,这有时可能比让git做得更多给你的东西。

第三种方式:当您直接控制最终用户将使用哪些烹饪书时,依赖“烹饪书阴影”(已弃用):http://tickets.opscode.com/browse/CHEF-2308

答案 3 :(得分:0)

厨师12可以使用edit_resource

include_recipe 'communitycookbook'

edit_resource!(:template, '/etc/myapp.conf') do
  source 'other.erb'
  cookbook 'wrapper'
  variables.update(port: 8080)
end

有关此内容的更多信息,您可以在这里找到:https://coderanger.net/rewind/