如何根据任务或任务集切换用户?

rgr*_*erg 147 ansible

在我的ansible playbooks中反复出现的主题是我经常必须使用sudo privileges(sudo: yes)执行命令,因为我想为某个用户执行此操作.理想情况下,我宁愿使用sudo切换到该用户并正常执行命令.因为那时我不需要做我常用的post命令清理,例如chowning目录.这是我的一本剧本的摘录:

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

理想情况下,我可以将命令或命令集作为不同的用户运行,即使它需要sudo给该用户.

Bre*_*ett 226

使用Ansible 1.9或更高版本

Ansible使用become,become_userbecome_method指令来实现权限升级.您可以将它们应用于整个游戏或剧本,将它们设置在附带的剧本中,或者将它们设置为特定任务.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user
Run Code Online (Sandbox Code Playgroud)

您可以使用它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
Run Code Online (Sandbox Code Playgroud)

  • 从Ansible 1.9开始,它是[`become`系统](https://docs.ansible.com/ansible/become.html)而不是"sudo*". (5认同)
  • 要从变量中指定sudo_user,请在变量模板周围使用引号,例如 - "sudo_user:"{{ansible_ssh_user}}"`或者您会得到yaml语法错误. (4认同)
  • "成为"的1.9+语法是对的.您可能还想检查"become_method",因为"su"有时可能比默认的"sudo"更好,具体取决于您的系统设置. (2认同)

Arb*_*zar 35

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


trc*_*den 23

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

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname
Run Code Online (Sandbox Code Playgroud)

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


小智 7

一个解决方案是使用var include语句remote_user(在那里描述:http://docs.ansible.com/playbooks_roles.html),但必须在playbook而不是任务级别完成.