【问题标题】:Can I use double quotes in Chef attribute declaration?我可以在 Chef 属性声明中使用双引号吗?
【发布时间】:2017-04-11 17:46:42
【问题描述】:

我继承了一本食谱,它按照正常方式在 ./attributes/default.rb 文件中设置了一些属性。

但是,我们有一个问题是其中一行是:

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

运行时,将其写入节点:

{}/com/mysql/jdbc/main

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

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

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

【问题讨论】:

    标签: attributes chef-infra


    【解决方案1】:

    您最有可能遇到派生属性问题:

    https://coderanger.net/derived-attributes/

    在设置 jboss_home 属性之前,会解析您的食谱中的属性代码。一种或另一种解决方案是将插值移动到配方代码中。

    您可以只使用一个普通的旧 ruby​​ 变量而不是您尝试构建的属性 - 特别是如果您的系统中没有其他任何东西设置该属性。

    您还应该能够从属性文件中删除声明并在配方代码中使用它:

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

    虽然您需要将该语句放在 run_list 的早期,但在您使用 node["obscured"]["mysql"] 作为任何资源的参数之前。

    【讨论】:

      【解决方案2】:

      你有什么很好,你如何确认node['jboss']['jboss_home']的值以及你如何在模板中使用它?

      在 Ruby 中,单引号和双引号文字都变为 Strings,但单引号相对文字,而双引号允许反斜杠转义和 #{} 插值。

      【讨论】:

        【解决方案3】:

        答案是没有规则。

        在这样的情况下使用双引号是完全可以的:

        default["obscured"]["mysql"] = blah blah
        

        我知道这一点的原因是我刚刚发现一个带有双引号的设置确实有效。 :-)

        【讨论】:

          猜你喜欢
          • 2016-02-07
          • 1970-01-01
          • 2011-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多