我已经继承了一个食谱,可以按照正常情况在./attributes/default.rb文件中设置一些属性。
但是,我们遇到一个问题,就是:
default["obscured"]["mysql"] = "#{node['jboss']['jboss_home']}/modules/com/mysql/jdbc/main"
运行时,将其写入节点:
{}/com/mysql/jdbc/main
我可以确认节点['jboss'] ['jboss_home']属性存在并且具有正确的值。
所以,我看不出上面的任何问题,除了我们的食谱中的这种类型的每一个声明都有关于要设置的属性(即左侧)的单引号,而不是双引号。我之前没有听说过这个问题,但我对厨师很陌生。
是否有任何规则表明它们必须是单引号?
答案 0 :(得分:0)
答案是没有规则。
在这样的事情中使用双引号是完全正确的:
default["obscured"]["mysql"] = blah blah
我知道的原因是我刚发现一个用双引号设置,实际上有效。 : - )
答案 1 :(得分:0)
你有什么没关系,你如何确认node['jboss']['jboss_home']
的价值以及你如何在模板中使用它?
在Ruby中,单引号和双引号文字都变为String
,但是单引号是相对字面的,而双引号允许反斜杠转义和#{}
插值。
答案 2 :(得分:0)
您最有可能遇到派生属性问题:
https://coderanger.net/derived-attributes/
在设置jboss_home
属性之前,您的cookbook中的属性代码将被解析。无论如何,解决方案是将插值移动到配方代码中。
您可以使用普通的旧ruby变量而不是您尝试构建的属性 - 特别是如果您的系统中没有其他任何东西设置该属性。
您还应该能够从属性文件中删除声明,并在配方代码中使用它:
node.default_unless["obscured"]["mysql"] =
"#{node['jboss']['jboss_home']}/modules/com/mysql/jdbc/main"
虽然您需要在run_list中尽早放置该语句,但在使用node["obscured"]["mysql"]
作为任何资源的参数之前。