【问题标题】:What user will Ansible run my commands as?Ansible 将以什么用户身份运行我的命令?
【发布时间】:2014-03-07 09:40:18
【问题描述】:

背景

我的问题看起来很简单,但很快就会变得复杂起来。

基本上,我真的厌倦了手动维护我的服务器(背景中的尖叫声),我决定是时候找到一种方法让服务器管理员的工作变得更适合生活了。就在那时我发现了 Ansible。很棒吧?确实比为我想要自动化的所有内容编写 bash 脚本(大声尖叫)

有什么问题?

我很难确定我的 Ansible playbook 将以什么用户身份运行某些事情。我还需要能够指定某些任务将以什么用户身份运行。以下是一些具体的用例:

以其他用户身份克隆 repo:

我这样做的目的是从另一个用户那里运行我的 node.js webapp,我们称之为 bill(只能使用 sudo 来运行我制作的启动节点服务器的脚本,而不是可以对所有命令使用 sudo 的 root 或我的用户)。为此,我需要能够让 Ansible 的 git 模块将我的 git 存储库克隆为 bill。我该怎么做?

了解 Ansible 将如何获得根:

据我了解,您可以通过定义“用户”和 playbook 文件的开头来设置 Ansible 将连接到您维护的服务器的用户。这是我不明白的:如果我告诉它通过我的用户名 joe 连接,并要求它通过 apt 模块更新包,它将如何获得 root 权限? Sudo 通常会提示我输入密码,我更愿意保持这种方式(出于安全考虑)。

最终请求

我搜索了 Ansible 文档,做了一些(我认为是彻底的)谷歌搜索,通常只是试图自己弄清楚,但这些信息仍然让我难以理解。

我对 Ansible 非常陌生,虽然它大多是直截了当的,但如果我能准确了解 Ansible 的运行方式、它在哪些用户上运行,以及我可以如何/在何处指定在不同情况下使用的用户,我会受益匪浅次。

提前谢谢你

【问题讨论】:

  • 您可能已经注意到,我用python 标记了这个,这可能不是很清楚。我这样做的原因是因为所有 Ansible 模块中有很大一部分是用 python 编写的。

标签: node.js linux git ansible


【解决方案1】:

您可能会发现阅读 Ansible 文档站点上的主机和用户部分很有用:

http://docs.ansible.com/playbooks_intro.html#hosts-and-users

总之,ansible 将以remote_user 变量中指定的用户身份运行 playbook 中的所有命令(假设您在此之前使用的是 ansible >= 1.4, user)。您也可以在每个任务的基础上指定此变量,以防任务需要以特定用户身份运行。

在任何剧本/任务中使用sudo: true 以使用sudo 运行它。如果您不想使用 root,请使用 sudo_user 变量指定要 sudo 的用户。

在实践中,我发现以具有 sudo 权限的 deploy 用户身份运行我的剧本最容易。我设置了我的 SSH 密钥,这样我就可以在不使用密码的情况下以 deploy 的身份通过 SSH 连接到任何主机。这意味着我可以在不使用密码的情况下运行我的剧本,甚至可以在需要时使用sudo

我使用同一个用户来做一些事情,比如克隆 git repos 和启动/停止服务。如果服务需要以较低权限的用户身份运行,我让 init 脚本来处理。在 Google 上快速搜索 node.js init.d 脚本后,我们发现了这个适用于 CentOS:

https://gist.github.com/nariyu/1211413

以这种方式做事有助于保持简单,这是我喜欢的。

希望对您有所帮助。

【讨论】:

  • 我还发现了这个:gist.github.com/marktheunissen/2979474 我发现它很有帮助,虽然它很长,但我建议阅读它,它确实以一种易于理解的方式分解了 Ansible 的工作原理。
【解决方案2】:

我的 2 美分:

  1. Ansible 使用您的本地用户(例如 Mike)通过 ssh 连接到远程计算机。 (这要求 Mike 能够通过 ssh 连接到机器)
  2. 如果需要,它可以从那里更改为远程用户
  3. 如果需要并且如果 Mike 被允许,它也可以 sudo。如果未指定用户,则将通过您本地计算机上的 ~/.ansible.cfg 选择 root。
  4. 如果您为 remote_user 提供 sudo 参数,那么就像 no.3 一样,它不会使用 root,而是使用该用户。

您可以通过playbooks指定不同的情况和不同的用户或sudo。

剧本定义了哪些角色将在属于所选清单的每台机器上运行。

我建议您阅读Ansible best practices,了解有关如何设置基础架构的一些说明。

哦,顺便说一句,因为您没有提到 ansible 使用的特定模块,而且您的问题与 python 无关,所以我发现您的问题没有任何使用 python 标签。

【讨论】:

  • 我认为如果您使用其他工具(例如 vagrant)来管理 ansible,这会很复杂。在这种情况下,它似乎使用不同的用户(例如,'ubuntu')进行 ssh 访问,但以 root 身份运行许多任务。不过,提权功能对我有用。
【解决方案3】:

请注意,Ansible>=1.9 使用权限提升命令,因此您可以在需要时以该次要用户的身份执行任务并创建资源:

- name: Install software
  shell: "curl -s get.dangerous_software.install | sudo bash"
  become_user: root

http://docs.ansible.com/ansible/become.html#become-privilege-escalation

【讨论】:

  • 这行得通(顺便说一句:真的是你所需要的一切)但它会很快重复。如果我有 10 个任务并且 7 个需要 sudo,我需要这个 7 次。有没有更简洁的方法来做到这一点?
  • 把你需要做的所有任务放到一个单独的.yml文件中,并用become包含进来。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多