Ansible如何在不启用become: true的情况下运行含sudo的脚本?
解决方法
方案1:给目标用户配置指定命令的免密sudo权限
这是最稳妥的方式,让脚本内的sudo命令无需输入密码即可执行,无需修改脚本本身。
先通过Ansible配置sudoers规则(此步骤需become: true,仅用于完成配置,后续运行安装脚本仍以普通用户身份执行):
- name: 配置普通用户免密执行xrdp安装相关sudo命令 become: true lineinfile: path: /etc/sudoers.d/xrdp-installer line: '{{ ansible_user }} ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/apt, /usr/bin/dpkg, /usr/bin/grep, /usr/bin/echo, /usr/bin/cp' create: yes mode: 0440 validate: 'visudo -cf %s'
上述命令列表是xrdp安装脚本中常用的sudo操作,你可以根据脚本实际内容调整免密命令范围,避免过度授权。完成配置后,直接运行你原有的安装脚本任务即可,脚本内的sudo命令会自动执行。
方案2:修改脚本,让sudo从标准输入读取密码
如果不想配置免密sudo,可以修改脚本内所有sudo命令为sudo -S,让sudo接受标准输入的密码。然后在Ansible任务中通过管道传递密码:
先将用户的sudo密码存储在Ansible加密变量中(推荐用ansible-vault加密),再修改任务:
- name: 运行xrdp安装脚本 shell: echo "{{ sudo_password }}" | ./xrdp-installer-1.4.2.sh chdir: ~/ environment: TERM: xterm # 避免部分脚本依赖终端环境报错
注意:此方式需要确保脚本内所有sudo命令都添加-S参数,若脚本中sudo命令较多,修改成本较高,且密码传递存在一定安全风险。
方案3:用Ansible expect模块模拟交互式输入
Ansible的expect模块可模拟终端交互,自动输入sudo密码:
先确保目标机器安装expect工具,再编写任务:
- name: 安装expect工具(若未安装) become: true apt: name: expect state: present - name: 运行xrdp安装脚本并自动输入sudo密码 expect: command: ./xrdp-installer-1.4.2.sh chdir: ~/ responses: "\[sudo\] password for {{ ansible_user }}:": "{{ sudo_password }}" timeout: 300 # 根据脚本实际运行时长调整超时时间
此方案无需修改脚本或配置免密sudo,但依赖expect工具,且需准确匹配sudo的密码提示字符串(不同系统提示可能略有差异,需根据实际情况调整响应匹配规则)。
内容的提问来源于stack exchange,提问作者Taylan Yuksel
相关产品推荐
相关产品推荐

