介绍
本教程的目标是尽快让 Puppet 在 CentOS 7 上以独立模式启动并运行。
如果您想了解 Puppet 以及它对您有何用处,请继续阅读。 如果您已经确信并想开始安装 Puppet,请跳到下面的 本教程中使用的约定 部分。
为什么要使用木偶?
什么是木偶?
Puppet 是一种开源配置管理软件工具,允许组织从单个中央服务器控制多达数万个节点的精确配置。 Puppet 成熟且流行,并被世界各地的大型组织使用。 但是,在这种分布式客户端/服务器模型下安装 Puppet 可能很复杂,需要设置中央 Puppet 服务器及其与客户端节点的关系。
Puppet 拥有如此强大的海量云配置工具形象,知道 Puppet 也可以在“独立”模式下运行,在这种模式下手动运行以配置单个节点,您可能会感到惊讶。 在独立模式下,Puppet 是配置单个节点的绝佳工具。
如果您一直在手动配置 DigitalOcean Droplets(即 通过 SSH 连接到云服务器并在 Linux 命令 shell 中键入一系列命令),然后 Puppet 可以帮助您将该配置过程的所有知识嵌入到单个 Puppet 配置文件(或目录树)中,可以调用该文件来重新创建从头开始创建节点,或者在节点损坏时重新配置节点。
Puppet 不仅仅是一个美化的安装脚本管理器。 当 Puppet 运行时,它会检查节点的配置,识别节点配置与 Puppet 配置文件中指定的配置之间的任何差异,然后进行必要的更改以使节点进入指定状态。 这意味着它既可以用于配置节点,也可以用于修复它们。
为什么要使用配置管理工具?
我们可以确定安装软件的三个复杂程度:手动、脚本和基于配置管理。
- 在 手动安装 中,您通过 SSH 进入节点并向命令 shell 发出一系列命令来安装软件。
- 在 脚本安装 中,您创建一个脚本(例如 Ruby 脚本或 BASH 脚本)来安装软件并执行它。
- 在基于配置管理的安装中,创建节点所需状态的配置管理工具规范,配置工具将节点的状态与所需状态进行比较,并驱动节点进入所需状态。
应该避免手动安装,因为它是一种预自动化解决方案,它将所有安装知识嵌入到一个或多个工程师的头脑中,而不是一个文件中(除非工程师已经写下了安装程序)。
脚本安装比手动安装要好得多,但存在一个问题,如果你执行安装后损坏了一小部分,你无法使用脚本来修复损坏; 您必须从头开始并重新安装所有内容。
基于配置管理的安装是最好的解决方案。 配置管理工具将自动安装(安装脚本也是如此),但如果软件损坏,它也可用于修复软件。 它还可用于更改所需的配置,并将节点驱动到新的所需状态。
为什么要特别使用 Puppet?
截至 2014 年 8 月,市场上似乎有两种主要的配置工具:Puppet 和 Chef。 快速搜索显示,两者似乎都是成熟的工具,拥有忠实的追随者。 一个关键区别是 Puppet 更具声明性,而 Chef 更具程序性,这使得 Puppet 在损坏修复方面更具吸引力。 这里有一些比较文章。
- http://www.scriptrock.com/blog/puppet-vs-chef-battle-wages
- http://www.infoworld.com/d/data-center/puppet-or-chef-the-configuration-management-dilemma-215279
本教程不寻求进行全面比较。
雪花、宠物和牛
软件配置领域出现了一个比喻来描述服务器配置管理的三个复杂级别。 您可以处于雪花级别、宠物级别或牛级别。 以下是它的工作原理:
- 如果您不知道它是如何处于它所处的状态和/或您太紧张而无法对其进行任何更改,或者甚至触摸它以防它破裂,那么您的节点就是 snowflake。 如果它真的坏了,你就真的有麻烦了。 你的节点就像一片娇嫩的雪花。
- 你的节点是一个 pet 如果你确信如果它坏了你可以修复它,但是从头开始配置它的想法让你充满恐惧。 当您的宠物生病时,您会将其带到兽医处进行治疗。
- 您的节点是 牛头 如果配置它已经如此自动化,如果节点出现问题,使用自动配置工具从头开始重新配置它比尝试修复它更容易. 当你的一头牛生病时,你不会带它去看兽医; 你把它射在头上,然后得到一个新的。
比喻的目的是传达节点管理的“牛”视角。 大多数系统管理员习惯于将节点视为雪花或宠物,以至于在节点损坏时杀死节点的想法似乎很陌生。 然而,只需要几秒钟的思考,就可以改变一个人的观点,并意识到牛模型的强大。
- 文件系统已损坏? 没问题,只需杀死节点并使用 Puppet 从头开始重新创建它。
- 一个不起眼的软件突然停止工作? 没问题,只需杀死节点并使用 Puppet 从头开始重新创建它。
- 黑客侵入了您的系统并安装了 root 工具包? 没问题,只需杀死节点并使用 Puppet 从头开始重新创建它。
像牛一样对待你的节点可能是一个拐杖。 最终,最好找到损坏节点的根源并修复真正的问题,但与此同时,自动重建非常有效。
在三个安装级别中,脚本和配置管理安装都支持牛模型。 但是,配置管理模型也支持宠物模型。 在脚本模式下,如果要安装额外的软件,就必须从头开始。 在配置管理模型下,您可以修改现有节点。
Puppet 允许您从雪花模型转换为牛模型,并可以在方便时将您的牛视为宠物。
(注:作者不喜欢像牛这样对待任何动物,但牛的比喻确实可以很好地作为配置比喻。)
傀儡之路
配置节点的 Puppet 方式是在 Puppet 中配置所有内容。 有时这可能有点挑战,但几乎总是可以从 Puppet 中配置您想要的任何内容。
如果您承诺从 Puppet 中配置所有内容,那么您可以使用单个 Puppet 命令配置云中的任何节点,如果您能做到这一点,您就可以开始像对待牛一样对待云中的节点。 你可以远离雪花的心态,你可以采取一种策略,定期在你的云中挑选一个随机节点并使用 Puppet 将其拆除并重建它,只是为了向自己证明它并没有以某种方式变成雪花或宠物。
一旦您将所有配置信息体现到 Puppet 中,唯一阻止您将节点视为牛头的就是它是否包含数据库。 您必须在拆除节点之前保存数据库,并在重建节点后恢复它,但这是唯一的原因。
Puppet 不仅仅是一个配置工具。 它是一种简化节点安装、管理和修复的 devops 学科,它消除了管理节点云的大部分压力。
本教程中使用的约定
出于本教程的目的,一个名为:
mynode.example.com
将会被使用。 每当您在本教程中看到单词“mynode”或“example”时,您可以确定它们不是命令关键字,并且您必须替换您自己的名称。
除非另有说明,只要本教程说发出命令,就意味着在命令 shell 中发出它(例如 bash) 的 Droplet。
本教程假定您以 root 身份登录,因此您不必在每个命令前加上 sudo
。 如果您没有以 root 身份登录,您可以尝试在以下所有命令前加上 sudo
前缀(但这尚未经过测试)。
在本教程中,我们使用 cat
命令来创建和修改文件。 如果需要,欢迎您使用 nano
或其他文本编辑器。
创建一个液滴
如果您尚未创建要应用 Puppet 的 Droplet,请立即创建。 你可以创建任何类型的 Droplet,只要它是 CentOS 7 Droplet。
当您在 DigitalOcean Droplet 创建表单上指定新 Droplet 的主机名时,请务必在主机名表单字段中指定完全限定域名 (FQDN)。
Hostname = mynode.example.com
不要只指定“mynode”。
(您无需为新节点 mynode
配置 example.com
的 DNS 即可运行 Puppet,但如果您打算保留 Droplet,最好还是这样做,所以这是你的提醒!)
SSH 到您的 Droplet 作为根
从您使用以下命令工作的计算机的命令行以 root 身份通过 SSH 连接到新的 Droplet。
ssh root@mynode.example.com
如果您尚未将 DNS 配置为将域名指向节点,则需要改用节点的 IP 地址。
ssh root@xxx.xxx.xxx.xxx
安装木偶
下一步是安装 Puppet。 Puppet Labs 以免费的开源版本和单独的企业版本发布 Puppet。 在本教程中,我们将安装开源版本,它对任意数量的节点都是完全免费的。
Linux 安装软件 yum
让安装 Puppet 变得简单。 唯一的困难是 Puppet 默认不在 CentOS 的 yum 存储库列表中,所以我们必须先安装它,然后才能调用 yum
。 (如果您有 CentOS 5 或 CentOS 6,请将 7 更改为 5 或 6)。
rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
您可以使用以下命令确认 Puppet 存储库已安装:
yum repolist | grep puppet
这应该产生如下所示的输出:
puppetlabs-deps/x86_64 Puppet Labs Dependencies El 7 - x86_64 10 puppetlabs-products/x86_64 Puppet Labs Products El 7 - x86_64 70
现在使用 yum 安装 Puppet。 yes
命令(使用 | 传送到 yum
命令)使您无需回答来自 yum 的一系列问题。 该命令会导致大量活动,应该会产生 180 多行控制台输出。
yes | yum -y install puppet
测试 Puppet 是否已安装并使用以下命令。 输出应该只是一个简单的版本号,例如 3.6.2
。
puppet --version
设置主机名和 FQDN
如果未正确配置节点的主机名和完全限定域名 (FQDN) 设置,Puppet 将无法正常运行。 这是因为 Puppet 经常配置一个配置文件,该配置文件指定几个不同节点的配置。 Puppet 需要知道它在哪个节点上运行,以便它只能执行配置文件的相关部分。
要查看您的节点是否为 Puppet 正确配置,请执行以下两个命令:
facter | grep hostname facter | grep fqdn
facter
命令将单独显示键/值对列表,其中包含有关您的 Droplet 的数据。 这里只有两个键/值对很重要,所以我们使用 grep
来搜索相关的输出,应该如下所示:
hostname=mynode fqdn=mynode.example.com
如果值的 mynode 部分不正确,您可以通过给出以下命令来解决此问题。 这将更改两对中值的 mynode 部分:
hostname mynode
如果 fqdn 中的域值不正确,可以通过在系统配置文件 /etc/resolv.conf
中追加一行来修复它。 首先快速浏览一下(如果您不小心损坏了它并想在不重新创建 Droplet 的情况下重新创建它,这很有用):
cat /etc/resolv.conf
现在附加到它:
cat >>/etc/resolv.conf domain example.com ^D
(其中 ^D 表示键入 Control-D 以终止对 cat
命令的输入。)
确认您的更改适用于:
facter | grep hostname facter | grep fqdn
这里提醒一下输出应该包含的内容:
hostname=mynode fqdn=mynode.example.com
创建人偶配置文件
现在 Puppet 已安装并准备好运行,是时候创建 Puppet 配置了。 CentOS/Puppet 安装过程应该已经创建了一个名为 /etc/puppet
的目录(如果没有,使用 mkdir /etc/puppet
创建它)。 让我们看看那里:
ls -la /etc/puppet
应该有几个 .conf
文件和一个 modules
子目录。
Puppet 配置目录树命名约定指示我们创建一个 manifests
子目录来保存我们将要创建的实际配置文件:
mkdir /etc/puppet/manifests
现在创建配置文件。 您需要用自己的域名替换 mynode.example.com
。 使用 cat
命令,但如果您愿意,可以使用 nano
编辑器(或任何其他编辑器)。 (忽略前导和尾随空行)。
cat >/etc/puppet/manifests/projectname.pp node "mynode.example.com" { file { '/root/example_file.txt': ensure => "file", owner => "root", group => "root", mode => "700", content => "Congratulations! Puppet has created this file. ",} } # End node mynode.example.com ^D
(^D 表示键入 Control-D 以终止对 cat
命令的输入。)
配置文件指定节点mynode.example.com
的配置。 (您可以向此文件添加更多构造块,如 node "nodename" {...}
,它仍将在节点 mynode.example.com
上运行)。
node
构造内部是一条指令,用于配置名为 /root/example_file.txt
的特定文件。 file
构造指示 Puppet 确保存在以该名称命名的文件,该文件是文件而不是目录,它具有指定的所有权,它具有指定的保护模式,并且它有规定的内容。
file
指令不仅仅是一个在文件不存在时创建文件的命令。 相反,它是如何配置文件的规范。 Puppet 检查文件并将其驱动到指定状态,无论它处于何种状态。 如果文件不存在,Puppet 会创建它。 如果它确实存在,但它的任何指定方面不正确(包括文件内容),Puppet 将纠正偏差并将文件驱动到指定状态。 因此,虽然 Puppet 似乎在第一次运行时完成了安装脚本的角色,但在第一次和后续运行中,它实际上是将现有状态与所需状态进行比较,并进行更改以将文件系统驱动到所需状态.
调用木偶
现在您已经安装了 Puppet 并创建了配置文件,您可以调用 Puppet。 (忽略任何 ipaddress 错误)。
puppet apply /etc/puppet/manifests/projectname.pp
Puppet 应该在 root
组中创建由 root
拥有的文件 /root/example_file.txt
,并具有 -rwx------
权限。 检查这个:
ls -la /root
使用以下命令检查文件的内容:
cat /root/example_file.txt
您应该看到我们在配置文件中指定的文本。
再次调用 Puppet
请记住,Puppet 不会将您的配置文件作为脚本执行。 相反,它会将您的系统驱动到配置文件中指定的状态。 这意味着如果你再次运行 Puppet,它应该什么都不做。 尝试一下!
puppet apply /etc/puppet/manifests/projectname.pp
损坏文件并再次调用 Puppet
现在让我们通过使用 chmod
命令更改其保护来对配置的文件造成一些损害。
chmod o+r /root/example_file.txt
使用以下命令检查损坏情况。 您应该看到 example_file.txt
的 -rwx---r--
保护而不是 -rwx------
保护:
ls -la /root
现在再次调用 Puppet:
puppet apply /etc/puppet/manifests/projectname.pp
Puppet 应该修复文件的保护。 检查它:
ls -la /root
更多损坏和修复
现在让我们通过更改其内容再次损坏文件:
cat >/root/example_file.txt This is a damaged file! ^D
使用以下方法确认损坏:
cat /root/example_file.txt
再次调用 Puppet。 它应该修复文件:
puppet apply /etc/puppet/manifests/projectname.pp
确认文件已通过以下方式修复:
cat /root/example_file.txt
接下来是什么?
这只是一个帮助您入门的“Hello World”示例。 上面的配置文件只是 Puppet 可以做的一个小例子。 要了解即将发生的事情,请快速浏览此页面:
您可以指定单个文件、整个目录树、包、服务、cron、用户、组等的配置。 还有一个巨大的 Puppet 用户创建的配置模块库:
结论
本教程向您展示了如何以独立模式安装 Puppet,以及如何创建 Puppet 配置文件以在单个节点中配置单个文件。 该配置文件可以作为一个平台,您可以在该平台上构建更复杂的配置。 如果您遵守使用 Puppet 进行所有配置的原则,您将能够将您的 Droplet 从雪花(或宠物)转换为牛,从而使您的云管理任务快速且可重复。
参考
Puppet 背后的公司名为 Puppet Labs, Inc.。 可以在这里找到:
Puppet 安装说明可在以下位置找到:
您可以通过浏览此页面了解 Puppet 的配置能力:
Puppet 用户社区创建了数千个 Puppet 模块,可用于配置各种软件: