在Chef模板中使用循环时遇TemplateError类型转换错误求助
解决Chef模板循环中的"no implicit conversion of String into Integer"错误
这个错误其实很常见,本质是你在模板里把数组当成哈希来访问了——Chef里数组只能用整数索引(比如[0]、[1]),如果你用字符串(比如["hostname"])去索引数组,就会触发这个类型转换错误。
先看你的属性结构,node["clustering"]["wka"]["members"]是一个包含哈希元素的数组,结构是:
[ { "hostname" => '10.100.4.555', "port" => 4000 }, { "hostname" => '10.100.4.556', "port" => 4000 } ]
你之前的模板片段没写完,但大概率是循环写法出了问题。正确的遍历方式应该是先迭代这个数组的每个元素,再从元素哈希里取出hostname和port,比如:
<members> <% node["clustering"]["wka"]["members"].each do |member| %> <member> <hostname><%= member["hostname"] %></hostname> <port><%= member["port"] %></port> </member> <% end %> </members>
错误原因复盘
如果你的模板里写了类似node["clustering"]["wka"]["members"]["hostname"]的代码,就会直接报错:因为members是数组,你用字符串"hostname"当索引,Ruby会尝试把这个字符串转成整数(数组要求的索引类型),转失败就抛出了这个TemplateError。
额外检查点
- 确认属性结构无误:确保
node["clustering"]["wka"]["members"]确实是数组(从你给出的属性看是正确的,用[]包裹) - 类型统一提示:你的属性里
local_member_port是字符串类型('4000'),但wka成员的port是整数类型(4000),如果模板里需要统一格式,可以用member["port"].to_s或者node["clustering"]["local_member_port"].to_i做转换,不过这不是当前错误的根源。
内容的提问来源于stack exchange,提问作者Tharmini
相关产品推荐
相关产品推荐

