用 Puppet 搭建易管理的服务器基础架构_第1页
用 Puppet 搭建易管理的服务器基础架构_第2页
用 Puppet 搭建易管理的服务器基础架构_第3页
用 Puppet 搭建易管理的服务器基础架构_第4页
用 Puppet 搭建易管理的服务器基础架构_第5页
已阅读5页,还剩13页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用 Puppet 搭建易管理的服务器基础架构关于 PuppetPuppet 是一种 Linux、Unix、Windows 平台的集中配置管理系统,使用自有的 Puppet 描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。Puppet把这些系统实体称之为资源,其设计目标是简化对这些资源的管理以及妥善处理资源之间的依赖关系。在这一系列中,作者提供了一个可操作的全面教程,来逐步解释如何使用 Puppet 搭建一个集中式管理的 Linux 服务器基础结构。目标读者我相信有一类Linux系统管理员会从这个系列教程中收获最多,他们已经在管理一个小规模的服务器系统网络,想知道如何扩大现有的

2、基础结构,并且为管理新增系统付出的的时间和精力,不会和新增系统的数目成正比。或许你目前在管理5个服务器系统,你可以问一下自己有没有更好的方法,可以在不增加人手的情况下,来管理50个服务器系统。或者你已经听说过集中式配置管理和Puppet, 并且渴望尝试一下。先决条件如果你的电脑安装了Linux、Windows 或者 Mac OS X 桌面操作系统,拥有至少4G内存,16G可用磁盘空间,并且CPU可以运行虚拟机,那就足够了。所有你要做的事情和需要的信息,我会在这个系列课程中为你说明。 开始我无需说服你使用Puppet实现基于工具的配置管理,既然你能读到这里,你可能已经想要使用它了,所以让我们马上

3、开始吧。我承诺这是一个易上手的全面的教程,为此,我们需要准备一个环境,这样我们可以不仅可以讨论如何使用Puppet,而且能够创建一个虽然很小但是真实的服务器基础结构,在这个基础结构中,我们会运行一个Puppet服务器,它会管理一个Puppet客户端。换句话说,我们需要两个Linux虚拟机。在这个教程中,我愿意使用两个 Ubuntu 12.04 LTS Precise Pangolin 系统,这只是因为我对这个Linux发行版本最有经验。如果你使用更新版本的Ubuntu或者Debian 7.0 Wheezy,那么这里描述的步骤应该不会有很大的区别。我们要做的第一件事情是从Or

4、acle网站下载安装VirtualBox。这是一个免费的虚拟机管理软件,我们可以使用它来运行上面提到的两个虚拟Ubuntu系统。在写这篇教程时,VirtualBox的最新发布版本是4.3.8-92456,你可以前往/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。一旦下载完成后,

5、你就可以使用默认选项进行安装了。一旦将VirtualBox安装到你的电脑后,你就需要下载Ubuntu 12.04 LTS 64位服务器版本的安装媒介了,你可以前往  PC (AMD64) server install CD 链接来进行下载,我们会使用这个ISO来安装两个虚拟机。一旦将ISO文件完全下载到你的电脑后,你可以打开VirtualBox,在Machine菜单下选择New。我们开始安装虚拟机,这个虚拟机会被当做Puppet服务器,因此在弹出窗口中,我们将虚拟机的名字设置为puppetserver。接下来将Type设置为Linux,将Version设置为Ubuntu(6

6、4bit)。 将内存大小设置为512M就足够了。让VirtualBox来为虚拟机创建一个硬盘文件(将大小设置为8G就足够了)。现在你就可以启动最新创建的虚拟机了。VirtualBox会向你询问安装媒介,这里需要指向你已经下载完毕的Ubuntu ISO文件的路径。VirtualBox就会启动虚拟机并引导进入Ubuntu的安装CD,选择English作为安装过程中使用的语言,然后选择Install Ubuntu Server继续安装。在安装过程中,你应该进行如下设置:· 语言:English· 国家:选择你的国家· Locale:en_US.UTF-8· 键

