我可以在Chef属性声明中使用双引号吗?

时间:2016-11-28 03:55:46

标签: attributes chef

我已经继承了一个食谱,可以按照正常情况在./attributes/default.rb文件中设置一些属性。

但是,我们遇到一个问题,就是:

default["obscured"]["mysql"] = "#{node['jboss']['jboss_home']}/modules/com/mysql/jdbc/main"

运行时,将其写入节点:

{}/com/mysql/jdbc/main

我可以确认节点['jboss'] ['jboss_home']属性存在并且具有正确的值。

所以,我看不出上面的任何问题,除了我们的食谱中的这种类型的每一个声明都有关于要设置的属性(即左侧)的单引号,而不是双引号。我之前没有听说过这个问题,但我对厨师很陌生。

是否有任何规则表明它们必须是单引号?

3 个答案:

答案 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"]作为任何资源的参数之前。