如何使用角色覆盖Chef中的默认属性



我已经做了好几个小时了,无法让它发挥作用。这里有一个重复的问题,但从来没有得到充分的回答。我试着把这个问题降到最低限度。

这是我的小食谱:"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

最新更新