我在配置 Ansible 和 sudo 以允许我通过 SSH 进入服务器并以另一个用户身份运行命令时遇到了麻烦。
我已经浏览过下面的问题/答案以及此处的 Ansible 文档: http://docs.ansible.com/intro_inventory.html
但我仍然无法让它工作。
请有人能给我指明正确的方向。
参考:
https://stackoverflow.com/questions/24743085/ansible-ssh-as-one-user-and-sudo-as-another Ansible:对不同的主机使用不同的 sudo 用户
我正在尝试这样做:
server-01 client-01
--------- -----------
foo ----> ssh ---> foo
bar - sudo as root user
使用 Ansible,从 server-01 连接到 client-01
使用用户 foo,然后使用 sudo 以用户 bar 身份运行命令,用户 bar 设置为能够运行任何命令。
但是,我不确定问题出在哪里,是 sudo 还是 Ansible。我认为问题出在 sudo 上,但我不确定问题出在哪里。
这个 ansible 命令有效:
[foo@server-01 ~]$ **ansible client-01 -m raw -a "touch /var/tmp/testfile" --ask-sudo-pass**
sudo password: ********* ( password for foo user )
client-01 | success | rc=0 >>
这个不起作用:
[foo@server-01 ~]$ ansible client-01 -m raw -a "touch /etc/testfile" --ask-sudo-pass
sudo password: ********* ( password for foo user )
client-01 | FAILED | rc=1 >>
touch: cannot touch `/etc/testfile': Permission denied
我为用户 foo 在 server-01 和 client-01 之间设置了无需密码的 SSH 身份验证,并且一切正常。
[foo@server-01 ~]$ id
uid=96(foo) gid=96(foo) groups=96(foo)
[foo@server-01 ~]$ su - foo
Password:
[foo@server-01 ~]$
[foo@server-01 ~]$
[foo@server-01 ~]$ ssh client-01
Last login: Thu Jan 15 16:32:05 2015 from server-01
[foo@client-01 ~]$
这是我的设置:
server-01: /etc/ansible/hosts
-------------------------------------
[clients]
client-01 ansible_sudo=true ansible_ssh_user=foo ansible_sudo_user=bar
client-01: /etc/sudoers
-------------------------------------
[root@client-01 ~]# cat /etc/sudoers
#
root ALL=(ALL) ALL
bar ALL=(ALL) ALL
foo ALL=(bar) NOPASSWD: ALL
在目标服务器 (client-01) 上,我可以测试 sudo。我认为 sudo 是不起作用的部分,但由于这个原因,我无法设置任何 Ansible Playbook。
[root@client-01 ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@client-01 ~]# su - bar
[bar@client-01 ~]$ sudo -l
[sudo] password for bar:
User bar may run the following commands on this host:
(ALL) ALL
[bar@client-01 ~]$ sudo touch /etc/tempfile
[bar@client-01 ~]$ ls -alp /etc/tempfile
-rw-r--r-- 1 root root 0 Jan 15 17:08 /etc/tempfile
[bar@client-01 ~]$ sudo rm /etc/tempfile
[bar@client-01 ~]$ exit
logout
[root@client-01 ~]# su - foo
[foo@client-01 ~]$ sudo -l
User foo may run the following commands on this host:
(bar) NOPASSWD: ALL
[foo@client-01 ~]$ sudo touch /etc/tempfile
[sudo] password for foo:
Sorry, user foo is not allowed to execute '/bin/touch /etc/tempfile' as root on client-01.
[foo@client-01 ~]$ exit
logout
也许这是失败的线路:
foo ALL=(bar) NOPASSWD: ALL
我感谢您的帮助。
答案1
- 你能正常通过 SSH 进入盒子并运行这两个命令吗?鉴于唯一的区别是你尝试的路径
touch
,我猜这是一个文件系统问题,而不是 ansible 问题。
更新:
现在尝试将(bar)
Sudoers 文件中的 替换为,看看是否有效?ALL