【问题标题】:OpsWorks Config Data: TypeError - Symbol as array indexOpsWorks 配置数据:TypeError - 符号作为数组索引
【发布时间】:2026-01-07 08:50:01
【问题描述】:

我正在尝试在 Chef 配方中使用 AWS OpsWorks 上实例的 IP,代码如下所示:

variables(
  :db_host => (node[:scraper][:db_host] rescue nil),
  :db_user => (node[:scraper][:db_user] rescue nil),
  :db_pass => (node[:scraper][:db_pass] rescue nil),
  :db_name => (node[:scraper][:db_name] rescue nil),
  :beanstalk_host => (node[:opsworks][:layers][:admin][:instances].first[:private_ip])
)

但我收到 TypeError - Symbol as array index 错误。

我不是 Ruby 开发人员,所以我有点不知道该尝试什么。甚至文档也列出了该语法:

以下示例获取 HAProxy 层第一个实例的私有 IP 地址: node[:opsworks][:layers][:lb][:instances].first[:private_ip]

当我记录node[:opsworks][:layers][:admin][:instances].first 的值时,我得到:

["admin1", {"elastic_ip"=>"54.221.245....

【问题讨论】:

    标签: ruby chef-infra aws-opsworks


    【解决方案1】:

    错误是正确的:你不能使用符号作为数组索引。

    根据你最后一行的输出,因为它以[ 开头,所以它是一个数组。

    您很可能正在尝试使用符号:private_ip 在数组的第二个位置索引字典。在这种情况下,正确的行是

    node[:opsworks][:layers][:admin][:instances].first[1][:private_ip]
    

    你需要在脑海中一步一步地走。如果node[:opsworks][:layers][:admin][:instances].first 返回

    ["admin1", {"elastic_ip"=>"54.221.245....}]
    

    然后node[:opsworks][:layers][:admin][:instances].first[1] 将返回

    {"elastic_ip"=>"54.221.245....}
    

    【讨论】:

    • 谢谢。日志让我很困惑,不确定厨师是否以某种方式记录了哈希的“第一个”元素的键以及数据。似乎 AWS 文档中的数据结构不正确,或者 .first 以我没有看到文档的方式返回数据。无论哪种方式,它都有效,而且我有点理解发生了什么。