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

Dav*_*avB 16 privileges sudo ansible

我已经设置了一个david具有sudo权限的用户的盒子.我可以进入框中并执行sudo操作apt-get install.当我尝试使用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
Run Code Online (Sandbox Code Playgroud)

我使用以下命令运行此playbook:

ansible-playbook -i inventory simple_playbook.yml --ask-become-pass
Run Code Online (Sandbox Code Playgroud)

这给了我一个密码的提示,我给出了,我得到以下错误(缩写):

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", ...}
Run Code Online (Sandbox Code Playgroud)

为什么我被拒绝了?

附加信息

我正在运行Ansible 2.1.1.0并且我的目标是Ubuntu 16.04.如果我按照Ansible <v1.9 使用remote_usersudo选项,它可以正常工作,如下所示: remote_user: david sudo: yes

更新

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

tec*_*raf 28

为什么我被拒绝了?

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

根据这些设置:

become: true
become_user: david
become_method: sudo
Run Code Online (Sandbox Code Playgroud)

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


远程盒子上的用户'david'具有sudo权限.

这意味着david可以使用sudo-executable 执行命令(部分或全部)来更改子进程(命令)的有效用户.如果没有给出用户名,则此过程将作为root帐户运行.

比较这两个命令的结果:

$ sudo whoami
root
$ sudo david whoami
david
Run Code Online (Sandbox Code Playgroud)

回到APT问题,您(从CLI)以及Ansible(使用您的帐户使用SSH连接)需要运行:

sudo apt-get install sqlite3
Run Code Online (Sandbox Code Playgroud)

不:

sudo david apt-get install sqlite3
Run Code Online (Sandbox Code Playgroud)

这将失败显示Ansible非常确切的消息.


默认情况下,以下playbook将升级为root用户:

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

  tasks:
    - name: Just want to install sqlite3 for example...
      apt: name=sqlite3 state=present
Run Code Online (Sandbox Code Playgroud)

  • 您是否阅读了您正在评论的答案?Unix 中没有“root 权限”这样的东西。进程要么以 root 身份运行,要么以其他用户身份运行。 (2认同)

hel*_*loV 6

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
Run Code Online (Sandbox Code Playgroud)