厨师属性“没有将字符串隐式转换为整数”

Posted

技术标签:

【中文标题】厨师属性“没有将字符串隐式转换为整数”【英文标题】:Chef attributes "no implicit conversion of String into Integer" 【发布时间】:2014-06-06 14:03:12 【问题描述】:

我正在编写一个厨师食谱,它只是创建一个数据库配置文件,但我很难简单地访问属性。我为每个实例部署了一些 php 应用程序,并且 OpsWorks 对每个人都使用相同的配方,因此我在属性文件中有一些不同的设置。

属性/数据库设置.rb

# API
default[:api][:path]      = 'app/config/database.php';
default[:api][:host]      = 'test';
default[:api][:database]  = 'test';
default[:api][:username]  = 'test';
default[:api][:password]  = 'test';

食谱/数据库设置.rb

Chef::Log.info("Database settings!");

node[:deploy].each do |application, deploy|

    if node.has_key?(application)
        Chef::Log.info("Application: #application");

        path = node["api"]["path"]; # ERROR HAPPENING HERE
        Chef::Log.info("Path: #path");

        template path do
            source "database.erb"
            mode 0440
            variables(
               :host     => node["api"]["host"],
               :database => node["api"]["database"],
               :username => node["api"]["username"],
               :password => node["api"]["password"]
            )
        end

    end

end

我得到的错误是no implicit conversion of String into Integer。我已经尝试以我能想到的各种方式创建和访问设置,例如...

node[:api][:path] # no implicit conversion of Symbol into Integer
node['api']['path'] # no implicit conversion of String into Integer
node[:api].path # undefined method `path' for #<Chef::Node::ImmutableArray:0x007fa4a71086e8>
node[application][:path] # no implicit conversion of Symbol into Integer

我确定我在这里做错了一些非常明显的事情,但我已经尝试了我能想到的一切,但我似乎无法找到任何方法让它工作?!理想情况下,我想使用一个变量,我可以"api",但使用 if/else 对于 3 个应用程序来说不会太糟糕......

【问题讨论】:

试试node.default[:api][:path] 我在使用node.default时遇到同样的错误,例如:path = node.default[application][:path]; # no implicit conversion of Symbol into Integer 能否打印出node.defaultnode.default[application] 是什么? 好吧,这可能已经发现了这个问题,这可能不是你的意思,但我做了node.default[application].inspect,它返回了一个不同配方的路径数组(["public/tmp_uploads","app/storage/archives"...]),但两者都使用了@ 987654333@键,属性不限同名配方吗?我会尝试更改密钥,然后再试一次。 【参考方案1】:

当您尝试访问一个认为它是哈希但实际上是数组的对象时,这是一个常见的错误。事实上,从您的一个错误中,可以看出node["api"]Chef::Node::ImmutableArray

【讨论】:

我是一个完整的 ruby​​ 新手,所以我不太确定有什么区别,但根据 aws 文档,我应该可以通过 [:api][:path] 访问它,除非这只是没有工作docs.aws.amazon.com/opsworks/latest/userguide/…【参考方案2】:

好吧,问题并不是我错误地访问了配置,而是不同的属性文件都被合并到一个配置中,我没有意识到这一点。 我有这些配置文件...

属性/database_settings.rb

default[:api][:path] = 'app/config/database.php';
default[:api][:username] = 'example';

attributes/writable_directories.rb

default[:api] = ['public/uploads', 'storage/cache'];

当我尝试访问default[:api][:path] 时,我实际上是在访问目录数组,而这似乎覆盖了数据库设置属性。将这些移动到 default[:directories][:api]default[:database][:api][:path] 等中修复了这个问题。

【讨论】:

【参考方案3】:

请注意,如果您不小心在“节点”和索引它的项目之间输入了空格,您也会收到此错误:

node[:foo][:bar]

会起作用,而

node [:foo][:bar]

会抛出这个异常。可能很难发现。

【讨论】:

以上是关于厨师属性“没有将字符串隐式转换为整数”的主要内容,如果未能解决你的问题,请参考以下文章

如何将linux命令输出到厨师属性

转换对象属性,以便在打字稿中保留隐式类型

操作符中表达式求值(隐式类型转换详解)以及操作符属性

错误128无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColumn”

以编程方式删除配方上的厨师属性

javascript 隐式转换