Ansible以root身份操作时访问普通用户家目录的权限问题
Ansible copy模块sudo权限问题解决
问题描述
尝试通过Ansible以sudo权限将远程用户家目录~/bin中的内容复制到系统目录时,使用command模块的方式可行:
- name: Copy Folder Working become_user: "{{ ansible_facts.env.SUDO_USER }}" become: yes command: sudo mv ~/bin /usr/local/bin
但使用copy模块时出现权限错误,报错提示Destination /usr/share not writable,即使已添加become: yes:
- name: Copy Folder Permission Error become_user: "{{ ansible_facts.env.SUDO_USER }}" become: yes copy: remote_src: yes src: ~/bin dest: /usr/share
服务器默认用户不固定(如ubuntu或其他发行版默认用户),通过{{ ansible_facts.env.SUDO_USER }}获取的用户变量正常,但权限问题依然存在。
问题原因
当前配置的become: yes + become_user: "{{ ansible_facts.env.SUDO_USER }}"逻辑矛盾:
become: yes默认会切换到root用户(除非修改了become_user默认值)- 但同时指定
become_user为普通用户,最终Ansible会以普通用户身份执行copy模块,自然没有写入/usr/share这类系统目录的权限 - 而
command模块里额外加了sudo,相当于普通用户再次提权到root,所以能执行成功,但这种写法冗余且不符合Ansible最佳实践
解决方案
方案1:直接以root身份执行copy模块
去掉多余的become_user配置,直接用become: yes切换到root,同时明确指定源路径为目标用户的家目录:
- name: Copy folder with sudo permission become: yes copy: remote_src: yes src: "/home/{{ ansible_facts.env.SUDO_USER }}/bin" dest: /usr/share
或者用波浪号加用户名的写法:
- name: Copy folder with sudo permission become: yes copy: remote_src: yes src: "~{{ ansible_facts.env.SUDO_USER }}/bin" dest: /usr/share
方案2:优化command模块写法(可选)
如果沿用command模块,建议去掉冗余配置,直接以root身份执行:
- name: Move folder with sudo become: yes command: mv "/home/{{ ansible_facts.env.SUDO_USER }}/bin" /usr/local/bin
注意事项
- 若需要保留源目录的权限、所有者等属性,
copy模块可通过owner、group、mode参数手动指定,或依赖remote_src: yes的默认行为继承源文件属性 - 避免在
command模块里嵌套sudo,尽量使用Ansible原生的become机制管理权限,逻辑更清晰且易于维护
内容的提问来源于stack exchange,提问作者Xaver
相关产品推荐
相关产品推荐

