如何切换每个任务或一组任务的用户?
在我可靠的剧本中反复出现的主题是,我经常必须执行带有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使用become
, become_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
。
该指令对于其使用的块的范围有效( 示例 )。
有关其他示例,请参阅主机和用户 ;有关更详细的文档,请参阅成为(权限升级) 。
除了任务范围的become
和become
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而不是任务级别完成。