Chef属性值

时间:2016-01-07 04:25:56

标签: chef chef-recipe chef-solo

我正在使用食谱来编辑文件。如果我想编辑文件,我在配方中使用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。属性或配方从该文件中选择值并替换它。这样我就可以随时更改文件中的值,并且配方和属性不会发生变化。或任何其他想法。

感谢您的帮助!

2 个答案:

答案 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

请注意,如果每个人都读取相同的数据包,那么这些值对于每个服务器都是相同的。