拿去,自动化且像程序管理员那样思考着的框架

多年来,我一直在写关于各种DevOps工具的文章,尽管它们很棒,但很明显大部分都是从开发者设计中得出的。这并不是什么问题,因为以编程的方式接近配置管理才是关键。不过,直到我开始接触Ansible,我觉得它就像是一个系统管理员,反应迅速,但我第一次接触时,并不清楚如何来开始。

进入原始状态

一开始,之所以对我来说是如此困难,是因为它对如何配置服务器/客户关系非常灵活,我不知道我应该做什么。Ansible并不关心如何设置SSH系统,它会利用你的任何配置。需要考虑的有一下两件事:

1、Ansible需要通过SSH连接到客户端计算机;

2、一旦连接起来,Ansible需要提升特权,这样它就可以配置系统,安装包等等。

但是,连接到远程计算机和提升允许特权这两件事是相当棘手的。出于某种原因,当您在远程计算机上安装一个代理并让Chef或Puppet处理特权升级时,它就不会那么脆弱了。不是Ansible不安全,相反,它的安全决策在你的手中。

接下来,我将列出一堆潜在的配置,以及它们各自的优缺点。这并不是一个详尽的清单,但它应该让你沿着正确的思路思考在你的环境中什么是理想的。我还应该注意到,我不会提到像Vagrant 这样的系统,尽管Vagrant很好地建立了一个快速测试和开发的基础设施,但它和一堆服务器的差别太大了,以至于这些考虑都太不一样了。

一些SSH场景

1)在anUNK config中输入远程计算机作为root用户的密码。

这种设置的“优点”是,它消除了对特权升级的需求,并且在远程服务器上不需要其他用户帐户。但是,这种便利的代价是不值得的。首先,大多数系统不会在不更改默认配置的情况下让您作为root用户使用SSH。其次,将根密码放在可安装机器上的纯文本配置文件中,这是不明智的。

2)作为普通用户进入远程计算机,使用存储在anconfig配置中的密码。

这种情况的优点是,它不需要大量的客户机配置。大多数用户在默认情况下都可以使用SSH,所以应该能够使用凭证并登录。我个人不喜欢在配置文件中以纯文本格式存储密码的想法,但至少它不是根密码。如果使用此方法,请务必考虑如何在远程服务器上进行权限升级。我知道我还没有讨论升级特权,但是如果你在配置文件中有一个密码,这个密码可能会被用来获得sudo访问。这样一来,你不仅泄露了远程用户的帐号,还可能破坏整个系统。

3)以普通用户的身份进入远程计算机,使用具有空密码的密钥对进行身份验证。

这消除了在配置文件中存储密码,至少在部分过程中是这样。没有密码的密钥对并不理想,在我的内部网络中,我通常使用一个没有密码的密钥对来自动化许多需要认证的cron作业。这不是最安全的选项,因为一个折中的私钥意味着不受限制地访问远程用户的帐户。

4)以普通用户的身份进入远程计算机,用密码匙对密钥对进行身份验证。

这是处理远程访问的一种非常安全的方式,因为它需要两个不同的身份验证因素:私钥,passphrase来解密它。如果你只是在交互地运行,这可能是理想的设置。当您运行一个命令时,它应该提示您使用私钥的密码,然后它将使用密钥对登录到远程系统。同样的方法可以通过使用标准密码登录而不是在配置文件中指定密码,但是如果你要在命令行上输入密码,为什么不添加一个密钥对提供的保护层呢?

5)使用passphrase保护的密钥对SSHing,但使用ssh - agent“解锁”私钥。

这并不完美地完成了无人管理的、自动化的、可操作的命令,但它确实使一个相当安全的设置变得方便。ssh- agent程序对密码进行身份验证,然后使用该身份验证来建立将来的连接。当我使用Ansible,这就是我想要做的事情。我通常使用没有密码的密钥对,但这通常是因为我在我的家庭服务器上工作。

在配置SSH环境时,还有一些需要注意的事项。也许您可以限制可使用的用户(这通常是你的本地用户名),因此只能从特定的IP地址登录。也许你的服务器可以生活在一个不同的子网中,在强大的防火墙之后,所以它的私钥很难远程访问。也许可以使用的服务器本身没有安装SSH服务器,所以根本就没有进入的访问权限。Ansible的优点之一就是,它使用SSH协议进行通信,这是一个协议并且你们可以通过长时间调整到适合你们的系统。我不太喜欢宣扬什么是“最佳实践”,因为在现实中,最好的做法是考虑你的环境,选择适合你情况的设置。

特权升级

一旦你的服务器通过SSH连接到它的客户端,它就需要能够升级特权。如果你选择上面的选项1,那么您已经是根了,这是一个没有意义的问题。但是由于没有人选择选项1,你就需要考虑客户端计算机上的普通用户如何获得访问权。Ansible支持各种各样的升级系统,但在Linux中,最常见的选择是sudo和su。就像SSH一样,有一些情况就需要考虑,尽管还有其他的选择。

