3

我正在编写一个厨师食谱,它只是创建一个数据库配置文件,但我很难访问这些属性。我为每个实例部署了一些 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",但是对于 3 个应用程序来说,使用 if/else 不会太糟糕......

4

3 回答 3

3

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

于 2014-04-22T09:27:37.917 回答
3

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

属性/database_settings.rb

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

属性/可写目录.rb

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

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

于 2014-04-22T15:03:48.593 回答
2

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

node[:foo][:bar]

会工作,而

node [:foo][:bar]

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

于 2015-10-19T22:57:18.270 回答