如何按任务或任务组切换用户?


160

Ansible剧本中经常出现的主题是,我经常必须使用sudo特权(sudo: yes)执行命令,因为我想为特定用户执行此命令。理想情况下,我宁愿使用sudo切换到该用户并正常执行命令。因为这样我就不必清理通常的post命令,例如整理目录。这是我的一本剧本的摘录:

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
- name: change perms
  file: dest={{ dst }} state=directory mode=0755 owner=some_user
  sudo: yes

理想情况下,即使需要sudo才能以该用户身份运行我也可以以其他用户身份运行命令或命令集。

Answers:


241

使用Ansible 1.9或更高版本

Ansible用途becomebecome_user以及become_method指令实现权限升级。您可以将它们应用于整个剧本或剧本,可以将它们设置在随附的剧本中,也可以针对特定任务进行设置。

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user

您可以become_with用来指定如何实现特权升级,默认值为sudo

该指令对于使用它的块的范围有效(示例)。

有关其他示例,请参阅主机和用户;有关更详细的文档,请参阅成为(特权升级)

除了任务范围becomebecome_user指令外,Ansible 1.9还添加了一些新变量和命令行选项,可以在没有显式指令的情况下在播放期间设置以下值:

从Ansible 2.0.2.0开始,下面描述的较早的sudo/ sudo_user语法仍然有效,但是弃用通知指出:“此功能将在以后的版本中删除。”


先前的语法(自Ansible 1.9起已弃用并计划删除):

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user

4
要从变量中指定sudo_user,请在变量模板周围使用引号,如下所示- sudo_user: "{{ ansible_ssh_user }}"否则会出现yaml语法错误。
Sumeet Pareek

接得好。我试图尽可能地匹配OP对问题的表述,但是我同意使用变量插值将是最常见的选择。
Brett 2015年

5
从Ansible 1.9开始,它是become系统而不是“ sudo *”。
AndiDog

2
1.9+语法“成为”是正确的。您可能还需要检查“ become_method”,因为“ su”有时可能比默认的“ sudo”更好,具体取决于您的系统设置。
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @Brett,这是否意味着此之后的后续任务将由运行,some_user而不是remote_user用于连接主机的原始用户运行,是否正确?
JohnnyQ '16

43

在Ansible 2.x中,您可以使用blockfor任务组:

- block:
    - name: checkout repo
      git:
        repo: https://github.com/some/repo.git
        version: master
        dest: "{{ dst }}"
    - name: change perms
      file:
      dest: "{{ dst }}"
      state: directory
      mode: 0755
      owner: some_user
  become: yes
  become_user: some user

26

在Ansible> 1.4中,您实际上可以在任务级别指定一个远程用户,该用户应允许您以该用户身份登录并执行该命令,而无需求助于sudo。如果您不能以该用户身份登录,那么sudo_user解决方案也将起作用。

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

请参阅http://docs.ansible.com/playbooks_intro.html#hosts-and-users


对于没有sudo权限的情况,这是最佳解决方案
Darrel Holt


1

您可以指定become_method覆盖在中设置的默认方法ansible.cfg(如果有),并且可以将其设置为中的一种sudo, su, pbrun, pfexec, doas, dzdo, ksu

- name: I am confused
  command: 'whoami'
  become: true
  become_method: su
  become_user: some_user
  register: myidentity

- name: my secret identity
  debug:
    msg: '{{ myidentity.stdout }}'

应该显示

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.