Ansible 如何切换每个任务或一组任务的用户?
ansible剧本中经常出现的一个主题是,我经常必须以sudo权限执行命令(Ansible 如何切换每个任务或一组任务的用户?,ansible,Ansible,ansible剧本中经常出现的一个主题是,我经常必须以sudo权限执行命令(sudo:yes),因为我想为某个用户执行命令。理想情况下,我更愿意使用sudo切换到该用户并正常执行命令。因为这样我就不必执行我通常的post命令清理,比如chowning目录。以下是我的一本剧本中的一个片段: - name: checkout repo git: repo=https://github.com/some/repo.git version=master dest={{ dst }} sudo:
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
理想情况下,我可以作为不同的用户运行命令或命令集,即使它需要sudo来su给该用户。解决方案是使用
include
语句和remote\u user
var(在此处描述:),但必须在playbook而不是任务级别执行。使用Ansible 1.9或更高版本
Ansible使用been
、been\u user
和been\u方法
指令实现权限提升。您可以将它们应用于整个剧本或剧本,在包含的剧本中设置它们,或为特定任务设置它们
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
become: yes
become_user: some_user
您可以使用been_with
指定如何实现权限提升,默认为sudo
该指令在使用它的块的范围内有效()
有关其他示例和更详细的文档,请参阅
除了任务范围内的been
和been_user
指令外,Ansible 1.9还添加了一些新变量和命令行选项,以便在没有明确指令的情况下,在播放期间设置这些值:
- 对于等效的
/变成
指令变成用户
- 可以按主机或组设置
sudo
/sudo\u用户
语法仍然有效,但弃用通知指出,“此功能将在未来版本中删除。”
以前的语法,自Ansible 1.9起已弃用并计划删除:
在Ansible>1.4中,您实际上可以在任务级别指定一个远程用户,该用户应允许您以该用户的身份登录并执行该命令,而无需求助于sudo。如果您不能以该用户的身份登录,那么sudo_用户解决方案也会起作用
---
- hosts: webservers
remote_user: root
tasks:
- name: test connection
ping:
remote_user: yourname
请参见Ansible 2.x中的,您可以对任务组使用
块
:
- 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
您可以指定
been_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"
}
要从变量中指定sudo_用户,请在变量模板周围使用引号,如-
sudo_用户:“{{ansible\u ssh_user}}”
,否则会出现yaml语法错误。很好。我试图尽可能地匹配OP对问题的表述,但我同意使用变量插值将是最常见的选择。从Ansible 1.9开始,它取代了“sudo*”。1.9+语法表示“Been”是正确的。您可能还希望选中“变成方法”,因为“su”有时可能比默认的“sudo”更好,这取决于您的系统设置。添加了新的Ansible变量和命令行选项,以在播放期间设置这些值
@Brett那么这是否意味着在此之后的后续任务将由某个用户运行,而不是由用于连接主机的原始用户远程用户运行,对吗?对于上述用例,这不是一个好的解决方案。然而,我很长时间没有意识到这个解决方案。我想我只能包含角色。这是在你没有sudo特权的情况下最好的解决方案
TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
"msg": "some_user"
}