1)与su升级特权

对于红帽/ CentOS用户,本能是使用su来获得系统访问。默认情况下,这些系统在安装期间配置根密码,你需要输入它并获得特权访问。使用su的问题在于,尽管它允许你的访问远程系统,但是它也允许你访问远程系统。另外,su程序没有密钥对身份验证的能力,所以密码必须是交互式的,或者存储在配置文件中。因为它实际上是根密码,所以把它存储在配置文件中是不理想的。

2)与sudo升级特权。

这就是Debian / Ubuntu系统的配置方式。正确组中的用户可以访问sudo命令并使用root权限执行它。从对话框中,仍然存在密码存储或交互式键入的问题。由于在配置文件中存储用户的密码似乎不那么可怕,我想这是使用su的一个步骤,但如果密码被破坏,它仍然提供对系统的完全访问。

3)升级sudo权限,在sudoers文件中配置NOPASSWD。

它并不完美,因为它提供了对用户帐户的无限制的根访问权限,并且不需要任何密码。但是,当我这样做并使用没有密码的SSH密钥对,它使我能够很容易地自动化易操作的命令。我将再次说明,尽管它很方便,但它并不是一个非常安全的想法。

4)将权限升级到sudo,并在特定的可执行文件上配置NOPASSWD。

这个想法可能是安全与方便的最佳折中方案。基本上,如果您知道您计划使用的是什么,那么您可以将NOPASSWD特权送给远程用户,因为它将需要使用这些应用程序。它可能会有些混乱,因为在很多事情上,anable都使用Python,但是如果有足够的尝试和错误,你应该能够解决问题。这是额外的多余工作,但确实消除了一些明显的安全漏洞。

实施你的计划

一旦你决定如何处理一个身份验证和权限升级,你就需要设置它。在你精通了anable之后,你可能可以使用工具本身来帮助“引导”新客户,但首先,手动配置客户端是很重要的,这样你就知道发生了什么。熟悉自动化过程要比从开始就开始自动化要好得多。

我曾经写过关于SSH密钥对的文章,在网上有无数的文章用来设置它。从你的计算机上得到的短版本外观如下所示:

如果你选择在创建密钥对时不使用口令,那么最后的步骤应该在不输入密码或密码的情况下进入远程计算机。

为了在sudo中设置权限升级,你需要编辑sudoers文件。你不应该直接编辑文件,而是使用:

这将打开sudoers文件,并允许你安全地进行更改(当你保存时,它会检查错误,因此你不会意外地将自己锁在一个typo中)。文件中有一些示例,因此你应该能够弄清楚如何分配你想要的确切权限。

一旦配置好了,就应该手动进行测试,然后才能将它引入图片中。尝试向远程客户端SSHing,然后使用你选择的任何方法尝试升级特权。一旦你配置好了连接的方式,就可以安装该插件了。

安装Ansible

由于这个可编程的程序只安装在一台计算机上,所以它并不是一件很麻烦的事情。红帽/ubuntu系统的打包安装方式略有不同,但也不是很难。

在红帽/CentOS中,首先启用了EPEL存储库:

然后安装Ansible:

在Ubuntu中,首先启用anenable PPA:

然后安装Ansible:

配置Ansible主机文件

如果你不给它一个电脑列表,那么这个系统就无法知道你想要它控制哪些客户。这个列表非常简单,它看起来是这样的:

括号部分是指定组。单个主机可以在多个组中列出,并且可以引用单个主机或组。这也是一个配置文件,比如明文密码将被存储,如果这是你计划的设置。配置文件中的每一行配置一个主机,并且您可以在ansible_host语句之后添加多个声明。一些有用的选项是:

Ansible库

你们还应该注意到,虽然安装程序更加复杂,但在你第一次进入这个世界的时候,你可能不会做一些事情,但是这个程序确实提供了一种加密密码的方法。一旦你熟悉Ansible,你想把它投入生产,将这些密码存储在一个加密的Ansible拱顶是理想的。但我还是建议先在非生产环境中开始使用无密码的方法。

测试你的系统

最后,你应该测试你的系统以确保你的客户端连接。ping测试将确保计算机能够ping每台主机:

在运行之后,你应该会看到一个消息,每个定义的主机都显示一个ping:如果ping成功的话,会发出一个ping信号。这实际上并不是测试身份验证,只是网络连接。试试这个测试你的认证:

你应该可以看到webservers组中每个主机的正常运行时间命令的结果。

如果你没有从上面的示例中得到你想要的,那就查看Ansible更多的文档吧!

作者:Shawn Powers

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180108G0I5N400?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区