2015-12-02 147 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