如何覆盖Chef中的默认属性

时间:2014-08-11 19:01:56

标签: chef

我是Chef的新手,虽然我现在理解这个概念。我理解默认与覆盖属性的概念,但我如何在环境中执行此操作?特别是,我想覆盖其他人定义的数据包属性。例如,如果我们有以下数据包

{
   "id" : "common",
   "some_server" : "www.some_server.com"
}

我希望我的“环境”中的所有食谱都用“www.my_server.com”覆盖“some_server”这有意义吗?谢谢!

2 个答案:

答案 0 :(得分:1)

数据包只是一包数据 - 一组键值对。它与环境,属性和其他任何东西无关。如果您希望数据包根据环境提供不同的数据,您必须教它。

一种选择是将环境名称作为数据的一部分:

{
  "id":"common",
  "devel": {
    "some_server": ""www.some_server.com"
  },
  "staging": {
    "some_server: "www.my_server.com"
  }
}

然后你可以在食谱中读取你的数据:

data_bag[node.environment]["some_server"]

如果您有 devel 登台环境。

答案 1 :(得分:1)

我遵循了这篇文章的建议[1]   [1]:http://www.getchef.com/blog/2014/01/23/attributes-or-data-bags-what-should-i-use/, 建议将数据包用于"全球"值,即所有配方将使用的值,无论环境如何,以及编码环境中特定于环境的变量,并将我的节点设置为该环境。因此,不鼓励在数据包中使用以下内容

{
  "id":"common",
  "devel": {
    "some_server": ""www.some_server.com"
  },
  "staging": {
    "some_server: "www.my_server.com"
  }
}

相反,我会做以下

在我的setup_server食谱中说,我可能在attributes / default.rb中定义了以下属性

default.setup_server.a_server = "www.some_server.com"

......以及一个简单的食谱

puts "server " + "#{node.setup_server.a_server}"

如果我将节点分配到_default环境,输出将为:

server = www.some_server.com

我现在创建一个名为my_environment的环境,并定义以下重写属性

environments/my_environment.json:
{
  "name"  : "my_environment",
  "override_attributes" : {
    "setup_server" : {
      "a_server": "www.my_server.com"
    }
  }
}

如果我现在将我的食谱分配到" my_environment"环境,并重新运行配方,我现在得到

server = www.my_server.com