7、盘:选择最适合你需要的键盘布局· 默认用户:ubuntu,密码ubuntu· 加密home目录:No· 时区:选择你所在的时区· 分区:Guided use entire disk· 当被询问需要安装哪些包时,只选择OpenSSH server。· 将grub安装进MBR· 将系统时钟设置为UTC· 不要自动安装安全更新。一旦第一个虚拟机的安装完成后,启动它并进入。然后,我们创建第二个虚拟机,这个虚拟机是我们的puppet客户端。你可以参考安装第一个虚拟机时的处理方式,但其中有一个例外:在VirtualBox内部安

8、装Ubuntu的过程中,将第二台虚拟机的名字设置为 puppetclient,而不是 puppetserver。在完成安装后,你可以像操作第一台虚拟机那样,启动并进入第二台虚拟机。这时你会看到两个VirtualBox的窗口,都在运行Ubuntu 12.04, 都向你提示输入登录信息。接下来,我们需要对VirtualBox进行一些配置,因此你需要登陆到两台虚拟机(用户名:ubuntu,密码:ubuntu),然后通过命令sudo poweroff来关闭它们。网络因为我们要建立一个Puppet服务器和客户端,所以这两台虚拟机需要通过网络彼此通信。同时,如果能够从我们自己的电脑连接

9、到这两台虚拟机,也会比较方便,这样我们可以通过SSH的方式连接到虚拟机,而不是通过一个很小的不易用的VirtualBox控制台。最后还有重要的一点,这两台虚拟机需要能够连接到互联网,这样才可以安装相关软件。为了实现这些,我们需要两个虚拟的网络,一个Host-only网络和一个NAT网络。这两台虚拟机则各需要有两个以太网适配器,其中eth0用来连接到Host-only网络,eth1用来连接到NAT网络。Host-only网络允许这两台虚拟机可以彼此连接,也允许我们可以使用自己的电脑连接到这两台虚拟机上。NAT网络则允许这两台虚拟机可以访问互联网。VirtualBox本身已经建立了这两种网络。选择

10、File -> Preference,然后找到Network,其中NAT Networks选项卡中虽然没有列出任何网络,但其实一直会存在一个可用的网络,因此我们不需要再额外配置一个。然后切换到Host-only Networks选项卡。我们需要确保有一个名为vboxnet0的网络是可用的。点击在列表旁边的小螺丝刀图标,在弹出的窗口中,需要确认Adapter和DHCP Server的配置如下所示。在Host-only网络中,我们自己的电脑的IP地址被自动设置为,我们的puppetserver虚拟机应该设置为,puppetc

11、lient虚拟机应该设置为。为了做到如上配置,我们需要在两个虚拟机内打开Settings对话框,找到Network,然后将Adapter 1绑定到Host-only Adapter,并将Name设置为vboxnet0。然后将Adapter 2绑定到NAT(注意:不是NAT Network!)。这些配置在两台虚拟机上必须保持一致。现在启动两台虚拟机并使用ubuntu用户信息登录系统。我们需要在两台虚拟机内编辑/etc/network/interfaces文件来配置网络接口。对于puppetserver来说,该文件如下所示。/etc/network/interfaces o

12、n puppetserver12345678910auto loiface lo inet loopback auto eth0iface eth0 inet static    address     netmask  auto eth1iface eth1 inet dhcp对于 puppetclient 来说,该文件如下所示。/etc/network/interfaces on puppetclient123456789

13、10auto loiface lo inet loopback auto eth0iface eth0 inet static    address     netmask  auto eth1iface eth1 inet dhcp如你所见,这两台虚拟机的配置中,唯一不同的地方就是IP地址。通过如上配置,我们的虚拟机就可以通过eth1来访问互联网,并通过eth0中设置的静态IP地址来访问彼此。最后一步,我们需要将两台虚拟机的名字放到两台虚拟机的

14、hosts文件中,这样我们就可以通过名字而不是IP地址来访问它们。puppetserver虚拟机上的etc/hosts文件内容如下所示。/etc/hosts on puppetserver12345678910       localhost       puppetserver    puppetclient # The following lines are desirab

15、le for IPv6 capable hosts:1     ip6-localhost ip6-loopbackfe00:0 ip6-localnetff00:0 ip6-mcastprefixff02:1 ip6-allnodesff02:2 ip6-allrouterspuppetclient虚拟机上的/etc/hosts文件内容如下所示。/etc/hosts on puppetclient12345678910       localhost

