我正在使用食谱来编辑文件。如果我想编辑文件,我在配方中使用ruby_block资源,其中值在属性中定义。以下是我的样本食谱。
ruby_block 'edit conf' do
block do
rc = Chef::Util::FileEdit.new("#{node['Installation']['file1']}")
rc.search_file_replace_line("Dir","Dir=#{node['Installation']['home']}")
rc.search_file_replace_line("max","max=#{node['Installation']['log_home']}")
rc.write_file
end
end
这将搜索并替换在属性中定义值的某些值。将来如果值被更改,那么我必须编辑属性文件中的值。有什么办法我不会触摸我的食谱或属性文件并替换值。它应该像我引用一个包含需要更改的值集的vfile。属性或配方从该文件中选择值并替换它。这样我就可以随时更改文件中的值,并且配方和属性不会发生变化。或任何其他想法。
感谢您的帮助!
答案 0 :(得分:2)
你不想更新你的食谱属性文件并碰到食谱版本,你正朝着一个糟糕的模式(以及中长期的问题)前进。
您失去了对菜谱进行版本控制的价值,以及在某处出现问题时能够还原的能力。
此外,我们非常不鼓励编辑文件,而更喜欢使用模板资源管理整个文件。
答案 1 :(得分:1)
我不确定我是否正确理解了您的用例,但看起来您可以使用Data Bags。
例如,您可以创建以下数据包(installation.json
):
{
'id': 'installation',
'home': '/installpath',
'log_home': 'whatever'
}
然后将其上传到Chef服务器:
$ knife data bag create myapp
$ knife data bag from file myapp installation.json
现在您可以从食谱中读取此信息:
conf = data_bag_item('admins', 'installation')
ruby_block 'edit conf' do
block do
rc = Chef::Util::FileEdit.new("#{node['Installation']['file1']}")
rc.search_file_replace_line("Dir","Dir=#{conf['home']}")
rc.search_file_replace_line("max","max=#{conf['log_home']}")
rc.write_file
end
end
在下文中,当您想要更改这些值时,您可以执行以下操作:
$ knife data bag edit myapp installation
请注意,如果每个人都读取相同的数据包,那么这些值对于每个服务器都是相同的。