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

在我的可操作剧本中反复出现的一个主题是,我经常必须执行具有 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 来通过 su 传递给该用户。

242641 次浏览

一个解决方案是使用 include语句和 remote_user变量(在这里描述: http://docs.ansible.com/playbooks_roles.html) ,但是它必须在剧本而不是任务级别上完成。

使用安赛波1.9或更高版本

安赛尔使用 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_user指令之外,Anble 1.9还增加了一些新的变量和命令行选项,以便在没有明确指令的情况下,为一场比赛的持续时间设置这些值:

从 Ansible2.0.2.0开始,下面描述的旧的 sudo/sudo_user语法仍然可以工作,但是弃用通知说,“这个特性将在以后的版本中删除。”


以前的语法,从 Anble 1.9开始就已经废弃,计划删除:

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

在 Anble > 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

在可视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

您可以指定 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"
}