Ansible synchronize模块rsync权限错误处理及-rlgoD参数对应配置咨询
嗨,针对你遇到的Ansible synchronize模块rsync权限问题,我来给你梳理下解决方案~
首先确认下问题根源:你用sysadmin账号(甚至目标目录的所有者账号)执行同步时,出现权限拒绝和时间戳设置失败的错误,确实是因为Ansible的synchronize模块默认启用了*--archive*参数(对应-rlptgoD),这个参数会让rsync尝试同步文件的修改时间(-t)和权限(-p),但目标目录里存在CI/CD工具生成的其他用户隐藏文件,你的账号没有权限修改这些文件的属性,所以触发了报错。而你手动去掉-t和-p改用-rlgoD后同步成功,现在只需要把这个逻辑迁移到Ansible配置里就行。
这里给你两种可行的配置方式:
方案一:关闭archive模式,手动指定所需参数
因为-rlgoD对应的是递归、软链接、组、所有者、设备文件、目录结构这些属性,你可以直接关闭默认的archive模式,然后手动开启这些需要的选项:
- name: Copy scripts to batch server synchronize: src: scripts dest: /dest/scripts/ archive: false # 关闭默认的archive模式,避免包含-t和-p recursive: true # 对应-r links: true # 对应-l group: true # 对应-g owner: true # 对应-o devices: true # 对应-D里的设备文件部分 dirs: true # 对应-D里的目录结构部分
这样配置后,synchronize模块就会执行和-rlgoD完全一致的rsync命令,不会再尝试修改时间戳和权限。
方案二:保留archive模式,移除不需要的参数
如果你想保留archive模式里的其他默认配置(比如硬链接、特殊文件同步等),只是去掉-t和-p,可以用rsync_opts添加排除选项,这种方式更简洁:
- name: Copy scripts to batch server synchronize: src: scripts dest: /dest/scripts/ recursive: true rsync_opts: - "--no-times" # 等价于去掉-t参数,不同步修改时间 - "--no-perms" # 等价于去掉-p参数,不同步权限
因为synchronize默认启用archive: true,加上这两个选项后,最终的rsync命令就相当于--archive --no-times --no-perms,也就是你手动执行的-rlgoD效果,完美匹配你的需求。
总结一下,两种方式都能解决你的权限问题,选哪种取决于你是否需要archive模式的其他默认特性。如果只是需要同步文件内容和基本结构,方案一更直观;如果要保留更多rsync的高级同步特性,方案二更合适。
备注:内容来源于stack exchange,提问作者Sachiko

