我有以下节点定义:
{
"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
知道为什么吗?!
答案 0 :(得分:5)
你有一个哈希作为* 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
将为第一个网站打印“找到服务器:name:site1,dave”。
你得到的“奇怪”错误: TypeError - 无法将String转换为Integer ,因为当你为每个方法只提供1个变量时,ruby会尝试将key和value放入那个变量。结束了[key,value]赋值的值,在您的情况下意味着
site == [“site”,{“username”:“dave”,“password”:“password123”,“URL”:“www.madeup.com”}]
实际上是一个数组,并且您尝试使用字符串索引而不是整数来访问数组元素。