2015-12-02 493 views
0

TL; DR:在执行所需的命令之前,有没有办法让Ansible执行“sudo su - ”(而不是“sudo su - root”)?在通过Ansible执行命令之前切换到root(使用“sudo su - ”)

我有一个远程服务器,我通常使用Ansible管理。问题是我有一个非常严格的命令列表,可以使用sudo执行。

幸运的是我实际上可以做“sudo su - ”来获得root shell,但是我找不到Ansible这样做的方法。

从我所能理解的,我可以成为根,但Ansible发布不适合我的“sudo su - root”。

我已经搞乱使用sudo并成为参数,但无法找到一个解决方案,它让我觉得它可能无法正常工作,所以这个问题是:

这是可行的?

+0

当然这是可行的。毕竟,Ansible是开源的。 –

+0

说,它看起来并不像代码运行'sudo su -',但它实际上运行着更像'sudo -S -p'的东西[sudo via ansible,key = randomjunkhere] password:' -u root/bin/sh -c“在这里运行的实际命令”' –

+0

...随机垃圾每次都在改变,所以你不能在sudoers文件中将它列入白名单。包装方法看起来更好。 –

回答

1

lib/ansible/utils/__init__.py,看到make_sudo_cmd功能,尤其是行:

sudocmd = '%s -k && %s %s -S -p "%s" -u %s %s -c %s' % (
    C.DEFAULT_SUDO_EXE, C.DEFAULT_SUDO_EXE, C.DEFAULT_SUDO_FLAGS, 
    prompt, sudo_user, executable or '$SHELL', pipes.quote('echo %s; %s' % (success_key, cmd))) 

现在,人们可能希望只是传递一个空字符串sudo_user通过你的剧本就足够;然而,在某些中间层,如果它的值是falsey(并且Python中的空字符串的确是假的),则默认为root。因此,您需要对此代码进行更为侵入式的修改。

一个选项(我认真考虑)是用你自己生成的命令的包装来代替DEFAULT_SUDO_EXE(在常量模块中,在这里给出为C)。另一种是用(sudo_user if (sudo_user and sudo_user != 'root') else '')代替sudo_user