Ansible会以哪个用户身份运行我的命令?

48

背景

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

基本上,我已经厌倦了手动维护服务器(在背景中尖叫),我决定找到一种方法使成为服务器管理员更加舒适。这就是我发现Ansible的时候。非常棒,对吧?肯定比为我想要自动化的每个东西编写bash脚本(更大声尖叫)要好得多。

问题是什么?

我有很多麻烦,无法确定我的Ansible playbook将作为哪个用户运行某些内容。我还需要能够指定某些任务将作为哪个用户运行的能力。以下是一些具体用例:

以另一个用户身份克隆存储库:

我使用此目的是从另一个名为bill的用户(只能使用sudo运行我制作的启动节点服务器脚本,而不是可以对所有命令使用sudo的root或我的用户)运行我的node.js webapp。为此,我需要Ansible的git模块克隆我的git repo作为bill。我该怎么做呢?

知道Ansible如何获取root权限:

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

最后的请求

我已经搜索了Ansible文档,做了一些(我认为非常彻底的)Google搜索,并且通常尝试自己解决问题,但这些信息仍然难以理解。

我对Ansible非常新手,尽管它大多数情况下都很简单,但如果我能够确切地了解Ansible运行的方式,它运行的用户以及在不同时间和地点指定要使用的用户的方式/位置,那么我将受益匪浅。

非常感谢您提前的支持。


正如您可能已经注意到的那样,我使用了“python”标签,这可能不是立即清晰的。我这样做的原因是因为所有Ansible模块中非常大的一部分都是用Python编写的。 - Michael
4个回答

51
您可能会发现阅读Ansible文档网站上的主机和用户部分很有用:http://docs.ansible.com/playbooks_intro.html#hosts-and-users。简而言之,Ansible将在playbook中以remote_user变量指定的用户身份运行所有命令(假设您使用的是ansible >= 1.4,在此之前使用user)。您还可以在每个任务中单独指定此变量,以防某个任务需要以特定用户身份运行。在任何playbook/task中使用sudo: true来使用sudo运行它。如果不想使用root用户,则可以使用sudo_user变量来指定要sudo的用户。实际上,我发现将playbook作为具有sudo特权的“deploy”用户运行最容易。我设置了SSH密钥,因此我可以作为“deploy” SSH登录到任何主机而无需输入密码。这意味着我可以在不使用密码甚至需要使用sudo的情况下运行playbook。我使用同一用户执行诸如克隆git repos和启动/停止服务等操作。如果服务需要以较低特权用户身份运行,则让init脚本处理。对于CentOS,一个快速的Google搜索可找到一个node.js init.d脚本:https://gist.github.com/nariyu/1211413。以这种方式处理事情有助于保持简单,我喜欢这一点。希望能对您有所帮助。

2
我还发现了这个链接: https://gist.github.com/marktheunissen/2979474我觉得它非常有帮助,虽然有点长,但我推荐阅读它,因为它真正简单易懂地解释了Ansible的工作原理。 - Michael
这是上述已弃用链接的最后一个快照之一:https://web.archive.org/web/20170716062706/http://docs.ansible.com:80/ansible/playbooks_intro.html - Darko Maksimovic

7

我的两分钱:

  1. Ansible使用您的本地用户(例如Mike)通过ssh连接到远程机器。(这需要Mike能够ssh到该机器)
  2. 从那里,如果需要,它可以切换到远程用户。
  3. 如果需要并且允许Mike,则还可以sudo。如果未指定用户,则通过您本地机器上的~/.ansible.cfg选择root。
  4. 如果在sudo参数中提供了remote_user,则像第3点一样,它将不使用root,而是使用该用户。

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

Playbook定义将在所选清单中属于每台计算机的哪些角色运行。

我建议您阅读Ansible最佳实践,以了解如何设置您的基础架构。

顺便说一句,既然您没有涉及到Ansible使用的特定模块,并且您的问题与Python无关,因此我认为您的问题没有使用Python标签的用处。


如果你使用其他工具(例如vagrant)来管理ansible,我认为这会变得很复杂。在这种情况下,它似乎会使用不同的用户(例如“ubuntu”)进行ssh访问,但是以root身份运行许多任务。尽管如此,特权升级功能对我来说仍然有效。 - rcreswick

4

2
这个可以运行(顺便说一句,变成:true 真的是你所需要的全部),但是它很快就会变得重复。如果我有 10 个任务,其中 7 个需要 sudo,我需要重复这个过程 7 次。有没有更简洁的方法来做到这一点? - davegallant
将您需要完成的所有任务放入单独的 .yml 文件中,并使用 become 命令进行包含。 - Daniel
链接已经失效... - emi

0

我注意到当前的答案有点过时并且受到链接失效的影响。

默认情况下,Ansible将作为您当前的用户进行SSH:

https://docs.ansible.com/ansible/latest/user_guide/intro_getting_started.html#connecting-to-remote-nodes

Ansible使用SSH协议与远程机器通信。默认情况下,Ansible使用本地OpenSSH,并像SSH一样使用当前用户名连接到远程机器。
但是,您可以通过以下方式覆盖默认设置:
- 在命令行中传递-u参数 - 在清单文件中设置用户信息 - 在配置文件中设置用户信息 - 设置环境变量
但是,您必须确保存在到该用户的SSH路由。我更常见的维护用户级所有权的方法是使用become(root),然后使用chown -R jdoe:jdoe /the/file/path
在我的ansible 2.12版本中,我发现唯一能够更改用户的方法是在play级别指定become: yes作为选项。这样,我就可以作为非特权默认用户进行SSH连接。此用户必须在远程主机上启用无密码sudo,这是我可以使我的VPS最安全的方式。从这里,我可以使用become_user从任意命令任务切换到另一个用户。
像这样:
- name: Getting Started
  gather_facts: false
  hosts: all
  become: yes  # All tasks that follow will become root.
  tasks:
  - name: get the username running the deploy
    command: echo $USER
    become_user: trubuntu  # From root we can switch to trubuntu.

如果用户允许SSH访问您的远程设备,则为“victor”,而不是当前用户,则“remote_user: victor”在play级别上有一个位置,毗邻“become: yes”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接