如何使用角色覆盖 Chef 中的默认属性
How to override default attributes in Chef using roles
我无法让它工作,我已经用了几个小时了。这里有一个重复的问题,但从未得到充分回答。我已尝试将问题减少到最低限度。
这是我的简单食谱:"my_recipe.rb"
file "/tmp/my_target_file" do
content node.default['my_file_content']
action :create
end
...以及属性子目录中的属性文件:"my_attribute.rb"
default['my_file_content'] = 'From my_attribute.rb'
我在roles子目录下创建了一个角色:"my_role.rb"
name 'my_role'
description 'My role'
run_list 'recipe[my_cookbook::my_recipe]'
default_attributes['my_file_content'] = 'From my_role.rb'
我将食谱和角色都上传到我的 Chef 服务器,并从我的 Chef 工作站 运行 上传了一个 knife 命令:
knife bootstrap xxx.xxx.xxx.xxx -x myusername -P mysudopassword --sudo -r role[my_role] -N my_node_name
它 运行 很好,目标文件已创建,但 /tmp/my_target_file 的内容不是我所期望的。我得到
$ cat /tmp/my_target_file
From my_attribute.rb
...当然我想要的是
$ cat /tmp/my_target_file
From my_role.rb
根据 Chef 属性优先级,http://docs.chef.io/attributes.html,这应该有效。我也试过使用 'override_attributes' 但得到了相同的结果。如果我登录到我的 Chef 服务器并深入了解我的节点的属性,我可以看到属性
my_file_content: From my_role.rb
与其他 Ohai 生成的一样。
这里显然有些事情我没有说到。有人可以解释一下如何使用角色覆盖属性吗?
file "/tmp/my_target_file" do
content node.default['my_file_content']
action :create
end
node.default
是对节点对象的方法调用,旨在更新配方中 ['my_file_content']
属性的值。
不应使用它来获取值,因为您是在默认配方级别(即:从属性文件)获取值,而不是从属性优先级获取结果值。
而不是使用 node['my_file_content']
,这样您就可以询问 my_file_content 属性的值,因为优先级别不同。
像这样使用它,它将起作用:
file "/tmp/my_target_file" do
content node['my_file_content']
action :create
end
我无法让它工作,我已经用了几个小时了。这里有一个重复的问题,但从未得到充分回答。我已尝试将问题减少到最低限度。
这是我的简单食谱:"my_recipe.rb"
file "/tmp/my_target_file" do
content node.default['my_file_content']
action :create
end
...以及属性子目录中的属性文件:"my_attribute.rb"
default['my_file_content'] = 'From my_attribute.rb'
我在roles子目录下创建了一个角色:"my_role.rb"
name 'my_role'
description 'My role'
run_list 'recipe[my_cookbook::my_recipe]'
default_attributes['my_file_content'] = 'From my_role.rb'
我将食谱和角色都上传到我的 Chef 服务器,并从我的 Chef 工作站 运行 上传了一个 knife 命令:
knife bootstrap xxx.xxx.xxx.xxx -x myusername -P mysudopassword --sudo -r role[my_role] -N my_node_name
它 运行 很好,目标文件已创建,但 /tmp/my_target_file 的内容不是我所期望的。我得到
$ cat /tmp/my_target_file
From my_attribute.rb
...当然我想要的是
$ cat /tmp/my_target_file
From my_role.rb
根据 Chef 属性优先级,http://docs.chef.io/attributes.html,这应该有效。我也试过使用 'override_attributes' 但得到了相同的结果。如果我登录到我的 Chef 服务器并深入了解我的节点的属性,我可以看到属性
my_file_content: From my_role.rb
与其他 Ohai 生成的一样。
这里显然有些事情我没有说到。有人可以解释一下如何使用角色覆盖属性吗?
file "/tmp/my_target_file" do
content node.default['my_file_content']
action :create
end
node.default
是对节点对象的方法调用,旨在更新配方中 ['my_file_content']
属性的值。
不应使用它来获取值,因为您是在默认配方级别(即:从属性文件)获取值,而不是从属性优先级获取结果值。
而不是使用 node['my_file_content']
,这样您就可以询问 my_file_content 属性的值,因为优先级别不同。
像这样使用它,它将起作用:
file "/tmp/my_target_file" do
content node['my_file_content']
action :create
end