用 Puppet 搭建易管理的服务器基础架构.docx
- 文档编号:17749629
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:17
- 大小:288.23KB
用 Puppet 搭建易管理的服务器基础架构.docx
《用 Puppet 搭建易管理的服务器基础架构.docx》由会员分享,可在线阅读,更多相关《用 Puppet 搭建易管理的服务器基础架构.docx(17页珍藏版)》请在冰豆网上搜索。
用Puppet搭建易管理的服务器基础架构
用Puppet搭建易管理的服务器基础架构
关于Puppet
Puppet是一种Linux、Unix、Windows平台的集中配置管理系统,使用自有的Puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。
Puppet把这些系统实体称之为资源,其设计目标是简化对这些资源的管理以及妥善处理资源之间的依赖关系。
在这一系列中,作者提供了一个可操作的全面教程,来逐步解释如何使用Puppet搭建一个集中式管理的Linux服务器基础结构。
目标读者
我相信有一类Linux系统管理员会从这个系列教程中收获最多,他们已经在管理一个小规模的服务器系统网络,想知道如何扩大现有的基础结构,并且为管理新增系统付出的的时间和精力,不会和新增系统的数目成正比。
或许你目前在管理5个服务器系统,你可以问一下自己有没有更好的方法,可以在不增加人手的情况下,来管理50个服务器系统。
或者你已经听说过集中式配置管理和Puppet,并且渴望尝试一下。
先决条件
如果你的电脑安装了Linux、Windows或者MacOSX桌面操作系统,拥有至少4G内存,16G可用磁盘空间,并且CPU可以运行虚拟机,那就足够了。
所有你要做的事情和需要的信息,我会在这个系列课程中为你说明。
开始
我无需说服你使用Puppet实现基于工具的配置管理,既然你能读到这里,你可能已经想要使用它了,所以让我们马上开始吧。
我承诺这是一个易上手的全面的教程,为此,我们需要准备一个环境,这样我们可以不仅可以讨论如何使用Puppet,而且能够创建一个虽然很小但是真实的服务器基础结构,在这个基础结构中,我们会运行一个Puppet服务器,它会管理一个Puppet客户端。
换句话说,我们需要两个Linux虚拟机。
在这个教程中,我愿意使用两个 Ubuntu12.04LTSPrecisePangolin 系统,这只是因为我对这个Linux发行版本最有经验。
如果你使用更新版本的Ubuntu或者Debian7.0Wheezy,那么这里描述的步骤应该不会有很大的区别。
我们要做的第一件事情是从Oracle网站下载安装VirtualBox。
这是一个免费的虚拟机管理软件,我们可以使用它来运行上面提到的两个虚拟Ubuntu系统。
在写这篇教程时,VirtualBox的最新发布版本是4.3.8-92456,你可以前往http:
//download.virtualbox.org/virtualbox/4.3.8/ ,然后根据使用的操作系统,来下载VirtualBox-4.3.8-92456-Win.exe, VirtualBox-4.3.8-92456-OSX.dmg,或者 VirtualBox-4.3.8-92456-Linux_amd64.run。
一旦下载完成后,你就可以使用默认选项进行安装了。
一旦将VirtualBox安装到你的电脑后,你就需要下载Ubuntu12.04LTS64位服务器版本的安装媒介了,你可以前往 然后选择64-bitPC(AMD64)serverinstallCD 链接来进行下载,我们会使用这个ISO来安装两个虚拟机。
一旦将ISO文件完全下载到你的电脑后,你可以打开VirtualBox,在Machine菜单下选择New…。
我们开始安装虚拟机,这个虚拟机会被当做Puppet服务器,因此在弹出窗口中,我们将虚拟机的名字设置为puppetserver。
接下来将Type设置为Linux,将Version设置为Ubuntu(64bit)。
将内存大小设置为512M就足够了。
让VirtualBox来为虚拟机创建一个硬盘文件(将大小设置为8G就足够了)。
现在你就可以启动最新创建的虚拟机了。
VirtualBox会向你询问安装媒介,这里需要指向你已经下载完毕的UbuntuISO文件的路径。
VirtualBox就会启动虚拟机并引导进入Ubuntu的安装CD,选择English作为安装过程中使用的语言,然后选择InstallUbuntuServer继续安装。
在安装过程中,你应该进行如下设置:
∙语言:
English
∙国家:
选择你的国家
∙Locale:
en_US.UTF-8
∙键盘:
选择最适合你需要的键盘布局
∙默认用户:
ubuntu,密码ubuntu
∙加密home目录:
No
∙时区:
选择你所在的时区
∙分区:
Guided–useentiredisk
∙当被询问需要安装哪些包时,只选择OpenSSHserver。
∙将grub安装进MBR
∙将系统时钟设置为UTC
∙不要自动安装安全更新。
一旦第一个虚拟机的安装完成后,启动它并进入。
然后,我们创建第二个虚拟机,这个虚拟机是我们的puppet客户端。
你可以参考安装第一个虚拟机时的处理方式,但其中有一个例外:
在VirtualBox内部安装Ubuntu的过程中,将第二台虚拟机的名字设置为 puppetclient,而不是 puppetserver。
在完成安装后,你可以像操作第一台虚拟机那样,启动并进入第二台虚拟机。
这时你会看到两个VirtualBox的窗口,都在运行Ubuntu12.04,都向你提示输入登录信息。
接下来,我们需要对VirtualBox进行一些配置,因此你需要登陆到两台虚拟机(用户名:
ubuntu,密码:
ubuntu),然后通过命令sudopoweroff来关闭它们。
网络
因为我们要建立一个Puppet服务器和客户端,所以这两台虚拟机需要通过网络彼此通信。
同时,如果能够从我们自己的电脑连接到这两台虚拟机,也会比较方便,这样我们可以通过SSH的方式连接到虚拟机,而不是通过一个很小的不易用的VirtualBox控制台。
最后还有重要的一点,这两台虚拟机需要能够连接到互联网,这样才可以安装相关软件。
为了实现这些,我们需要两个虚拟的网络,一个Host-only网络和一个NAT网络。
这两台虚拟机则各需要有两个以太网适配器,其中eth0用来连接到Host-only网络,eth1用来连接到NAT网络。
Host-only网络允许这两台虚拟机可以彼此连接,也允许我们可以使用自己的电脑连接到这两台虚拟机上。
NAT网络则允许这两台虚拟机可以访问互联网。
VirtualBox本身已经建立了这两种网络。
选择File -> Preference,然后找到Network,其中NATNetworks选项卡中虽然没有列出任何网络,但其实一直会存在一个可用的网络,因此我们不需要再额外配置一个。
然后切换到Host-onlyNetworks选项卡。
我们需要确保有一个名为vboxnet0的网络是可用的。
点击在列表旁边的小螺丝刀图标,在弹出的窗口中,需要确认Adapter和DHCPServer的配置如下所示。
在Host-only网络中,我们自己的电脑的IP地址被自动设置为192.168.56.1,我们的puppetserver虚拟机应该设置为192.168.56.2,puppetclient虚拟机应该设置为192.168.56.3。
为了做到如上配置,我们需要在两个虚拟机内打开Settings对话框,找到Network,然后将Adapter1绑定到Host-onlyAdapter,并将Name设置为vboxnet0。
然后将Adapter2绑定到NAT(注意:
不是NATNetwork!
)。
这些配置在两台虚拟机上必须保持一致。
现在启动两台虚拟机并使用ubuntu用户信息登录系统。
我们需要在两台虚拟机内编辑/etc/network/interfaces文件来配置网络接口。
对于puppetserver来说,该文件如下所示。
/etc/network/interfacesonpuppetserver
1
2
3
4
5
6
7
8
9
10
autolo
ifaceloinetloopback
autoeth0
ifaceeth0inetstatic
address192.168.56.2
netmask255.255.255.0
autoeth1
ifaceeth1inetdhcp
对于 puppetclient 来说,该文件如下所示。
/etc/network/interfacesonpuppetclient
1
2
3
4
5
6
7
8
9
10
autolo
ifaceloinetloopback
autoeth0
ifaceeth0inetstatic
address192.168.56.3
netmask255.255.255.0
autoeth1
ifaceeth1inetdhcp
如你所见,这两台虚拟机的配置中,唯一不同的地方就是IP地址。
通过如上配置,我们的虚拟机就可以通过eth1来访问互联网,并通过eth0中设置的静态IP地址来访问彼此。
最后一步,我们需要将两台虚拟机的名字放到两台虚拟机的hosts文件中,这样我们就可以通过名字而不是IP地址来访问它们。
puppetserver虚拟机上的etc/hosts文件内容如下所示。
/etc/hostsonpuppetserver
1
2
3
4
5
6
7
8
9
10
127.0.0.1 localhost
127.0.1.1 puppetserver
192.168.56.3 puppetclient
#ThefollowinglinesaredesirableforIPv6capablehosts
:
:
1 ip6-localhostip6-loopback
fe00:
:
0ip6-localnet
ff00:
:
0ip6-mcastprefix
ff02:
:
1ip6-allnodes
ff02:
:
2ip6-allrouters
puppetclient虚拟机上的/etc/hosts文件内容如下所示。
/etc/hostsonpuppetclient
1
2
3
4
5
6
7
8
9
10
127.0.0.1 localhost
127.0.1.1 puppetclient
192.168.56.2 puppetserver
#ThefollowinglinesaredesirableforIPv6capablehosts
:
:
1 ip6-localhostip6-loopback
fe00:
:
0ip6-localnet
ff00:
:
0ip6-mcastprefix
ff02:
:
1ip6-allnodes
ff02:
:
2ip6-allrouters
在重启两台虚拟机后,你应该能够从puppetserver虚拟机上成功运行pingpuppetclient命令,反过来也可以从puppetclient虚拟机上成功连接到puppetserver虚拟机,同样你也应该能够在自己的电脑上成功运行 ping192.168.56.2 和 ping192.168.56.3。
搭建Puppet服务器
现在,我们已经建立了Puppet服务器和Puppet客户端的虚拟机,在虚拟机上安装了Ubuntu,并配置好了网络并正在运行,我们可以开始搭建Puppet服务器系统了。
Ubuntu软件库为我们提供了将服务器系统变为Puppet服务器所需的全部内容,我们不需要手动安装任何软件或者操作外部软件包。
为了安装必要的软件包,我们需要使用ubuntu用户登录到puppetserver虚拟机,然后运行如下命令。
OnthepuppetserverVM
1
2
~#sudoapt-getupdate
~#sudoapt-getinstallpuppetmaster
我们不需要做其他步骤了,现在Puppet服务器可以使用一个合理的默认配置来运行了。
搭建Puppet客户端
建立Puppet客户端(或者用Puppet术语,代理)并在puppetclient虚拟机上运行它,和建立Puppet服务器并没有太大的区别。
首先我们需要安装Puppet客户端软件包。
OnthepuppetclientVM
1
2
~#sudoapt-getupdate
~#sudoapt-getinstallpuppet
然后,我们需要编辑etc/puppet/puppet.conf文件,来告诉Puppet代理Puppet服务器的域名,为此我们需要在该文件中添加一行:
server=puppetserver。
/etc/puppet/puppet.confonpuppetclient
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[main]
server=puppetserver
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
prerun_command=/etc/puppet/etckeeper-commit-pre
postrun_command=/etc/puppet/etckeeper-commit-post
[master]
#Theseareneededwhenthepuppetmasterisrunbypassenger
#andcansafelyberemovedifwebrickisused.
ssl_client_header=SSL_CLIENT_S_DN
ssl_client_verify_header=SSL_CLIENT_VERIFY
这样设置后,客户端就可以连接到puppetserver虚拟机上的Puppetmaster进程了,但它还不能真正和服务器进行通信,因为它还没有在已验证并允许的客户端列表里面。
为了实现这一点,我们需要发起从客户端到服务器的第一个连接。
在puppetclientVM
1
~#sudopuppetagent--verbose--no-daemonize--onetime
这会向Puppetmaster进程发起一个连接,这个进程会监听puppetserver虚拟机上的8140端口。
这个连接的输出会很详细,然后客户端(代理)就不再继续以后台daemon的方式运行。
同时,它只会运行一次,也就是说,当这个连接关闭后,代理进程也会结束。
如果所有的配置都正确,那么第一次运行时的输出如下所示。
在puppetclientVM上,运行Puppet代理之后,
1
2
3
4
info:
CreatinganewSSLkeyforpuppetclient
info:
CreatinganewSSLcertificaterequestforpuppetclient
info:
CertificateRequestfingerprint(md5):
20:
74:
A7:
BD:
69:
5D:
50:
8D:
6A:
79:
67:
6E:
DC:
5E:
41:
E0
Exiting;nocertificatefoundandwaitforcertisdisabled
这个看上去似乎像是一个错误,但它实际上不是。
客户端已经通过这次运行让服务器知道了它的信息了,但是服务器还没有接受这个客户端。
下一步,我们必须签署puppetclient虚拟机已经创建的SSL认证请求,并将其发送给服务器。
我们可以通过如下命令在服务器上查看那些还没有被签署的认证请求列表。
在puppetserverVM上
~# sudopuppetcert--list
这个命令会打印如下的列表。
在puppetserverVM上
"puppetclient"(20:
74:
A7:
BD:
69:
5D:
50:
8D:
6A:
79:
67:
6E:
DC:
5E:
41:
E0)
现在我们可以签署这个请求,这样我们就允许客户端在接下来的连接中可以收到服务器的信息。
在puppetserverVM上
1
2
3
4
~#sudopuppetcert--signpuppetclient
notice:
Signedcertificaterequestforpuppetclient
notice:
RemovingfilePuppet:
:
SSL:
:
CertificateRequestpuppetclientat'/var/lib/puppet/ssl/ca/requests/puppetclient.pem'
切换回puppetclient虚拟机,我们现在能够初始化一个指向服务器的完整连接了。
在puppetserverVM上
1
2
3
4
5
6
7
8
~#sudopuppetagent--verbose--no-daemonize--onetime
info:
Cachingcertificateforpuppetclient
info:
Cachingcertificate_revocation_listforca
info:
Cachingcatalogforpuppetclient
info:
Applyingconfigurationversion'1395687915'
info:
Creatingstatefile/var/lib/puppet/state/state.yaml
notice:
Finishedcatalogrunin0.02seconds
就是这样——我们的Puppet基础结构已经完全建好并开始运行了。
但是,在这个基础结构还并不能做任何事情。
我们的目标是通过运行在puppetserver虚拟机上的Puppetmaster,来管理puppetclient虚拟机上的配置。
但是我们目前还没有定义任何信息来触发客户端的配置改动。
这就是我们要在使用Puppet来构建可管理的服务器基础结构:
第二部分会涉及的内容。
关于
在第一部分中,我们已经建立了两个Linux系统虚拟机:
puppetserver 和 puppetclient。
我们已经实现了一个重要的里程碑:
在虚拟机上分别安装了Puppet服务器和Puppet客户端软件,并且在Puppet服务器端对Puppet客户端进行了认证。
接下来我们要在此基础上,开始通过在puppetserver虚拟机上的Puppet服务器,来配置puppetclient虚拟机系统。
你好,Puppet
我们以一个非常基本的示例开始。
在这个示例中,我们为puppetclient虚拟机建立一个非常简单的配置:
在puppetclient虚拟机系统的/home/ubuntu目录下创建一个名为helloworld.txt文件,文件的内容是”HelloWorld!
”。
Puppet自带一个功能强大的声明式配置语言。
我们使用这种语言来编写的内容被称为清单(manifest)。
Puppet清单是一个文件,它描述了目标系统中的某些方面应该是什么样的。
在这个系列教程中,我们会编写很多不同的清单:
其中一些会在目标系统上创建一些文件;一些会创建用户账户;一些会安装软件包。
清单会被应用到目标系统上。
对Puppet来说,目标系统被称为节点(node)。
我们的puppetclient虚拟机系统就是这样一个节点。
我们已经为它做了Puppet服务器认证,这样可以保证Puppet服务器来管理这个节点。
但我们的服务器还没有任何信息,可以用来管理这个节点。
我们可以通过编写一个清单并将其放在节点上来改变它。
为此,我们会创建一个非常简单的清单定义,这个定义会被放在puppetserver虚拟机系统的主清单文件中,文件的路径是/etc/puppet/manifests/site.pp:
/etc/puppet/manifests/site.pponpuppetserver
1
2
3
4
5
6
7
8
9
10
node"puppetclient"{
file{"/root/helloworld.txt":
ensure=>file,
owner =>"root",
group =>"root",
mode =>0644
}
}
我们稍后会看到,清单可以通过模块化的方式放到任意数目的不同文件中(这样可以帮助我们针对大型复杂的站点建立清单结构)。
但是一切都还是从site.pp开始。
我们来仔细分析一下这个最简化的清单,它包含两部分:
一个包含file定义的node,因为file部分包含在node部分中,这样file部分的定义产生的结果会应用到名为puppetclient的节点上。
通过在puppetclient虚拟机系统上运行Puppet代理,我们可以很容易理解上面描述的内容。
OnthepuppetclientVM
1
2
3
4
~#sudopuppetagent--verbose--no-daemonize--onetime
info:
Cachingcatalogforpuppetclientinfo:
Applyingconfigurationversion'1395862307'
notice:
/Stage[main]//Node[puppetclient]/File[/home/ubuntu/helloworld.txt]/ensure:
created
notice:
Finishedcatalogrunin0.03seconds
或许这看上去没有什么大惊小怪:
puppetclient虚拟机上的Puppet代理联系到puppetserver虚拟机上的Puppetmaster。
然后它接收目录,这个目标就是在master上定义的所有和这个指定客户端有关的清单。
如果你感兴趣的话,这个目录被存在一个yaml结构中,它存储在 /var/lib/puppet/client_yaml/catalog/puppetclient.yaml 中,这不仅仅是复制了我们的.pp清单,而是通过对清单进行解析,生成的一个关于目标配置信息的编译版本。
接下来,Puppet代理开始采取行动——当且仅当满足以下条件才会采取行动:
Puppet代理会比较清单中期望的状况和目标节点上清单的状况,如果其中有一些不同(如果目标节点上找到的状况并没有同步到期望达到的状况)——那么代理就会做任何必需的操作来移除这些区别,来实现目标状况。
在我们这个特定的示例中,代理知道
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Puppet 搭建易管理的服务器基础架构 搭建 管理 服务器 基础 架构