Ansible synchronize模块持续触发Permission denied报错求助
Ansible synchronize模块权限拒绝问题解决
问题背景
搭建的Ansible环境中,host_vars/testserver.yaml配置了密码认证,copy/template等模块能正常执行,但synchronize模块反复报错Permission denied (publickey,password),报错详情如下:
fatal: [lmoc1]: FAILED! => {"changed": false, "cmd": "sshpass -d3 /usr/bin/rsync --delay-updates -F --compress --archive --rsh='/usr/bin/ssh -S none -o Port=22 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --rsync-path='su -c rsync' -e \"ssh\" --exclude=.git --exclude=__pycache__ --out-format='<<CHANGED>>%i %n%L' /home/leomoon/ansible/files/var/opt/app-scraper ansible@x.x.x.x:/var/opt/", "msg": "Permission denied, please try again.\r\nPermission denied, please try again.\r\ansible@x.x.x.x: Permission denied (publickey,password).\r\nrsync error: unexplained error (code 255) at rsync.c(703) [sender=3.2.3]\n", "rc": 5}
原因分析
synchronize模块默认以push模式运行:在控制端执行本地rsync命令,通过ssh连接目标端完成同步。这个过程不会自动继承Ansible配置的ansible_password/ansible_become_pass参数,尤其是当开启ansible_become: true时,模块会自动添加--rsync-path='su -c rsync'参数,导致su/sudo需要密码但无法自动传递,最终触发权限拒绝。
而copy等模块是由Ansible直接通过ssh连接目标端执行操作,会自动使用配置的密码,因此可以正常运行。
解决方案
方案1:显式传递sudo密码到rsync路径
修改synchronize任务,将sudo密码通过管道传递给rsync命令:
- name: copy app-scraper (fixed) synchronize: src: files/var/opt/app-scraper dest: /var/opt/ rsync_opts: - "--exclude=.git" - "--exclude=__pycache__" rsync_path: "echo '{{ ansible_become_pass }}' | sudo -S rsync"
方案2:临时关闭该任务的become权限
如果目标目录/var/opt/允许ansible用户写入,可临时关闭synchronize任务的become,同步完成后再修正权限:
- name: copy app-scraper (fixed) synchronize: src: files/var/opt/app-scraper dest: /var/opt/ rsync_opts: - "--exclude=.git" - "--exclude=__pycache__" become: false - name: fix app-scraper directory permissions file: path: /var/opt/app-scraper owner: root group: root recurse: true
方案3:配置目标端sudo免密执行rsync
在目标端的sudoers文件中添加免密规则,让ansible用户无需密码即可执行rsync:
- 登录目标端执行
visudo - 添加以下内容:
ansible ALL=(ALL) NOPASSWD: /usr/bin/rsync
- 保存退出后,原
synchronize任务即可正常执行,无需修改剧本。
方案4:显式指定rsync的ssh认证参数
在rsync选项中直接指定ssh密码(存在密码泄露风险,谨慎使用):
- name: copy app-scraper (fixed) synchronize: src: files/var/opt/app-scraper dest: /var/opt/ rsync_opts: - "--exclude=.git" - "--exclude=__pycache__" - "--rsh=sshpass -p '{{ ansible_password }}' ssh -o StrictHostKeyChecking=no"
内容的提问来源于stack exchange,提问作者Amin Persia
相关产品推荐
相关产品推荐

