2016-12-05 117 views
2

我已經設置了一個用戶david誰擁有sudo權限。我可以ssh進入箱子並執行sudo操作,如apt-get install。當我嘗試使用Ansible的「成爲特權升級」來做同樣的事情時,我得到一個permission denied錯誤。因此,一個簡單的劇本可能是這樣的:Ansible非root sudo用戶和「成爲」特權升級

simple_playbook.yml:

--- 
- name: Testing... 
    hosts: all 
    become: true 
    become_user: david 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 

我跑這個劇本用下面的命令:

ansible-playbook -i inventory simple_playbook.yml --ask-become-pass 

這讓我輸入密碼的提示,這是我給,我得到以下錯誤(略):

fatal: [123.45.67.89]: FAILED! => {... 
failed: E: Could not open lock file /var/lib/dpkg/lock - open (13: 
Permission denied)\nE: Unable to lock the administration directory 
(/var/lib/dpkg/), are you root?\n", ...} 

爲什麼我收到PERMIS錫永否認?

信息

我運行Ansible 2.1.1.0和我針對Ubuntu的16.04盒。如果我使用remote_usersudo選項按Ansible < V1.9,它工作得很好,就像這樣: remote_user: david sudo: yes

更新

本地和遠程用戶名是相同的。爲了得到這個工作,我只需要指定become: yes(參見@ techraf的回答):

+0

什麼是用戶名,您在使用執行第一ssh連接遠程用戶? –

+0

我認爲成爲用戶是root,改爲root大衛,它會起作用。 –

+0

@helloV - 我也嘗試添加'成爲真正的'任務,結果是一樣的。 – DavB

回答

11

Why am I getting permission denied?

因爲APT 需要 root權限(請參閱錯誤:are you root?),你作爲david運行的任務。

每下列設置:

become: true 
become_user: david 
become_method: sudo 

Ansible變得david使用sudo方法。它基本上在前面運行它的Python腳本sudo david


the user 'david' on the remote box has sudo privileges.

這意味着david使用sudo -executable改變爲子進程的有效用戶(命令)可以執行的命令(部分或全部)。如果沒有給出用戶名,則該過程作爲root帳戶運行。

比較這兩個命令的結果:

$ sudo whoami 
root 
$ sudo david whoami 
david 

回到APT問題,你(從CLI)以及Ansible(使用您的帳戶與SSH連接)需要運行:

sudo apt-get install sqlite3 

不是:

sudo david apt-get install sqlite3 

將顯示非常確切的消息Ansible將失敗。


以下劇本將默認升級到root用戶:

--- 
- name: Testing... 
    hosts: all 
    become: true 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

感謝@techraf的解釋。如果我使用'remote_user:david'成爲:true',它似乎工作正常。在這種情況下這些設置是否正確? – DavB

+0

@DavB'remote_user'與'become'開始的參數沒有直接關係。它是你在'ssh @'命令中使用的''。在你的一個評論中,你說你在客戶端和服務器上使用同一個用戶'david',因此你可以使用'ssh '連接。在這種情況下'remote_user:david'有**無效**。你可以包括它,你可以刪除它。沒有什麼會改變。問題出在'become_user:david'上。只要。 – techraf

+1

如果**您使用名爲'davb'(或任何非david')的帳戶在您的(客戶端)機器上運行Ansible,則需要'remote_user:david' **。 – techraf

1

remote_userdavid。用--ask-pass調用腳本並給予david的密碼。如果david沒有無密碼sudo,那麼您也應該用--ask-become-pass來調用它。

- name: Testing... 
    hosts: all 
    remote_user: david 
    become: true 
    become_method: sudo 

    tasks: 
    - name: Just want to install sqlite3 for example... 
     apt: name=sqlite3 state=present 
+0

謝謝,但我不明白你的意思。我已經'成爲:真正'指定(和'成爲_method:sudo')。你能澄清嗎? – DavB

+0

@helloV我也有類似的問題關於ansible [here](https://stackoverflow.com/questions/48724920/copy-files-to-remote-servers-but-in-a-directory-which-belongs-to-一些其他用戶),我不知道我正在做什麼錯誤,無論是'成爲'或'become_user'。想看看你能幫忙嗎? – user1950349