【问题标题】:Ansible non-root sudo user and "become" privilege escalationAnsible 非 root sudo 用户和“成为”权限提升
【发布时间】:2016-12-05 21:28:58
【问题描述】:

我设置了一个用户 david 的盒子,他拥有 sudo 权限。我可以通过 ssh 进入盒子并执行像 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 机器。如果我按照 Ansible remote_user 和 sudo 选项,它可以正常工作,如下所示: remote_user: david sudo: yes

更新

本地和远程用户名相同。为了让它工作,我只需要指定become: yes(见@techraf的回答):

【问题讨论】:

  • 用户名是什么,你用来执行第一个 ssh 连接的远程用户?
  • 我认为成为用户是root,换成root而不是david,就可以了。
  • @helloV - 我也尝试在任务中添加“成为真的”,结果是一样的。
  • @Raul Hugo - 远程和本地计算机上的用户名都是“david”。如果我删除 'become_user' 它可以工作,那是因为它默认为 root (根据文档)。但是我想以“大卫”的身份运行它,而不是“根”。
  • @DavB 查看我的更新答案。

标签: ansible sudo privileges


【解决方案1】:

为什么我的权限被拒绝?

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

根据这些设置:

become: true
become_user: david
become_method: sudo

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


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

这意味着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 消息。


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

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

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

【讨论】:

  • 感谢@techraf 的解释。如果我使用remote_user: davidbecome: true,它似乎工作正常。这些设置在这种情况下是否正确?
  • @DavB remote_user 与以become 开头的参数没有直接关系。它是您在命令ssh <user>@<server> 中使用的<user>。在您的一个 cmets 中,您说您在客户端和服务器上都使用相同的用户 david,因此您连接到 ssh <server>。在这种情况下,remote_user: david没有效果。您可以包含它,也可以删除它。什么都不会改变。问题在于become_user: david。仅限。
  • 您需要remote_user: david 如果您使用名为davb(或david以外的任何帐户)在您的(客户端)计算机上运行Ansible。
  • @DavB 我已经在第一句话中以粗体字回答了这个问题。如果您使用不同于 root 的用户运行 APT 包管理器,您会收到一条错误消息。这就是 APT 的编写方式。如果您不喜欢它,请不要使用它。您可以在没有 APT 的情况下安装软件,但您必须手动处理所有事情。
  • 您是否阅读了您正在评论的答案? Unix 中没有“root 权限”之类的东西。进程以 root 身份或其他用户身份运行。
【解决方案2】:

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

【讨论】:

  • 谢谢,但我不明白你的意思。我已经指定了become: true(和become_method: sudo)。你能澄清一下吗?
  • @helloV 我在 ansible here 上也有类似的问题,我不确定 becomebecome_user 有什么问题。想看看你能不能帮忙?
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多