Chef属性“没有将String隐式转换为Integer”

时间:2014-04-22 09:23:31

标签: ruby aws-opsworks

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

属性/数据库settings.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';

食谱/数据库settings.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个应用程序来说不会太糟糕......

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

<强>属性/ database_settings.rb

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

<强>属性/ writable_directories.rb

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

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

答案 2 :(得分:1)

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

node[:foo][:bar]

将起作用,而

node [:foo][:bar]

将抛出此异常。很难发现。