Ansible synchronize模块带sudo密码同步报错求助
解决Ansible synchronize模块sudo无终端密码报错问题
问题根源
使用synchronize模块并开启become: yes时,Ansible会自动设置rsync-path=sudo rsync,但sudo默认需要终端交互读取密码,而CI/CD流水线属于无终端环境,导致sudo无法获取密码触发报错。
解决方案
1. 调整synchronize模块的rsync-path参数
在任务中显式指定rsync_path为sudo -S rsync,-S选项让sudo从标准输入读取密码,Ansible会自动将提权密码传递给标准输入:
- name: 同步控制机文件到远程主机 become: yes ansible.posix.synchronize: src: ./ dest: "{{ var_app_path }}/" rsync_path: "sudo -S rsync"
2. 统一使用Ansible通用提权变量(可选)
建议用通用的ansible_become_pass替代旧的ansible_sudo_pass,调整CI执行命令:
ansible-playbook -u $LOGIN -i "$SERVER_IP," --extra-vars "ansible_become_pass=$SUDO_PASSWORD" playbook.yml
3. 排查sudoers配置(若上述方法仍报错)
部分主机默认sudo配置要求用户拥有tty,可在目标主机的sudoers文件中为执行用户添加!requiretty规则:
Defaults:$LOGIN !requiretty
(需拥有sudo权限修改,或联系运维配置)
验证
修改后重新执行playbook,synchronize模块将通过rsync+sudo -S完成高效文件同步,避免copy模块的低速问题。
内容的提问来源于stack exchange,提问作者kr1p
相关产品推荐
相关产品推荐