16、0;      puppetclient    puppetserver # The following lines are desirable for IPv6 capable hosts:1     ip6-localhost ip6-loopbackfe00:0 ip6-localnetff00:0 ip6-mcastprefixff02:1 ip6-allnodesff02:2 ip6-allrouters在重启两台虚拟机后,你应该能

17、够从puppetserver虚拟机上成功运行ping puppetclient命令,反过来也可以从puppetclient虚拟机上成功连接到puppetserver虚拟机,同样你也应该能够在自己的电脑上成功运行 ping  和 ping 。搭建Puppet服务器现在,我们已经建立了Puppet服务器和Puppet客户端的虚拟机,在虚拟机上安装了Ubuntu,并配置好了网络并正在运行,我们可以开始搭建Puppet服务器系统了。Ubuntu软件库为我们提供了将服务器系统变为Puppet服务器所需的全部内容,我们不需要手动

18、安装任何软件或者操作外部软件包。为了安装必要的软件包,我们需要使用ubuntu用户登录到puppetserver虚拟机,然后运行如下命令。On the puppetserver VM12# <strong>sudo apt-get update# <strong>sudo apt-get install puppetmaster我们不需要做其他步骤了,现在Puppet服务器可以使用一个合理的默认配置来运行了。搭建Puppet客户端建立Puppet客户端(或者用Puppet术语,代理)并在puppetclient虚拟机上运行它,和建立Puppet服务器并没有太大的区别。首

19、先我们需要安装Puppet客户端软件包。On the puppetclient VM12# sudo apt-get update# sudo apt-get install puppet然后,我们需要编辑etc/puppet/puppet.conf文件,来告诉Puppet代理Puppet服务器的域名,为此我们需要在该文件中添加一行:server=puppetserver。/etc/puppet/puppet.conf on puppetclient12345678910111213141516mainserver=puppetserverlogdir=/var/log/puppetvardi

20、r=/var/lib/puppetssldir=/var/lib/puppet/sslrundir=/var/run/puppetfactpath=$vardir/lib/factertemplatedir=$confdir/templatesprerun_command=/etc/puppet/etckeeper-commit-prepostrun_command=/etc/puppet/etckeeper-commit-post master# These are needed when the puppetmaster is run by passenger# and can

21、safely be removed if webrick is used.ssl_client_header = SSL_CLIENT_S_DN ssl_client_verify_header = SSL_CLIENT_VERIFY这样设置后,客户端就可以连接到puppetserver虚拟机上的Puppet master进程了,但它还不能真正和服务器进行通信,因为它还没有在已验证并允许的客户端列表里面。为了实现这一点,我们需要发起从客户端到服务器的第一个连接。在 puppetclient VM1# sudo puppet agent -verbose -no-daemonize -oneti

22、me这会向Puppet master进程发起一个连接,这个进程会监听puppetserver虚拟机上的8140端口。这个连接的输出会很详细,然后客户端(代理)就不再继续以后台daemon的方式运行。同时,它只会运行一次,也就是说,当这个连接关闭后,代理进程也会结束。如果所有的配置都正确,那么第一次运行时的输出如下所示。在 puppetclient VM 上,运行 Puppet 代理之后,1234info: Creating a new SSL key for puppetclientinfo: Creating a new SSL certificate request for puppetc

23、lientinfo: Certificate Request fingerprint (md5): 20:74:A7:BD:69:5D:50:8D:6A:79:67:6E:DC:5E:41:E0Exiting; no certificate found and waitforcert is disabled这个看上去似乎像是一个错误,但它实际上不是。客户端已经通过这次运行让服务器知道了它的信息了,但是服务器还没有接受这个客户端。下一步,我们必须签署puppetclient虚拟机已经创建的SSL认证请求,并将其发送给服务器。我们可以通过如下命令在服务器上查看那些还没有被签署的认证请求列表。在 p

24、uppetserver VM 上# sudo puppet cert -list这个命令会打印如下的列表。在 puppetserver VM 上"puppetclient" (20:74:A7:BD:69:5D:50:8D:6A:79:67:6E:DC:5E:41:E0)现在我们可以签署这个请求,这样我们就允许客户端在接下来的连接中可以收到服务器的信息。在 puppetserver VM 上1234# sudo puppet cert -sign puppetclient notice: Signed certificate request for pu

