Salt Stack 入门 - 另一个用 Python 构建的配置管理系统
前几天我自豪地穿着一件 Salt Stack 衬衫,这时我的女儿问我:“什么是 Salt Stack?” 我首先解释了它解决的问题。如果您有多台服务器,并且想要对这些服务器执行操作,则需要登录到每台服务器,然后在每台服务器上一次执行这些操作。它们可能是相当简单的任务,例如重启服务器或检查服务器已运行多长时间。或者,您可能想要执行更复杂的操作,例如安装软件,然后根据您自己的特定标准配置该软件。您可能还想添加用户并为其配置权限。
但是,如果您有十台甚至 100 台服务器怎么办?想象一下,一次登录到每台服务器,在这些 100 台机器上发出相同的命令,然后在所有 100 台机器上编辑配置文件?真是太麻烦了!仅仅更新用户密码策略就需要几天时间,而且很可能引入错误。如果您只需键入一个命令即可一次更新所有服务器,那会怎么样?解决方案?Salt Stack!
像我的女儿一样,您可能没有听说过 Salt Stack (http://saltstack.org),但您可能熟悉 Puppet (http://puppetlabs.com) 和 Chef (http://opscode.com)。Salt 是一个类似的工具,但它是用 Python 编写的,在资源和要求方面相对轻量级,而且更容易使用(在我看来)。Salt 使用 0MQ (http://www.zeromq.org) 通信层,这使其速度非常快。它也是完全开源的,根据 Apache2 (https://apache.ac.cn/licenses/LICENSE-2.0) 许可证获得许可,并拥有一个充满活力和富有成效的社区。
目前也没有计划发布精简版的社区版本或功能更丰富的付费企业版。使用 Salt,您获得的版本与其他人获得的版本相同——无论您是否付费。企业版有计划,但它只会减少前沿性,并将接受更高数量的测试和质量保证,并且可能还会包括培训。
Salt、Puppet 和 Chef 等工具允许您一次在多台机器上发出命令,并安装和配置软件。Salt 有两个主要方面:配置管理和远程执行。
Salt Stack 是一个命令行工具。没有任何东西可以用鼠标点击,反馈以文本形式返回在屏幕上。这很好。它保持了简洁,而且大多数服务器无论如何都不包含图形用户界面。(注意:在本文中,我交替使用术语 Salt 和 Salt Stack。在此上下文中,它们的意思相同。)
在本文中,我介绍了 Salt 附带的两个工具。第一个是远程执行,尽管如果您想使用配置管理或远程执行,则没有任何明确的界限或任何不同的方式与 Salt 交互。这允许您登录到主机器,然后一次在一台或多台其他机器上执行命令。使用 Salt,您只需在主机器上键入一次命令,它就会在每台机器上执行,甚至在目标机器组上执行。
其次,Salt 能够存储配置指令,然后指示其他机器遵循这些指令,例如安装软件、对软件进行配置更改,然后报告安装的进度和成功或失败。
稍后,我将演示如何使用 Salt 在一台甚至 1,000 台机器上安装额外的软件包,然后仅通过发出一个命令来配置该软件包。
安装 SaltSalt 是一个不断发展的有机体。可能在您阅读本文时,某些事情可能已经发生了变化。您始终可以在此处找到最新的文档:http://docs.saltstack.org/en/latest/index.html。
在安装 Salt 之前,您需要一些先决条件
-
一台 Linux 服务器。
-
对该服务器的 sudo 或 root 访问权限。
-
连接到该服务器的互联网连接。
-
了解服务器的 IP 地址(可以是公共地址或私有地址)。
即使 Salt 旨在与多台服务器交互,但在本教程中,您实际上可以在一台机器上完成所有操作。
使用您的软件包管理器安装 Salt,并按照 Salt Docs 中针对您的特定发行版的安装指南进行操作 (http://docs.saltstack.org/en/latest/topics/installation/index.html)。您还需要 sudo 或 root 权限才能使用 Salt 并安装这些软件包。
使用软件包管理器或从源代码安装的好处一直是在线和茶水间争论的焦点。根据您的发行版,您可能必须从源代码安装软件包,而不是使用软件包管理器。
如果您想从源代码安装,可以在 Salt Project 的 GitHub 存储库中找到最新的 Salt 源代码文件 (https://github.com/saltstack/salt)。
在按照说明安装 salt-master 和 salt-minion 后,希望一切顺利,您没有收到任何错误。如果事情不太顺利,通常可以从 Salt Stack 邮件列表 (http://saltstack.org/learn/#tab-mailinglist) 和 #salt IRC 频道快速获得支持。
配置您的主服务器和 Minion术语 master 和 minion 指的是控制器和受控者。master 本质上是所有 minion 的中央协调器——类似于客户端/服务器配置,其中 master 是服务器,而 minion 是客户端。
Minion 配置在本教程中,我介绍了在同一台机器上发出 salt-master 和 salt-minion 命令。如果您要配置多台机器,请选择一台作为主服务器,所有其他机器都将是 minion。master 或 minion 的选择权在于您,并且有很多理由将一台机器配置为主服务器。接下来,我将解释如何将一台设置为 master,另一台或多台设置为 minion。
Salt 的配置文件位于 /etc/salt 中。默认情况下,这些文件名为 minion 和 master。如果您在同一台机器上安装了 salt-master 和 salt-minion,您将看到两个各自的文件,master 和 minion。
您首先需要告诉您的 minion 如何定位和与您的 master 通信。即使您在同一台服务器上运行两者,您仍然需要告诉您的 minion 您的 master 在哪里。
-
使用您最喜欢的文本编辑器,打开 minion 文件。
-
取消注释行
# master: salt
,方法是删除#
并将salt
替换为您的 master 的 IP 地址。现在它应该看起来像这样:master: your.ip.address.here
。(如果您在同一台机器上本地执行此操作,则可以添加 127.0.0.1。) -
给您的 minion 起一个昵称。找到行
#id:
,再次删除#
并添加一个名称id: 1st-Salt-Minion
。(这个名字可以是您想要的任何名字。) -
使用
sudo salt-minion -d
重新启动您的 minion,以便它读取新的配置设置。-d
标志守护进程化该进程并在后台启动 minion,因此您仍然可以访问命令行以发出更多命令。
现在您的 minion 知道您的 master 在哪里,是时候让他们相互验证身份了。Salt 使用公钥加密来保护 master 和 minion 之间的通信。您需要通过在 master 上接受 minion 的密钥来通知 master 和 minion 他们可以相互信任。
使用 salt-key
命令接受您的 minion 的密钥。Salt 会自动处理为您生成这些密钥,因此您只需接受您想要的 minion 即可。
-
键入
salt-key -L
以获取所有待处理、已接受和已拒绝的密钥的列表。 -
您应该看到
1st-Salt-Minion
(或您为您的 minion 选择的任何 ID)的未接受密钥。 -
使用
sudo salt-key -a 1st-Salt-Minion
接受此密钥。
现在您有了一个 salt-master 和一个 salt-minion,并且 minion 和 master 相互信任,您可以通过从 master 发出测试 ping 命令来检查连接。如果您的 master 可以与您的 minion 通信,这将返回“True”。键入 salt '*' test.ping
,它应该返回
>{1st-Salt-Minion: True}
请注意,通配符 '*'
目标是每个 minion,并且由于您只有一个,这基本上是无关紧要的(它只是比键入 salt '1st-Salt-Minion' test.ping
更快)。
如果您收到来自您的 minion 的“True”响应,则您已成功安装 Salt Stack 并配置了您的 master 和 minion 以进行正确通信。
如果您没有收到响应,您可能需要重新启动您的 master 和 minion,而不使用 -d
(守护进程)标志,以便您可以观察输出。有关更多信息,请参阅 Salt 文档,网址为 http://docs.saltstack.org/en/latest/topics/configuration.html。
Salt 命令语法涉及命令、目标和操作。因此,对于此示例,'*'
目标是所有内容(它是一个通配符),而 test.ping
是操作。
您现在可以在任何连接和经过身份验证的 minion 上执行任何可用命令。重要提示:这些命令必须在目标 minion 上可用才能执行它们。例如,像这样的命令
sudo salt '*' cmd.run "service apache2 restart"
仅适用于将 Apache Web 服务器称为 apache2 并且已安装 Apache Web 服务器的发行版。对于其他发行版,您需要发出命令
sudo salt '*' cmd.run "service httpd restart"
其他一些示例可能包括查询服务器已运行多长时间。您可以使用以下命令执行此操作
sudo salt '*' cmd.run "uptime"
例如,如果您的 master 上安装了 Apache Bench,但 minion 上没有安装,则命令
sudo salt '*' cmd.run "ab -n 10 -c 2 http://www.google.com:80/index.html"
如果您尝试在 minion 上执行它,则会失败,因为 minion 上未安装 Apache Bench。
这里的可能性实际上是无限的。您可以一次重启所有机器、更新系统软件并从一个终端检查机器的健康状况,而无需登录到每台机器并独立发出这些命令。
您还可以根据您选择的标准来定位特定组。有关更多选项,请参阅 http://saltstack.org 上的 -G
标志文档。
您很少需要再次登录到 minion。所有配置和执行都可以远程、快速且同时处理。
现在您已经安装了 Salt 并且可以执行远程命令,为什么就此止步呢?Salt 功能的第二部分来自 Salt 附带的配置管理工具。
配置管理如果您以前没有使用过任何类型的配置管理系统,这里有一个简单的示例。假设您有一组通常为每个 Web 服务器安装的配置和软件包。您可以将这些配置指令保存在小型文本文件中,然后指示您的服务器安装这些软件包并根据您的喜好配置它们,每次您创建新服务器时都这样做。您还可以使用配置管理来保持所有服务器在创建后保持更新,并响应软件包或新配置中的更改。
让我们安装 libpam-cracklib 软件包,以便您可以为用户密码添加额外的要求。我选择这个软件包是因为它几乎适用于任何连接到互联网的服务器。它允许您设置有关长度的额外密码要求,并且它要求用户的密码包含特殊字符或数字。您可以轻松替换您想要的任何特定软件包。但是,这些示例确实要求该软件包在您的系统软件包管理器中可用。
配置指令的存储默认情况下,Salt 的配置管理指令和文件保存在 /srv/salt 目录中。这是所有配置文件以及您要复制到任何 minion 的文件的位置。Salt 还包含一个文件服务器系统,作为配置管理功能的一部分。但是,Salt 不会触及您主服务器的系统文件,因此请不要担心;所有配置管理都在 /srv/salt 目录中进行。
默认情况下,Salt 对其模板文件使用 PyYAML (http://pyyaml.org) 语法,但也提供了许多其他模板语言。请务必遵循 YAML 的正确格式化技术,其中涉及两个空格而不是制表符。我发现在线 YAML 解析器 (http://yaml-online-parser.appspot.com) 在解决 YAML 文件的语法问题时非常宝贵。
启用配置管理要启用 Salt 中的配置管理功能,您需要再次编辑您的 master 配置文件。在 /etc/salt 中,打开您的 master 文件并找到引用 file_roots
的行。在默认配置中,这大约在第 156 行。现在,通过从以下行中删除 #
来取消注释此指令
file_roots:
base:
- /srv/salt
这告诉 Salt 在哪里找到您的配置管理文件。根据您安装 Salt 的方式,您可能需要创建 /srv/salt 目录。
创建顶级文件或“路线图”基本配置文件称为顶级文件,它位于 /srv/salt 目录中。让我们现在创建一个。此文件提供其他文件的映射,可用于为所有服务器设置基本配置。再次使用您最喜欢的文本编辑器,在 /srv/salt 目录中创建一个 top.sls 文件。您可以将此文件视为每个 minion 不同方向的路线图。在您的 top.sls 文件中,添加以下行
base:
'*'
- servers
base
指令让 Salt 知道此配置是基本配置,可以应用于所有机器。通配符 '*'
目标是每台机器。- servers
指令是一个任意名称,可让您识别该指令的用途。随意选择对您有意义的东西。此条目还引用了一个特定的配置文件,您现在将创建该文件以安装 libpam-cracklib。
保存 top.sls 文件后,在 /srv/salt 目录中创建一个名为 servers.sls 的新文件。此文件将保存您的特定配置,包括要安装的软件包的名称以及对配置文件的引用。在新的 servers.sls 文件中,添加以下内容
libpam-cracklib:
pkg:
- installed
第一行是软件包的名称,具体说明您的软件包管理器如何引用它。例如,在基于 aptitude 的软件包管理器发行版中,Apache HTTP 服务器称为 apache2,但在基于 yum 的软件包管理系统中,称为 httpd。确保根据您使用的软件包管理器使用软件包的正确名称。您可以使用 Salt 称为 grains 的东西来定位特定的软件包名称。有关在 SLS 文件中使用 grains 来定位特定于发行版的系统的更多信息和高级示例,请参阅文档 (http://salt.readthedocs.org/en/latest/topics/tutorials/states_pt3.html#using-grains-in-sls-modules)。
第 2 行和第 3 行告诉 Salt 如何处理此软件包。对于此示例,您希望安装它。要删除软件包,您只需将 - installed
更改为 - removed
。请记住,间距非常重要!在第二行,pkg:
前面有两个空格,在第三行,- installed
前面有四个空格。如果您收到任何错误,请通过在线 YAML 解析器检查您的语法。
为了安装 libpam-cracklib 软件包,您只需要此文件的前三行。您可以停在这里,libpam-cracklib 将与您的软件包管理器提供的默认配置一起安装。然后,您需要登录到安装它的机器并根据您的特定需求进行配置。这违背了使用配置管理的目的,Salt 也为此提供了解决方案。
Salt 可以充当安全文件服务器并将文件复制到远程 minion。在同一个 servers.sls 文件中,添加以下行
/etc/pam.d/common-password:
file:
- managed
- source: salt://servers/common-password
- require:
- pkg: libpam-cracklib
注意第 4 行;这是您告诉 Salt 您的特定文件位置的地方,之后的行告诉 Salt 此文件需要什么软件包。行 - source: salt://
映射到您 master 上的 /srv/salt 目录。
保存 servers.sls 文件后,在 /srv/salt 下创建一个名为 servers 的新目录。您将在此处存储 libpam-cracklib 的配置文件。
当您安装软件包和配置文件时,您可能希望首先在测试服务器上安装它们,然后根据您的喜好配置它们。然后,您可以将配置文件复制到您的 /srv/salt 位置。这样,您可以在将其部署到多台服务器之前验证配置是否正常运行。
现在您的配置将可用于 Salt,您可以将此配置与安装 libpam-cracklib 软件包一起放置在每个 minion 上。您的 /srv/salt 目录现在应该看起来像这样
/srv/salt
top.sls
servers.sls
/servers
common-password
我在这里使用 libpam-cracklib 作为示例,但此技术适用于任何具有相关配置文件的软件。例如,您可以轻松修改您的 Apache httpd.conf 文件以包含您的服务器主机名并配置虚拟主机。
在所有 sls 文件就位且配置文件准备就绪后,最后一步是告诉 Salt 远程配置您的机器。state.highstate
命令是触发此同步的原因。使用之前的语法来定位所有机器,从命令行输入以下内容
sudo salt '*' state.highstate
希望在短暂的时间后,您的 minion 将返回一个成功,如下所示
>>
State: - pkg
Name: libpam-cracklib
Function: installed
Result: True
Comment: Package libpam-cracklib installed
Changes: wamerican: {'new': '7.1-1', 'old': ''}
cracklib-runtime: {'new': '2.8.18-3build1', 'old': ''}
libcrack2: {'new': '2.8.18-3build1', 'old': ''}
libpam-cracklib: {'new': '1.1.3-7ubuntu2', 'old': ''}
----------
State: - file
Name: /etc/pam.d/common-password
Function: managed
Result: True
Comment: File /etc/pam.d/common-password updated
Changes: diff: ---
+++
@@ -22,7 +22,7 @@
# pam-auth-update(8) for details.
# here are the per-package modules (the "Primary" block)
-password requisite pam_cracklib.so retry=3 minlen=8 difok=3
+password requisite pam_cracklib.so retry=3 minlen=14 difok=3 dcredit=1 ucredit=1 lcredit=1 ocredit=1
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512
# here's the fallback if no module succeeds
password requisite pam_deny.so
如您所见,Salt 安装了 libpam-cracklib 软件包,然后将 common-password 文件从 master 复制到 minion 的 /etc/libpam-cracklib 目录中。
这只是一个 minion 的相当简单的示例,但如果您曾经安装过基于 LAMP 的 Web 服务器,请想象一下,仅通过使用 Salt 的配置管理,您可以节省多少时间。将这些设置存储在文本文件中使您可以快速复制和创建相同的服务器。
总结您现在可以一次在多台机器上执行远程命令,并将您的配置存储在易于维护的文本文件中。您还可以安装特定于服务器类型的软件包。
通过最初的少量努力,您可以在软件包下载到每台机器所需的时间内,使用您自己的特定配置创建一台或多台服务器。Salt 也不会按顺序执行这些命令。这些命令主要在每台机器上同时执行,如果一个 minion 恰好失败,其他 minion 将继续进行。
安装 Salt 可以在以后获得丰厚的回报,因为它允许您基于经过测试且可重复的配置创建特定用途的服务器。
访问 Salt Project 页面了解更多详情,并务必查看邮件列表、用户贡献的文档和示例的链接。您会发现社区非常热情,并渴望为您遇到的任何问题提供帮助。