You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:04:59