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

err*_*ata 28 permissions sudo ansible

我正在尝试以与运行剧本的用户不同的用户身份运行特定的 Ansible 任务。我的.yml文件看起来像这样:

---

- hosts: staging_servers
  tasks:    
    - name: check user
      remote_user: someusername
      shell: whoami
Run Code Online (Sandbox Code Playgroud)

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

我还尝试像这样定义任务:

---

- hosts: staging_servers
  tasks:
    - name: check user
      sudo: yes
      sudo_user: someusername
      shell: whoami
Run Code Online (Sandbox Code Playgroud)

但是后来我收到“ Missing sudo password”错误,尽管sudoers文件中有一行说明someusername ALL=(ALL) NOPASSWD:ALLsudo在远程机器上发出命令,因为someusername没有要求我输入密码。

那么,我如何以不是hosts文件中定义的用户或root他自己的不同用户身份运行特定任务?

Cap*_*iel 23

你误解了那里的两个设置:

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

  • someusername ALL=(ALL) NOPASSWD:ALL是一个 sudo 配置,允许用户someusername在没有密码的情况下在任何主机中执行所有命令。它不允许任何人发出命令someusername

理想情况下,您会以正确的用户身份直接登录,这remote_user就是全部。但通常您只能以管理用户身份登录(例如ubuntu),并且必须以其他用户身份执行 sudo 命令(例如scrapy)。然后,您应该留给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
Run Code Online (Sandbox Code Playgroud)

  • 我知道了。非常感谢您澄清这一点!但是如何以特定用户身份运行特定任务呢? (2认同)
  • 请注意,“remote_user”默认为本地计算机中的当前用户——实际上就像 ssh 一样。 (2认同)
  • 正确的方法是让您的远程用户直接登录。 (2认同)

小智 23

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

sudo: yes
sudo_user: some_user
Run Code Online (Sandbox Code Playgroud)

变成(双关语):

become: yes
become_user: some_user
Run Code Online (Sandbox Code Playgroud)

在此处查看更多细节:https : //stackoverflow.com/a/22749788/402727

还要要执行的实际模块(例如commandshell之前编写它以使其生效。至少根据我的经验,如果我已经编写becomebecome_usershell模块之后它不能正常工作。

- name: Example user change
  become: true
  become_user: '{{ user }}'
  shell: |
    ...
Run Code Online (Sandbox Code Playgroud)


sta*_*tor 5

正如前书呆子已经指出的那样,现在你必须使用该become模块。此外,为了准确获得OP想要的内容,请使用subecome方法:

- name: check user
  become: yes
  become_user: someusername
  become_method: su
  become_flags: '--login'
  shell: whoami
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

become_exe: 'sudo -p "Password: " su -'
Run Code Online (Sandbox Code Playgroud)