我已经做了好几个小时了,无法让它发挥作用。这里有一个重复的问题,但从来没有得到充分的回答。我试着把这个问题降到最低限度。
这是我的小食谱:"my_recipe.rb"
file "/tmp/my_target_file" do
content node.default['my_file_content']
action :create
end
和attributes子目录中的属性文件:"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'
我将食谱和角色上传到厨师服务器,并从厨师工作站运行刀具命令:
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
根据厨师属性优先级,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