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

Chef infra 如何使用角色覆盖Chef中的默认属性,chef-infra,Chef Infra,我做了好几个小时都没法让它工作。这里有一个重复的问题,但从来没有得到充分的回答。我已尽力把这个问题降到最低限度 这是我的小食谱:“my_recipe.rb” …和attributes子目录中的属性文件:“my_attribute.rb” 我在roles子目录中创建了一个角色:“my_role.rb” 我将cookbook和角色上传到我的Chef服务器,并从我的Chef工作站运行刀子命令: knife bootstrap xxx.xxx.xxx.xxx -x myusername -P mysud

我做了好几个小时都没法让它工作。这里有一个重复的问题,但从来没有得到充分的回答。我已尽力把这个问题降到最低限度

这是我的小食谱:“my_recipe.rb”

…和attributes子目录中的属性文件:“my_attribute.rb”

我在roles子目录中创建了一个角色:“my_role.rb”

我将cookbook和角色上传到我的Chef服务器,并从我的Chef工作站运行刀子命令:

knife bootstrap xxx.xxx.xxx.xxx -x myusername -P mysudopassword --sudo -r role[my_role] -N my_node_name
它运行良好,并且创建了目标文件,但是/tmp/my_target_文件的内容不是我所期望的。我要走了

$ cat /tmp/my_target_file
From my_attribute.rb
。。。当然我想要的是

$ cat /tmp/my_target_file
From my_role.rb
根据厨师长的说法,这应该是有效的。我也尝试过使用“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
是对node对象的方法调用,旨在更新配方中
['my\u file\u content']
属性的值

它不应用于获取值,因为您获取的是默认配方级别的值(即:来自属性文件),而不是来自属性优先级的结果值

相反,使用
node['my_file_content']
这种方式,您可以询问由不同级别的前依存关系产生的my_file_content属性的值

像这样使用它,它将工作:

file "/tmp/my_target_file" do
  content node['my_file_content']
  action :create
end

是的,谢谢。我想我需要知道更多的ruby或者不知道ruby。我很难说出哪些部分是chef,哪些部分是ruby。配方DSL离ruby很近,您可以从learnchef.com和docs.chef.io开始参考
my_file_content: From my_role.rb
file "/tmp/my_target_file" do
  content node.default['my_file_content']
  action :create
end
file "/tmp/my_target_file" do
  content node['my_file_content']
  action :create
end