以特定用户身份运行 Ansible 任务

以特定用户身份运行 Ansible 任务

我尝试以与运行剧本的用户不同的用户身份运行特定的 Ansible 任务。我的.yml文件如下所示:

---

- hosts: staging_servers
  tasks:    
    - name: check user
      remote_user: someusername
      shell: whoami

运行此任务向我显示该命令返回与我在任务中定义不同的用户(准确地说,返回在名为的文件whoami中定义的用户)。hostsubuntu

我也尝试过定义这样的任务:

---

- hosts: staging_servers
  tasks:
    - name: check user
      sudo: yes
      sudo_user: someusername
      shell: whoami

但是然后我收到“ ”错误,尽管文件Missing sudo password中有一行写着在远程机器上发出命令不会要求我输入密码。sudoerssomeusername ALL=(ALL) NOPASSWD:ALLsudosomeusername

hosts那么,我如何才能以文件中定义的用户或他自己以外的其他用户身份运行特定任务root

答案1

您误解了这两个设置:

  • 远程用户是一个 Ansible 设置,用于控制 Ansible 用于连接的 SSH 用户:ssh ${REMOTE_USER}@remotehost

  • 某些用户名 ALL=(全部) NOPASSWD:ALL是一个 sudo 配置,允许用户someusername无需密码即可在任何主机上执行所有命令。它不允许任何人发出命令someusername

理想情况下,你会以正确用户身份直接登录这就是remote_user全部内容。但通常您只能以管理员用户身份登录(例如ubuntu),并且必须以其他用户身份(例如scrapy)执行 sudo 命令。然后您应该留给remote_user登录的用户,并将以下 ansible 属性添加到作业中:

- name: log in as ubuntu and do something as scrapy
  remote_user: ubuntu
  sudo: true
  sudo_user: scrapy
  shell: do-something.sh

答案2

请注意,在 Ansible 1.9 之后,该sudo措辞被替换为become,因此

sudo: yes
sudo_user: some_user

变成(双关语):

become: yes
become_user: some_user

更多具体信息请见此处:https://stackoverflow.com/a/22749788/402727

也写这个您想要执行的实际模块(例如commandshell)才能使其生效。至少根据我的经验,如果我在模块后面写入become和 ,它就无法正常工作。become_usershell

- name: Example user change
  become: true
  become_user: '{{ user }}'
  shell: |
    ...

答案3

作为前书呆子指出你已经使用become模块。此外,为了准确获得 OP 想要的内容,请使用su作为 become 方法:

- name: check user
  become: yes
  become_user: someusername
  become_method: su
  become_flags: '--login'
  shell: whoami

become_flags: '--login'确保您像手动登录一样登录,例如加载.profile等。

如果你还没有定义成为密码对于登录主机的用户,您可以通过以下方式在任务级别执行此操作vars

- name: check user
  become: yes
  become_user: someusername
  become_method: su
  become_flags: '--login'
  vars:
    ansible_become_pass: <Password of 'ubuntu' in OP's case>
  shell: whoami

如果您使用一个用户(具有权限)登录到主机sudo并想要以另一个用户(可能没有密码)的身份执行某些操作,请在上面添加以下行:

become_exe: 'sudo -p "Password: " su -'

相关内容