我正在尝试通过 Ansible 运行程序的 shell 脚本安装程序。
该脚本做了一些假设,即在需要时通过 sudo 获取非 sudo 命令的登录用户和 root 用户。
但是,在 Ansible 中,我只能使用相同的脚本来执行以下两件事之一:
不使用
become: true
运行 -> 结果: 脚本的 sudo 部分失败(“需要终端来读取密码;使用 -S 选项从标准输入读取或配置askpass 帮助程序”)
使用
become: true
运行 -> 结果: 脚本的非 sudo 部分中断,当我实际需要它们使用登录用户时,使用“root”作为用户
有没有办法让 Ansible 的行为与典型的 shell 类似(当脚本调用
root
时,纯粹根据需要变成 sudo
)?
正如评论中已经提到的,这与 Ansible 本身无关,而是与 管理
sudo
访问有关。
假设用户
ansible_user
是本地组wheel
的成员,或者在某个文件中拥有自己的sudoers
条目
/etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
ansible_user ALL=(ALL) NOPASSWD: ALL
或
/etc/sudoers.d/ansible_user
ansible_user ALL=(ALL) NOPASSWD: ALL
一个最小的示例手册
---
- hosts: localhost
become: false
gather_facts: false
tasks:
- shell:
cmd: who; id; sudo id
register: result
- debug:
var: result
通过
执行sshpass -p ${PASSWORD} ansible-playbook --user 'ansible_user' --ask-pass who.yml
将导致输出
ASK [debug] **********************************************************************************************
ok: [localhost] =>
result:
changed: true
cmd: who; id; sudo id
delta: '0:00:00.110247'
end: '2023-10-10 09:00:00.110247'
failed: false
msg: ''
rc: 0
start: '2023-10-10 09:00:00.000000'
stderr: ''
stderr_lines: []
stdout: |-
ansible_user pts/0 2023-10-10 09:00 (192.0.2.1)
uid=123456789(ansible_user) gid=1234560513(domain users) groups=1234560513(domain users) <omitted>
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
在所示示例中,用户
ansible_user
根本不存在于本地,由于系统已连接并加入域,因此 /etc/passwd
、/etc/group
或 /etc/shadow
中没有条目。