Данные конфигурации OpsWorks: TypeError — символ как индекс массива

Я пытаюсь использовать IP-адрес экземпляра на AWS OpsWorks в рецепте Chef, код выглядит так:

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, поэтому немного не знаю, что попробовать. Даже в документах указан этот синтаксис:

Следующий пример получает частный IP-адрес первого экземпляра уровня HAProxy: node[:opsworks][:layers][:lb][:instances].first[:private_ip]

Когда я регистрирую значение node[:opsworks][:layers][:admin][:instances].first, я получаю:

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


person Tim Lytle    schedule 05.09.2013    source источник


Ответы (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....}
person fotanus    schedule 05.09.2013
comment
Спасибо. Журнал смутил меня, я не был уверен, что шеф-повар каким-то образом регистрирует ключ «первого» элемента хеша, а также данные. Похоже, либо документация AWS неверна в отношении структуры данных, либо .first возвращает данные так, как я не видел в документации. В любом случае, это работает, и я вроде как понимаю, что происходит. - person Tim Lytle; 06.09.2013