Chef中如何使用foreach遍历含属性的数组创建多个目录?
Chef遍历含属性的路径数组创建目录的解决方法
错误原因
- 循环内的
directory资源未显式指定path参数,Chef默认将资源名称作为创建路径,你循环内的资源名固定为for storing local binaries,程序不会读取你遍历得到的path变量值。 - Chef中同一Recipe内的资源名称必须唯一,重复名称的资源只会执行第一个,后续重复资源会被直接跳过,因此不会生成多个目录也不会抛出错误。
- 额外优化建议:读取属性值时不要使用
node.default[:user_home],直接使用node[:user_home]即可,node.default是属性的默认层级,仅在设置属性默认值时使用,读取时直接取合并后的节点属性值更稳妥。
修复代码(循环版本)
["#{node[:user_home]}/.local", "#{node[:user_home]}/.local/bin"].each do |path| # 资源名用路径保证唯一,同时Chef默认将资源名作为path参数值 directory path do owner 'chefuser' group 'chefuser' mode '0755' action :create end end
简化方案(无需循环)
如果你只需要创建多层嵌套目录,不需要单独给每层设置权限的话,可以直接使用recursive参数自动创建不存在的父目录:
directory "#{node[:user_home]}/.local/bin" do owner 'chefuser' group 'chefuser' mode '0755' recursive true action :create end
内容的提问来源于stack exchange,提问作者user17021867
相关产品推荐
相关产品推荐

