Ansible使用delegate_to在同一远程节点切换用户执行任务失败求助
解决Ansible跨用户执行任务时临时目录权限问题的方案
以下是几种无需设置777权限的解决办法:
1. 为不同用户配置独立的临时目录
Ansible默认会使用远程用户家目录下的临时目录,你可以在inventory中给两个节点条目分别指定专属的临时目录,从根源上避免权限冲突:
node-foo ansible_host=192.168.1.10 ansible_user=foo-user ansible_remote_tmp=/tmp/ansible_foo_temp node-bar ansible_host=192.168.1.10 ansible_user=bar-user ansible_remote_tmp=/tmp/ansible_bar_temp
这样foo-user和bar-user的临时文件完全隔离,不会出现互相访问的权限问题。
2. 直接在任务中切换用户,弃用delegate_to
不需要为同一节点创建两个inventory条目,直接在同一个play里通过become切换用户执行任务:
- hosts: your-node tasks: - name: 以foo-user执行任务 command: echo "run as foo-user" become: yes become_user: foo-user - name: 以bar-user执行任务 command: echo "run as bar-user" become: yes become_user: bar-user
这种方式下,Ansible会自动为切换后的用户生成对应权限的临时目录,无需担心跨用户访问问题。需要确保远程节点的sudo配置允许目标用户切换,若sudo受限,可以改用become_method: su来切换用户。
3. 利用用户组共享临时目录(需同组前提)
如果foo-user和bar-user可以加入同一个用户组(比如ansible-shared),可以设置共享的临时目录并配置组权限:
- 先将两个用户添加到同一组:
usermod -aG ansible-shared foo-user usermod -aG ansible-shared bar-user
- 在inventory中配置共享临时目录及权限掩码:
node-foo ansible_host=192.168.1.10 ansible_user=foo-user ansible_remote_tmp=/tmp/ansible_shared ansible_remote_tmp_mode=0770 node-bar ansible_host=192.168.1.10 ansible_user=bar-user ansible_remote_tmp=/tmp/ansible_shared ansible_remote_tmp_mode=0770
0770权限确保同组用户对临时目录有读写访问权,既避免了777的安全风险,也满足跨用户访问需求。
内容的提问来源于stack exchange,提问作者Aditya Siddarth
相关产品推荐
相关产品推荐

