我正在写一个厨师食谱,只是简单地创建了一个数据库配置文件,但我只是难以访问属性。我为每个实例部署了一些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个应用程序来说不会太糟糕......
答案 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]
将抛出此异常。很难发现。