25、ppetclientnotice: Removing file Puppet:SSL:CertificateRequest puppetclient at '/var/lib/puppet/ssl/ca/requests/puppetclient.pem'切换回puppetclient虚拟机,我们现在能够初始化一个指向服务器的完整连接了。在 puppetserver VM 上12345678# sudo puppet agent -verbose -no-daemonize -onetime info: Caching certificate for puppetcl

26、ientinfo: Caching certificate_revocation_list for cainfo: Caching catalog for puppetclientinfo: Applying configuration version '1395687915'info: Creating state file /var/lib/puppet/state/state.yamlnotice: Finished catalog run in 0.02 seconds就是这样我们的Puppet基础结构已经完全建好并开始运行了。但是,在这个基础结构还并不能做任何事情。我

27、们的目标是通过运行在puppetserver虚拟机上的Puppet master,来管理puppetclient虚拟机上的配置。但是我们目前还没有定义任何信息来触发客户端的配置改动。这就是我们要在使用Puppet来构建可管理的服务器基础结构: 第二部分会涉及的内容。关于在第一部分中,我们已经建立了两个Linux系统虚拟机:puppetserver 和 puppetclient。我们已经实现了一个重要的里程碑:在虚拟机上分别安装了Puppet服务器和Puppet客户端软件,并且在Puppet服务器端对Puppet客户端进行了认证。接下来我们要在此基础上,开始通过在puppet

28、server虚拟机上的Puppet服务器,来配置puppetclient虚拟机系统。你好,Puppet我们以一个非常基本的示例开始。在这个示例中,我们为puppetclient虚拟机建立一个非常简单的配置:在puppetclient虚拟机系统的/home/ubuntu目录下创建一个名为helloworld.txt文件,文件的内容是”Hello World!”。Puppet自带一个功能强大的声明式配置语言。我们使用这种语言来编写的内容被称为清单(manifest)。Puppet清单是一个文件,它描述了目标系统中的某些方面应该是什么样的。在这个系列教程中,我们会编写很多不同的清单:其中一些会在目标

29、系统上创建一些文件;一些会创建用户账户;一些会安装软件包。清单会被应用到目标系统上。对Puppet来说,目标系统被称为节点(node)。我们的puppetclient虚拟机系统就是这样一个节点。我们已经为它做了Puppet服务器认证,这样可以保证Puppet服务器来管理这个节点。但我们的服务器还没有任何信息,可以用来管理这个节点。我们可以通过编写一个清单并将其放在节点上来改变它。为此,我们会创建一个非常简单的清单定义,这个定义会被放在puppetserver虚拟机系统的主清单文件中,文件的路径是/etc/puppet/manifests/site.pp:/etc/puppet/manifest

30、s/site.pp on puppetserver12345678910node "puppetclient"    file "/root/helloworld.txt":    ensure => file,    owner  => "root",    group  => "root",   

31、 mode   => 0644   我们稍后会看到,清单可以通过模块化的方式放到任意数目的不同文件中(这样可以帮助我们针对大型复杂的站点建立清单结构)。但是一切都还是从site.pp开始。我们来仔细分析一下这个最简化的清单,它包含两部分:一个包含file定义的node,因为file部分包含在node部分中,这样file部分的定义产生的结果会应用到名为puppetclient的节点上。通过在puppetclient虚拟机系统上运行Puppet代理,我们可以很容易理解上面描述的内容。On the puppetclient VM123

32、4# sudo puppet agent -verbose -no-daemonize -onetimeinfo: Caching catalog for puppetclientinfo: Applying configuration version '1395862307'notice: /Stagemain/Nodepuppetclient/File/home/ubuntu/helloworld.txt/ensure: creatednotice: Finished catalog run in 0.03 seconds或许这看上去没有什么大惊小怪:puppetclien

33、t虚拟机上的Puppet代理联系到puppetserver虚拟机上的Puppet master。然后它接收目录,这个目标就是在master上定义的所有和这个指定客户端有关的清单。如果你感兴趣的话,这个目录被存在一个yaml结构中,它存储在 /var/lib/puppet/client_yaml/catalog/puppetclient.yaml 中,这不仅仅是复制了我们的.pp清单,而是通过对清单进行解析,生成的一个关于目标配置信息的编译版本。接下来,Puppet代理开始采取行动当且仅当满足以下条件才会采取行动:Puppet代理会比较清单中期望的状况和目标节点上清单的状况,

