2016-12-05 106 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