我是Chef的新手,虽然我现在理解这个概念。我理解默认与覆盖属性的概念,但我如何在环境中执行此操作?特别是,我想覆盖其他人定义的数据包属性。例如,如果我们有以下数据包
{
"id" : "common",
"some_server" : "www.some_server.com"
}
我希望我的“环境”中的所有食谱都用“www.my_server.com”覆盖“some_server”这有意义吗?谢谢!
答案 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