Ошибка типа в рецепте шеф-повара
У меня есть следующее определение узла:
{
"prestashop_sites" : {
"site1": { "username": "dave", "password" :"password123", "URL":"www.madeup.com" },
"site2": { "username": "dave2", "password" :"password12", "URL":"www.madeup2.com" }
},
"run_list": [
"recipe[prestashop]"
]
}
И рецепт:
node["prestashop_sites"].each do |site|
username site['username']
Chef::Log.debug("Found a server: #{site['username']}")
end
remote_file "/tmp/prestashop152.zip" do
source "http://www.prestashop.com/download/old/prestashop_1.5.2.0.zip"
mode "0644"
checksum "37aee9ef5388376e4377aeb240ab027e"
backup false
not_if "test -f /tmp/prestashop152.zip"
end
execute "unzip -o /tmp/prestashop152.zip -d #{node[:prestashop][:location]}" do
not_if "test -f /var/www/#{node[:prestashop][:user]}/prestashop/index.php"
end
Поэтому моя цель - установить несколько экземпляров prestashop (после того, как я закончу сценарий).
Но я застрял:
10: node["prestashop_sites"].each do |site|
11>> Chef::Log.debug("Found a server: #{site['username']}")
12: end
Mon, 12 Nov 2012 21:26:14 +0100] DEBUG: Re-raising exception:
TypeError - can't convert String into Integer
Есть идеи почему?!
1 ответ
У вас есть хеш как подэлемент *node["prestashop_sites"]*, а не как массив. Таким образом, вы должны предоставить 2 переменные для каждого метода. 1 для ключа, другой для значения:
10>>! node["prestashop_sites"].each do |key, site|
11: Chef::Log.debug("Found a server: name: #{key}, #{site['username']}")
12: end
Для первого сайта будет напечатано "Найдено сервер: имя: site1, dave".
"Странная" ошибка, которую вы получаете: TypeError - не может преобразовать String в Integer, потому что, когда вы предоставляете только 1 переменную для каждого метода, ruby пытается поместить и ключ, и значение в эту переменную. На этом заканчивается значение [key, value] назначено, что в вашем случае означает, что
site == ["site", {"username": "dave", "password": "password123", "URL": "www.madeup.com"}]
Массив на самом деле, и вы пытаетесь получить доступ к элементу массива с индексом строки, а не целое число.