Ansible非root sudo用户和“成为”特权升级

时间:2016-12-05 21:28:58

标签: ansible sudo privileges

我已经设置了一个具有sudo权限的用户david的框。我可以进入框中并执行像apt-get install这样的sudo操作。当我尝试使用Ansible的“成为权限升级”做同样的事情时,我收到permission denied错误。所以一个简单的剧本可能看起来像这样:

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", ...}

为什么我被拒绝许可?

其他信息

我正在运行Ansible 2.1.1.0并且我的目标是Ubuntu 16.04。如果我使用remote_usersudo选项,则按照Ansible< v1.9,它工作正常,像这样: remote_user: david sudo: yes

更新

本地和远程用户名是相同的。为了实现这一点,我只需要指定become: yes(参见@ techraf的回答):

2 个答案:

答案 0 :(得分:20)

  

为什么我被拒绝许可?

因为APT 需要 root权限(请参阅错误:are you root?),并且您正在以david运行任务。

根据这些设置:

become: true
become_user: david
become_method: sudo

Ansible使用david方法成为sudo。它基本上在前面运行带有sudo david的Python脚本。

  

远程控制台上的用户'david'具有sudo权限。

这意味着david可以使用sudo执行命令(部分或全部) - 可执行文件来更改子进程的有效用户(命令)。如果未提供用户名,则此过程将作为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

答案 1 :(得分:3)

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