我的ansible playbooks中反复出现的主题是我经常必须使用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。
答案 0 :(得分:215)
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
。
该指令对使用它的块的范围有效(examples)。
有关其他示例,请参阅Hosts and Users;有关更详细的文档,请参阅Become (Privilege Escalation)。
除了任务范围的become
和become_user
指令之外,Ansible 1.9还添加了一些新变量和命令行选项,以便在没有显式指令的情况下在播放期间设置这些值:
become
/ become_user
指令。从Ansible 2.0.2.0开始,下面描述的较早的sudo
/ sudo_user
语法仍然有效,但弃用通知指出,“此功能将在以后的版本中删除。”
- name: checkout repo
git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
sudo: yes
sudo_user: some_user
答案 1 :(得分:32)
在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
答案 2 :(得分:22)
在Ansible> 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
答案 3 :(得分:7)
解决方案是将include
语句与remote_user
var一起使用(在那里描述:http://docs.ansible.com/playbooks_roles.html),但必须在playbook而不是任务级别完成。
答案 4 :(得分:1)
您可以指定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"
}