如何让Chef脚本递归修改指定目录下所有文件及目录的属主属组与权限?
解决Chef脚本递归修改目录及所有文件属性的问题
你的Chef脚本中,directory资源默认仅作用于指定的目录本身,recursive true参数仅用于自动创建不存在的父目录层级,不会递归修改已有子目录和文件的属主、属组及权限。要实现递归修改,可采用以下两种方案:
方案一:使用execute调用系统命令(推荐)
利用系统自带的chown(递归修改属主属组)和find(区分目录/文件设置权限)命令,高效处理所有层级的文件和目录:
# 注意:修正路径中的笔误,将l0g改为log %w(/etc/nginx/ /etc/nginx/conf.d/ /var/log/nginx/).each do |path| # 递归修改属主和属组 execute "chown-recursive-#{path}" do command "chown -R owner1:group1 #{path}" # 仅当当前目录的属主属组不符时执行 only_if "test $(stat -c '%U:%G' #{path}) != 'owner1:group1'" end # 区分目录和文件设置合理权限(目录0755,文件0644) execute "chmod-recursive-#{path}" do command <<-EOF find #{path} -type d -exec chmod 0755 {} \\; find #{path} -type f -exec chmod 0644 {} \\; EOF # 仅当存在权限不符的目录或文件时执行 only_if "find #{path} -type d ! -perm 0755 | grep -q . || find #{path} -type f ! -perm 0644 | grep -q ." end end
说明:
chown -R:递归修改指定路径下所有文件和目录的属主属组- 用
find区分目录和文件设置权限更合理:目录需要0755权限才能被访问,文件通常设0644(无需执行权限) only_if条件避免重复执行命令,提升Chef运行效率- 修正了你原脚本中的路径笔误:
/var/l0g/nginx/应为/var/log/nginx/
方案二:遍历所有文件/目录生成Chef资源
通过Dir.glob递归遍历路径下的所有条目,分别用directory和file资源处理:
%w(/etc/nginx/ /etc/nginx/conf.d/ /var/log/nginx/).each do |base_path| # 递归遍历所有文件和目录 Dir.glob("#{base_path}/**/*").each do |path| if File.directory?(path) directory path do owner "owner1" group "group1" mode '0755' end else file path do owner "owner1" group "group1" mode '0644' end end end end
注意:
- 此方案会在Chef编译阶段生成大量资源,若目录下文件数量较多,会导致Chef运行变慢
- 无法处理Chef编译完成后才生成的动态文件(如新增的日志文件),适合静态文件目录的场景
内容的提问来源于stack exchange,提问作者Johnyb
相关产品推荐
相关产品推荐

