我已经设置了一个具有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_user
和sudo
选项,则按照Ansible< v1.9,它工作正常,像这样:
remote_user: david
sudo: yes
更新
本地和远程用户名是相同的。为了实现这一点,我只需要指定become: yes
(参见@ techraf的回答):
答案 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_user
是david
。使用--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