You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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密码):

  1. 登录到目标主机(host1/host2),执行sudo visudo
  2. 添加一行配置:ubuntu ALL=(ALL) NOPASSWD: ALL
  3. 保存退出即可。

如果你的场景必须要求输入sudo密码才能执行,可以在运行Playbook时加上-K(或--ask-become-pass)参数,Ansible会提示你输入sudo密码。

内容的提问来源于stack exchange,提问作者user13456401

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:22:32