如何通过Ansible执行sudo su -切换用户并运行Bash命令
解决Ansible从alpha_user切换到beta_user执行命令的问题
方案一:利用Ansible Become机制(推荐)
Ansible的become默认通过sudo提权,要模拟sudo su - beta_user的登录shell切换行为,需配置become_flags加载目标用户的登录环境,同时指定正确的远程用户和目标用户:
- name: 切换到beta_user并执行touch命令 hosts: host_lon_01 remote_user: alpha_user become: true become_user: beta_user become_flags: '-su' # 等效于sudo su - beta_user,加载登录shell并切换到家目录 tasks: - name: 执行touch * shell: touch * args: chdir: "{{ ansible_user_dir }}" # 确保在beta_user的家目录执行命令
参数说明:
remote_user: alpha_user:指定登录host_lon_01的初始用户become: true:启用提权机制become_user: beta_user:指定要切换到的目标用户become_flags: '-su':让sudo执行su -的逻辑,加载beta_user的.bash_profile/.profile等配置,并自动切换到其家目录chdir:显式指定命令执行目录,与手动su -后的默认目录保持一致
方案二:直接通过Shell命令执行切换(适配特殊sudo配置)
如果Become机制因sudo权限限制无法生效,可直接在shell模块中执行完整的切换命令:
- name: 切换用户并执行touch命令 hosts: host_lon_01 remote_user: alpha_user tasks: - name: 执行sudo su - beta_user后运行touch * shell: sudo su - beta_user -c 'bash -c "touch *"' args: executable: /bin/bash
说明:
sudo su - beta_user -c:直接让alpha_user通过sudo切换到beta_user的登录shell,并执行后续命令bash -c "touch *":确保在bash环境下执行,让shell正确解析*通配符
关键前提检查
确保alpha_user的sudo权限配置正确(无需密码切换到beta_user),sudoers文件需包含类似规则:
alpha_user ALL=(beta_user) NOPASSWD: ALL
或更精确的权限(仅允许切换到beta_user):
alpha_user ALL=(beta_user) NOPASSWD: /bin/su - beta_user
内容的提问来源于stack exchange,提问作者Hasham1983
相关产品推荐
相关产品推荐

