我正在尝试使用在大厨配方中构建的散列来填充json字符串,但是仍然会将错误“Symbol as array index”命中。我在stackoverflow和google上的搜索让我无处可去,我只是好奇这里发生了什么。我对Ruby不太好,所以如果代码有点关闭,请原谅我。
属性文件:
node.default[:server][:sumologic][:sources][:apache] = Hash.new
node.default[:server][:sumologic][:sources][:apache][:type] = "LocalFile"
node.default[:server][:sumologic][:sources][:apache][:name] = "Apache Logs"
node.default[:server][:sumologic][:sources][:apache][:path_expression] = "/var/log/httpd/*.log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] = Array.new
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/access.log*"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/error.log*"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/ssl_request_log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/access_log"
node.default[:server][:sumologic][:sources][:apache][:blacklist] << "/var/log/httpd/error_log"
node.default[:server][:sumologic][:sources][:apache][:category] = "test-httpd"
模板erb文件:
{
"api.version": "v1",
"sources": [
<% sources.each do |source| %>
{
"sourceType" : "<%= source[:type] %>",
"name": "<%= source[:name] %>",
"pathExpression": "<%= source[:path_expression] %>",
<% if defined?(source[:blacklist]) %>
"blacklist": [
<% source[:blacklist].each do |listed, index| %>
<% if index < source[:blacklist].length - 1 %>
"<%= listed %>",
<% else %>
"<%= listed %>"
<% end %>
<% end %>
],
<% end %>
"category": "<%= source[:category] %>"
},
<% end %>
...
食谱代码:
template '/opt/SumoCollector/sources.json' do
source 'sources.json.erb'
variables({
:sources => node[:server][:sumologic][:sources]
})
end
答案 0 :(得分:0)
您对chef属性的使用有点不对劲。它们不是哈希,而是更聪明,所以你不必将它们初始化为Hash。 删除该行:
node.default[:server][:sumologic][:sources][:apache] = Hash.new
最好在1次操作中初始化数组属性:
node.default[:server][:sumologic][:sources][:apache][:blacklist] = [
'/var/log/httpd/access.log*',
'/var/log/httpd/error.log*',
'/var/log/httpd/ssl_request_log',
'/var/log/httpd/access_log',
'/var/log/httpd/error_log'
]
您的错误&#34;符号作为数组索引&#34;来自你的情况
<% sources.each do |source| %>
"sourceType" : "<%= source[:type] %>",
[...]
<% end %>
source
实际上是一个数组[:apache, <hash-like-object>]
,因此调用source[:type]
失败。
sources 实际上是类似哈希的属性集合,您应该相应地处理它。如果您将行更改为
<% sources.each do |key, source| %>
一切都会奏效。这里 key 将是&#34;:apache&#34;和来源将等于node[:server][:sumologic][:sources][:apache]
。