【问题标题】:Chef attribute values厨师属性值
【发布时间】:2016-01-07 17:46:00
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: chef-infra chef-recipe chef-solo


    【解决方案1】:

    您不愿意更新您的食谱属性文件并升级食谱版本,因此您正在走向一个糟糕的模式(以及中长期的问题)。

    您正在失去对食谱进行版本控制的价值以及在某个地方出现问题时恢复的能力。

    此外,强烈建议不要编辑文件,而是更喜欢使用模板资源管理整个文件。

    【讨论】:

      【解决方案2】:

      我不确定我是否正确理解了您的用例,但您似乎可以为此使用 Data Bags

      例如,您可以创建如下数据包(installation.json):

      {
        'id': 'installation',
        'home': '/installpath',
        'log_home': 'whatever'
      }
      

      然后将其上传到 Chef Server:

      $ 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
      

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

      【讨论】:

      • 为什么要从数据包值创建节点属性?直接在需要的地方使用数据包值。
      • 当然,不再需要属性了。固定的。无论如何,我不确定这是否能回答问题。
      • 在我看来,编辑文件是一种糟糕的模式,应该对其进行完全管理。数据包方法是正确的,使用角色也可以是一种解决方案。
      • 是的,这是一种反模式,我们必须尽可能避免它。完全同意你的看法。
      • 感谢您的回答。之前我们使用模板资源来编辑文件和管理整个文件。但现在的要求是编辑文件并替换几个值。我可以在属性中给出输入值,每当我们有新值时,我都可以编辑属性中的输入值。但不是编辑属性或数据包,我可以有一个与食谱无关的外部文件,我可以在其中提及此文件中的所有值,并且配方或属性或数据包引用此文件中的值。我可以多次更改此文件,并将保留在单独的位置。