如何在Chef Recipe中使用while/for循环批量创建多个编号文件
问题修正
你当前编写的while循环存在两处基础语法错误:
- 未初始化循环变量
$i的起始值 - while判断条件
$i <=后缺少循环终止的上限数值
额外提醒:Chef的资源在编译阶段统一收集,直接使用全局变量做循环计数容易触发闭包问题,最终所有file资源拿到的都是循环结束后的$i终值,导致生成的文件名不符合预期。
可用循环方案
while循环正确写法
以生成1到10序号的文件为例(可自行修改上限值调整生成数量),正确代码如下:
# 初始化循环变量,从1开始计数 $i = 1 while $i <= 10 do file "/home/user/files/file_#{$i}" do owner 'root' group 'root' mode '0755' action :create end $i += 1 end
如果使用老版本Chef出现所有文件名重复的问题,可以给路径加懒求值规避编译阶段的变量取值问题:
path lazy { "/home/user/files/file_#{$i}" }
for循环写法
for循环不需要手动维护变量累加,写法更简洁,且不会触发全局变量的闭包问题:
# 1..10为Ruby的范围对象,代表1到10的所有整数,可按需调整序号上下限 for i in 1..10 do file "/home/user/files/file_#{i}" do owner 'root' group 'root' mode '0755' action :create end end
这里的i是循环块内的局部变量,每一轮循环的取值独立,不需要额外加懒求值配置。
补充
你之前尝试的each方法其实是Chef更推荐的循环写法,不需要提前构造数组,直接对整数范围调用each即可,逻辑和for循环完全一致:
(1..10).each do |i| file "/home/user/files/file_#{i}" do owner 'root' group 'root' mode '0755' action :create end end
你之前each调用失败,大概率是没有使用整数范围生成遍历序列,而是尝试对不存在的数组做遍历导致的。
内容的提问来源于stack exchange,提问作者fingolfin
相关产品推荐
相关产品推荐

