如何使用角色覆盖 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