34、如果其中有一些不同(如果目标节点上找到的状况并没有同步到期望达到的状况)那么代理就会做任何必需的操作来移除这些区别,来实现目标状况。在我们这个特定的示例中,代理知道在目标节点的/home/ubuntu目录下,应该有一个名为helloworld.txt的文件,这个文件的所有者和所在组是ubuntu,用户对该文件的访问权限是0644。然而,当检查本地系统时,发现并没有发现这个文件。代理会采取行动,来创建这个期待中的文件。我们可以通过再次运行代理来验证这个行为:On the puppetclient VM1234# sudo puppet agent -verbose -no-daemonize -

35、onetimeinfo: Caching catalog for puppetclientinfo: Applying configuration version '1395862542'notice: Finished catalog run in 0.03 seconds如我们所见,这次代理并没有做任何事情,这是因为目标节点的状况已经满足了。那如果我们修改目标节点上的状况会怎么样呢?让我们来修改这个文件的访问模式:在 puppetclient VM 上# chmod 0640 /home/ubuntu/helloworld.txt然后再次运行代理:在 puppet

36、client VM 上123456# sudo puppet agent -verbose -no-daemonize -onetime info: Caching catalog for puppetclientinfo: Applying configuration version '1395862307'notice: /Stagemain/Nodepuppetclient/File/home/ubuntu/helloworld.txt/ensure: creatednotice: Finished catalog run in 0.03 seconds代理注意

37、到了区别,然后通过修改文件访问模式来移除了这个区别。如果我们修改了文件的内容,会发生什么呢?在 puppetclient VM 上# echo "This is a test" > /home/ubuntu/helloworld.txt这时运行代理?在 puppetclient VM 上12345# sudo puppet agent -verbose -no-daemonize -onetime info: Caching catalog for puppetclientinfo: Applying configuration version &

38、#39;1395862542'notice: Finished catalog run in 0.03 seconds没有发生任何事情。为什么?因为在清单中,我们没有对文件内容进行任何描述。我们所做的是让Puppet来保证这个指定名字的文件是存在的,并且这个文件的一些元数据(拥有者、用户组、访问模式)应该有指定设置。Puppet只会关心那些我们让它去关心的事情。我们在之前示例中看到的行为,正好表明了Puppet哲学的核心。在我们的清单中,我们不告诉Puppet做什么,我们也不告诉它怎么去做,我们只告诉Puppet最终的结果应该是什么样子。这种哲学带来了巨大的能量,因为它对配置系统所需要

39、的繁重的工作进行了抽象。它抚平了不同的操作系统带来的差别。考虑下面一个场景,你有一个由不同的Linux系统构成的网络:有些运行Red Hat Linux,有些在运行Ubuntu Linux。我们进一步假设你希望在所有的系统上安装htop包。如果我们需要告诉Puppet做什么和怎么做,那么我们不得不编写一个清单,它在Ubuntu上使用apt-get,在Red Hat上使用yum。相反,我们所需要放到清单中的内容如下所示:123package "htop":  ensure => installed目标节点中的puppet代理会去搞清楚如何做,才能实现

40、清单中描述的目标场景。Red Hat系统中的代理会使用yum来安装包,而Ubuntu系统中的代理则会使用apt-get。我们在稍后会回来讨论包安装,让我们继续之前的文件示例。通过Puppet来创建一个空文件,通常都不是特别有用当然我们更喜欢部署一些带内容的文件。Puppet可以很容易做到:我们可以将文件放在puppetserver虚拟机上,然后通过Puppet将其传输到puppetclient虚拟机上。首先,我们在puppetserver虚拟机上创建源文件:在 puppetserver VM 上123# sudo -s# mkdir /etc/puppet/files# echo "

41、Hello World." &gt; /etc/puppet/files/helloworld.txt然后,我们需要允许Puppet客户端来访问这个文件,为此,我们需要修改puppetserver虚拟机上的/etc/puppet/fileserver.conf文件,添加一个allow *语句:/etc/puppet/fileserver.conf on puppetserver123456789101112131415161718# This file consists of arbitrarily named sections/modules# defining where files are served from and to whom# Define a section 'files'# Adapt the allow/deny settings to your needs. Order# for allow/deny does not matter, allow always takes precedence# over deny files  path /etc/puppet/files &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论