如何切换每个任务或一组任务的用户?

在我可靠的剧本中反复出现的主题是,我经常必须执行带有sudo权限的命令( sudo: yes ),因为我想为某个用户执行此操作。 理想情况下,我宁愿使用sudo切换到该用户并正常执行命令。 因为那样我就不需要像通常的chowning目录那样去执行我通常的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才能提供给用户。

随着Ansible 1.9或更高版本

Ansible使用becomebecome_userbecome_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 become_user指令,Ansible 1.9添加了一些新的variables和命令行选项来设置这些值在剧本的持续时间在没有明确的指令:

  • 命令行选项的等效become / become_user指令。
  • 可以为每个主机或组设置的连接特定variables 。

从Ansible 2.0.2.0开始,下面描述的旧的sudo / sudo_user语法仍然有效,但弃用声明指出:“此function将在未来版本中删除”。


先前的语法,从Ansible 1.9开始弃用并计划删除:

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

在Ansible> 1.4中,实际上可以在任务级别指定一个远程用户,该用户应允许您以该用户的身份login,并执行该命令而不诉诸sudo。 如果您不能以该用户身份login,那么sudo_user解决scheme也可以工作。

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

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

在Ansible 2.x中,您可以使用该block进行一组任务:

 - 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 

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