介绍
本教程的目标是尽快让Puppet在CentOS 7上以独立模式运行。 如果你想了解一下Puppet以及它对你有用,请继续阅读。如果你已经相信,并希望开始安装Puppet,跳到部分
使用在本教程中约定如下。
为什么使用Puppet?
什么是Puppet?
Puppet是一个开源配置管理软件工具,允许组织从单个中央服务器控制多达几万个节点的确切配置。Puppet是成熟和受欢迎的,并且被世界各地的大型组织使用。但是,在此分布式客户端/服务器模型下安装Puppet可能很复杂,需要设置中央Puppet服务器及其与客户端节点的关系。 Puppet具有如同大量云配置工具这样强大的形象,它可能会让你惊讶地知道Puppet也可以在“独立”模式下运行,在其中手动运行配置单个节点。在独立模式下,Puppet是用于配置单个节点的出色工具。 如果您已经手动配置了DigitalOcean Droplet(即通过SSH连接到云服务器并在Linux命令shell中输入一系列命令),Puppet可以帮助您将配置过程的所有知识嵌入到一个Puppet配置文件中(或目录树),可以从头重新创建节点,或者如果节点损坏,则重新配置节点。 Puppet不只是一个美化的安装脚本管理器。当Puppet运行时,它检查节点的配置,识别节点的配置和Puppet配置文件中指定的配置之间的任何差异,然后进行必要的更改以使节点进入指定的状态。这意味着它可以用于配置节点和修复它们。
为什么使用配置管理工具?
我们可以确定安装软件的三个级别的复杂性:手动,脚本和配置管理。
- 在手动安装 ,你SSH到节点并发出一系列命令 到命令shell来安装软件。
- 在脚本式安装 ,您可以创建一个脚本(如Ruby脚本或bash脚本) 安装软件并执行它。
- 在配置管理基础安装 ,您创建一个配置 管理工具规定节点的期望状态,并且配置工具将节点的状态与期望的状态进行比较,并且将节点驱动到期望的状态。
应避免手动安装,因为它是一个预先自动化解决方案,将所有安装知识嵌入一个或多个工程师的头部,而不是嵌入到文件中(除非工程师已经记下安装过程)。 脚本式安装远胜于手动安装,但遇到以下问题:如果您执行安装,然后损坏其中的一小部分,则无法使用脚本修复损坏;你必须从头开始并重新安装一切。 基于配置管理的安装是最好的解决方案。配置管理工具将自动安装(如安装脚本),但它也可用于在软件损坏时修复软件。它还可以用于更改所需的配置,并将节点驱动到新的所需状态。
为什么使用Puppet?
截至2014年8月,市场上似乎有两个主要的配置工具:Puppet和Chef。快速搜索显示,两者似乎都是忠实的成熟工具和忠实的追随者。一个关键的区别是Puppet更具声明性,Chef更加程序化,这使得Puppet对损伤修复更具吸引力。这里有一些比较文章。
本教程并不尝试进行全面的比较。
雪花,宠物和牛
在软件配置世界中出现了一个隐喻来描述三个层次 的服务器配置管理的复杂性。 你可以在雪花 水平,宠物水平或牛水平。以下是它的工作原理:
- 您的节点是雪花 ,如果你不知道它是怎么来的的状态 它是在和/或你太紧张,不能对其进行任何更改,甚至Touch 它在万一破裂。 如果它打破,你是真的麻烦。 你的节点是 像一朵精致的雪花。
- 您的节点是一个宠物,如果你有信心,如果它打破了你可以修复它, 但从头开始配置它的想法填满了你的恐惧。 当你的 宠物生病,你把它交给兽医治愈它。
- 您的节点是一头牛 ,如果配置已使自动化的,如果 节点出现问题,更容易从头重新配置它 使用您的自动配置工具,而不是尝试修复它。 什么时候 你的一只牛生病,你不把它带到兽医; 你拍摄它在 头和得到一个新的。
隐喻的目的是传达节点管理的“牛”视角。大多数系统管理员都习惯于将节点当作雪花或宠物来处理,当节点被损坏时,只是杀死一个节点的想法看起来很陌生。然而,它需要几秒钟的思想来改变自己的观点,并实现牛模型有多么强大。
- 文件系统已损坏?没有问题,只是杀死节点,并使用Puppet从头重新创建它。
- 一个模糊的软件突然停止工作了?没有问题,只是杀死节点,并使用Puppet从头重新创建它。
- 黑客已经渗透了你的系统并安装了一个根工具包?没有问题,只是杀死节点,并使用Puppet从头重新创建它。
治疗你的节点像牛可以是拐杖。最终,最好找到任何破坏您的节点的源,并解决真正的问题,但在此期间,它是非常有效的只是自动重建。 在三个安装级别中,脚本和配置管理安装都支持牛模型。然而,配置管理模型也支持宠物模型。在脚本模型下,如果要安装其他软件,则必须从头开始。在配置管理模型下,您可以修改现有节点。 Puppet允许你从雪花模型移动到牛模型,可以选择在方便时将你的牛当作宠物。 (注意:作者不喜欢对牛等动物进行治疗,但是牛的比喻作为一个配置隐喻起到了很好的作用。)
Puppet的方式
Puppet配置节点的方法是配置Puppet内的所有东西。这有时可能有点具有挑战性,但几乎总是可能的配置任何你想从Puppet。 如果您承诺从Puppet中配置所有内容,那么您可以使用一个Puppet命令配置云中的任何节点,如果可以这样做,您可以开始像牛一样处理云中的节点。你可以移动这么远的雪花心态,你可以采取的政策,定期在你的云中选择一个随机节点,并撕裂它,并使用Puppet重建它,只是为了证明自己,它没有以某种方式成为雪花或宠物。 一旦你将所有的配置信息都体现在Puppet中,阻止你处理一个像牛头这样的节点的唯一办法是如果它包含一个数据库。您必须在拆除节点之前保存数据库,并在重建节点后将其还原,但这是唯一的原因。 Puppet不仅仅是一个配置工具。它是一个devops学科,简化节点安装,管理和修复,并消除了管理云节点的大部分压力。
本教程中使用的约定
为了本教程的目的,名为的Droplet:
mynode.example.com
将会被使用。每当在本教程中看到单词“mynode”或“example”时,您可以确保它们不是命令关键字,并且您必须替换自己的名称。 除非另有说明,每当本教程指示发出命令时,它意味着在您的Droplet的命令shell(例如bash)中发出它。 本教程假定您以root身份登录,所以你不必前缀每个命令
sudo
。 如果您不是以root身份登录,你可以尝试所有的前缀下面的命令与
sudo
(但是这没有经过测试)。 在本教程中,我们使用
cat
命令来创建和修改文件。 欢迎您使用
nano
如果需要或其他文本编辑器。
创建Droplet
如果你还没有创建你想要应用Puppet的Droplet,现在就这样做。你可以创建任何种类的Droplet,只要它是一个CentOS 7 Droplet。 当在DigitalOcean Droplet创建表单上指定新Droplet的主机名时,请务必在Hostname表单字段中指定完全限定域名(FQDN)。
Hostname = mynode.example.com
不要只指定“mynode”。 (你并不需要配置
example.com
的DNS新节点
mynode
才能够运行Puppet,但它是一个好主意,如果你打算保持Droplet要做到这一点,无论如何,所以这是你的提醒!)
SSH作为根目录进入您的Droplet
SSH从根目录下的新Droplet从您工作的计算机的命令行使用以下命令。
ssh root@mynode.example.com
如果您尚未配置DNS将域名指向节点,则需要使用节点的IP地址。
ssh root@xxx.xxx.xxx.xxx
安装Puppet
下一步是安装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已经安装并准备运行了,现在是创建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并创建了一个配置文件,你可以调用Puppet。 (忽略任何ipaddress错误)。
puppet apply /etc/puppet/manifests/projectname.pp
Puppet应该创建文件
/root/example_file.txt
归
root
,中
root
组,并与
-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
使用以下命令检查损坏。您应该看到
-rwx---r--
保护
example_file.txt
代替
-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
接下来做什么?
这只是一个“你好世界”的例子,让你开始。上面的配置文件只是Puppet可以做的一个小例子。对于前面的东西的味道,快速看看这个页面:
您可以指定单个文件,整个目录树,包,服务,cron,用户,组和更多的配置。还有一个巨大的Puppet用户创建的配置模块库在:
结论
本教程向您展示了如何在独立模式下安装Puppet,以及如何创建一个Puppet配置文件来配置单个节点中的单个文件。此配置文件可以充当一个平台,您可以在其上构建更复杂的配置。如果你坚持使用Puppet进行所有配置的规则,你将能够将你的Droplet从雪花(或宠物)转换为牛,从而使你的云管理任务快速和可重复。
参考文献
Puppet背后的公司名为Puppet Labs,Inc.,可以在这里找到:
有关Puppet安装说明,请访问:
您可以通过浏览此页面了解Puppet能够配置的内容:
Puppet用户社区已经创建了数千个Puppet模块,可以 用于配置各种软件: