You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 22:05:14