在Linux中用Ansible以root身份运行任务需通过become提权而非root直连;可在play级统一启用become: yes,或按task粒度控制;配合sudoers免密配置与权限参数确保安全可靠执行。

在 Linux 中使用 Ansible Playbook 以 root 身份运行任务,核心不是“用 root 登录”,而是让普通用户通过提权(如 sudo)获得 root 权限执行操作。生产环境普遍禁用 root 直接 SSH 登录,因此需合理配置 become 相关参数。
以下是最常用、最安全的几种配置方式:
在 Playbook 中启用提权执行
直接在 play 级别声明提权行为,适用于整个 play 的所有任务:
---
- name: Deploy with root privileges
hosts: webservers
remote_user: deployer # 连接时使用的普通用户(如 deployer)
become: yes # 启用提权(等价于 --become)
become_method: sudo # 提权方式,默认即 sudo,可省略
become_user: root # 提权后切换到的目标用户(默认 root,可省略)
tasks:
- name: Install nginx
yum:
name: nginx
state: latest✅ 关键点:
remote_user是登录用户,become: yes表示后续任务自动加sudo执行,无需手动写shell: sudo xxx。
按任务粒度控制是否提权
某些任务需要 root,有些只需普通权限(如读取用户家目录),可在单个 task 中单独设置:
tasks:
- name: Copy config to /etc (needs root)
copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
become: yes
- name: Write log to user dir (no privilege needed)
copy:
content: "deployed at {{ ansible_date_time.iso8601 }}"
dest: /home/deployer/deploy.log
# 不写 become,默认用 remote_user 身份执行避免密码交互的提权配置
若目标主机要求 sudo 输入密码,可通过以下方式免密:
-
在被控端配置
/etc/sudoers(推荐用visudo编辑):deployer ALL=(ALL) NOPASSWD: ALL
或更安全地限制命令范围:
deployer ALL=(root) NOPASSWD: /bin/systemctl start nginx, /usr/bin/yum
-
Playbook 中显式声明提权密码(不推荐明文,应配合
--ask-become-pass):ansible-playbook site.yml -K # 运行时提示输入 sudo 密码
注意文件权限与拷贝路径
即使提权成功,copy 或 template 模块向 /etc/、/usr/ 等系统目录写入时,仍需确保:
-
dest路径存在且父目录有写权限(提权后由 root 创建目录没问题); - 若
src是本地文件,确保 Ansible 控制机上有读权限; - 使用
owner/group/mode显式设权限,例如:copy: src: app.conf dest: /etc/myapp/conf.d/app.conf owner: root group: root mode: '0644'
不复杂但容易忽略


















