如何在Ansible中以Ubuntu用户身份执行含sudo权限的命令?
Ansible中实现普通用户sudo执行命令的正确方式
首先纠正你Playbook里的一个小错误:become参数是用来控制是否开启权限提升的布尔值(yes/no),而不是指定要切换到的用户。你想要的用ubuntu用户通过sudo获取root权限执行命令的场景,需要这样配置:
一、实现sudo apt-get update -y && sudo apt-get upgrade -y的Playbook
- hosts: all tasks: - name: Update apt cache and upgrade all packages become: yes # 这一步就对应你手动操作时的`sudo`,开启权限提升,默认切换到root用户 apt: upgrade: yes update_cache: yes autoremove: yes # 可选,清理无用的依赖包
解释:
- 假设你已经在Ansible inventory中配置了用ubuntu用户连接目标主机(比如
ansible_user=ubuntu),当Playbook执行到这个任务时,Ansible会以ubuntu用户身份登录,然后通过sudo切换到root来执行apt更新操作,和你手动执行的命令效果完全一致。 - 这里不需要额外添加"sudo"关键字,
become: yes就是Ansible实现sudo提权的标准方式,不会自动开启,必须显式声明。
二、实现sudo apt-get install docker的Playbook
注意:Ubuntu官方软件源中的Docker包名称是docker.io,不是docker,所以正确的Playbook如下:
- hosts: all tasks: - name: Install Docker package become: yes apt: name: docker.io state: present update_cache: yes # 可选,确保安装前更新缓存
如果需要安装Docker官方源的包(比如docker-ce),你需要先添加官方源和GPG密钥,但这是额外步骤,如果你只是用默认源的包,上面的写法就足够了。
三、关键前提条件
要让这个配置正常工作,你需要确保目标主机上的ubuntu用户拥有sudo权限,并且可以免密码执行sudo命令(因为Ansible是非交互式执行的,无法手动输入sudo密码):
- 登录到目标主机(host1/host2),执行
sudo visudo - 添加一行配置:
ubuntu ALL=(ALL) NOPASSWD: ALL - 保存退出即可。
如果你的场景必须要求输入sudo密码才能执行,可以在运行Playbook时加上-K(或--ask-become-pass)参数,Ansible会提示你输入sudo密码。
内容的提问来源于stack exchange,提问作者user13456401
相关产品推荐
相关产品推荐

