2013-09-05 4 views
1

Я пытаюсь использовать IP экземпляра на AWS OpsWorks в рецептуре шеф-повара, код выглядит следующим образом:OpsWorks Config Data: TypeError - Символ как индекс массива

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....

ответ

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....} 
+0

Спасибо. Журнал смутил меня, не был уверен, что шеф-повар каким-то образом запустил ключ «первого» элемента хэша, а также данные. Кажется, что либо документация AWS неверна в структуре данных, либо '.first' возвращает данные так, как я не видел документально. В любом случае, это работает, и я понимаю, что происходит. –