你的位置:首页 > 操作系统

[操作系统]用 Puppet 搭建易管理的服务器基础架构(1)


我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第一部分。

原文地址:http://blog.jobbole.com/87679/

 

本文由 伯乐在线 - Wing 翻译,黄利民 校稿。未经许可,禁止转载!
英文出处:Manue Kiessling。欢迎加入翻译组。

关于 Puppet

Puppet 是一种 Linux、Unix、Windows 平台的集中配置管理系统,使用自有的 Puppet 描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。Puppet把这些系统实体称之为资源,其设计目标是简化对这些资源的管理以及妥善处理资源之间的依赖关系。

在这一系列中,作者提供了一个可操作的全面教程,来逐步解释如何使用 Puppet 搭建一个集中式管理的 Linux 服务器基础结构。

目标读者

我相信有一类Linux系统管理员会从这个系列教程中收获最多,他们已经在管理一个小规模的服务器系统网络,想知道如何扩大现有的基础结构,并且为管理新增系统付出的的时间和精力,不会和新增系统的数目成正比。或许你目前在管理5个服务器系统,你可以问一下自己有没有更好的方法,可以在不增加人手的情况下,来管理50个服务器系统。或者你已经听说过集中式配置管理和Puppet, 并且渴望尝试一下。

先决条件

如果你的电脑安装了Linux、Windows 或者 Mac OS X 桌面操作系统,拥有至少4G内存,16G可用磁盘空间,并且CPU可以运行虚拟机,那就足够了。所有你要做的事情和需要的信息,我会在这个系列课程中为你说明。

开始

我无需说服你使用Puppet实现基于工具的配置管理,既然你能读到这里,你可能已经想要使用它了,所以让我们马上开始吧。

我承诺这是一个易上手的全面的教程,为此,我们需要准备一个环境,这样我们可以不仅可以讨论如何使用Puppet,而且能够创建一个虽然很小但是真实的服务器基础结构,在这个基础结构中,我们会运行一个Puppet服务器,它会管理一个Puppet客户端。换句话说,我们需要两个Linux虚拟机。

在这个教程中,我愿意使用两个 Ubuntu 12.04 LTS Precise Pangolin 系统,这只是因为我对这个Linux发行版本最有经验。如果你使用更新版本的Ubuntu或者Debian 7.0 Wheezy,那么这里描述的步骤应该不会有很大的区别。

我们要做的第一件事情是从Oracle网站下载安装VirtualBox。这是一个免费的虚拟机管理软件,我们可以使用它来运行上面提到的两个虚拟Ubuntu系统。在写这篇教程时,VirtualBox的最新发布版本是4.3.8-92456,你可以前往http://download.virtualbox.org/virtualbox/4.3.8/ ,然后根据使用的操作系统,来下载VirtualBox-4.3.8-92456-Win.exeVirtualBox-4.3.8-92456-OSX.dmg, 或者 VirtualBox-4.3.8-92456-Linux_amd64.run。一旦下载完成后,你就可以使用默认选项进行安装了。

一旦将VirtualBox安装到你的电脑后,你就需要下载Ubuntu 12.04 LTS 64位服务器版本的安装媒介了,你可以前往 http://releases.ubuntu.com/12.04/, 然后选择64-bit PC (AMD64) server install CD 链接来进行下载,我们会使用这个ISO来安装两个虚拟机。

一旦将ISO文件完全下载到你的电脑后,你可以打开VirtualBox,在Machine菜单下选择New…

我们开始安装虚拟机,这个虚拟机会被当做Puppet服务器,因此在弹出窗口中,我们将虚拟机的名字设置为puppetserver。接下来将Type设置为Linux,将Version设置为Ubuntu(64bit)。 将内存大小设置为512M就足够了。让VirtualBox来为虚拟机创建一个硬盘文件(将大小设置为8G就足够了)。

现在你就可以启动最新创建的虚拟机了。VirtualBox会向你询问安装媒介,这里需要指向你已经下载完毕的Ubuntu ISO文件的路径。

VirtualBox就会启动虚拟机并引导进入Ubuntu的安装CD,选择English作为安装过程中使用的语言,然后选择Install Ubuntu Server继续安装。

在安装过程中,你应该进行如下设置:

  • 语言:English
  • 国家:选择你的国家
  • Locale:en_US.UTF-8
  • 键盘:选择最适合你需要的键盘布局
  • 默认用户:ubuntu,密码ubuntu
  • 加密home目录:No
  • 时区:选择你所在的时区
  • 分区:Guided – use entire disk
  • 当被询问需要安装哪些包时,只选择OpenSSH server
  • 将grub安装进MBR
  • 将系统时钟设置为UTC
  • 不要自动安装安全更新。

一旦第一个虚拟机的安装完成后,启动它并进入。然后,我们创建第二个虚拟机,这个虚拟机是我们的puppet客户端。你可以参考安装第一个虚拟机时的处理方式,但其中有一个例外:在VirtualBox内部安装Ubuntu的过程中,将第二台虚拟机的名字设置为 puppetclient,而不是 puppetserver

在完成安装后,你可以像操作第一台虚拟机那样,启动并进入第二台虚拟机。这时你会看到两个VirtualBox的窗口,都在运行Ubuntu 12.04, 都向你提示输入登录信息。接下来,我们需要对VirtualBox进行一些配置,因此你需要登陆到两台虚拟机(用户名:ubuntu,密码:ubuntu),然后通过命令sudo poweroff来关闭它们。

网络

因为我们要建立一个Puppet服务器和客户端,所以这两台虚拟机需要通过网络彼此通信。同时,如果能够从我们自己的电脑连接到这两台虚拟机,也会比较方便,这样我们可以通过SSH的方式连接到虚拟机,而不是通过一个很小的不易用的VirtualBox控制台。最后还有重要的一点,这两台虚拟机需要能够连接到互联网,这样才可以安装相关软件。

为了实现这些,我们需要两个虚拟的网络,一个Host-only网络和一个NAT网络。这两台虚拟机则各需要有两个以太网适配器,其中eth0用来连接到Host-only网络,eth1用来连接到NAT网络。

Host-only网络允许这两台虚拟机可以彼此连接,也允许我们可以使用自己的电脑连接到这两台虚拟机上。NAT网络则允许这两台虚拟机可以访问互联网。

VirtualBox本身已经建立了这两种网络。选择File -> Preference,然后找到Network,其中NAT Networks选项卡中虽然没有列出任何网络,但其实一直会存在一个可用的网络,因此我们不需要再额外配置一个。然后切换到Host-only Networks选项卡。我们需要确保有一个名为vboxnet0的网络是可用的。点击在列表旁边的小螺丝刀图标,在弹出的窗口中,需要确认AdapterDHCP Server的配置如下所示。

Host-only网络中,我们自己的电脑的IP地址被自动设置为192.168.56.1,我们的puppetserver虚拟机应该设置为192.168.56.2,puppetclient虚拟机应该设置为192.168.56.3。

为了做到如上配置,我们需要在两个虚拟机内打开Settings对话框,找到Network,然后将Adapter 1绑定到Host-only Adapter,并将Name设置为vboxnet0。然后将Adapter 2绑定到NAT(注意:不是NAT Network!)。这些配置在两台虚拟机上必须保持一致。

现在启动两台虚拟机并使用ubuntu用户信息登录系统。我们需要在两台虚拟机内编辑/etc/network/interfaces文件来配置网络接口。对于puppetserver来说,该文件如下所示。

/etc/network/interfaces on puppetserver

1
2
3
4
5
6
7
8
9
10
auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet static
    address 192.168.56.2
    netmask 255.255.255.0
 
auto eth1
iface eth1 inet dhcp



对于 puppetclient 来说,该文件如下所示。

/etc/network/interfaces on puppetclient

1
2
3
4
5
6
7
8
9
10
auto lo
iface lo inet loopback
 
auto eth0
iface eth0 inet static
    address 192.168.56.3
    netmask 255.255.255.0
 
auto eth1
iface eth1 inet dhcp



如你所见,这两台虚拟机的配置中,唯一不同的地方就是IP地址。通过如上配置,我们的虚拟机就可以通过eth1来访问互联网,并通过eth0中设置的静态IP地址来访问彼此。

最后一步,我们需要将两台虚拟机的名字放到两台虚拟机的hosts文件中,这样我们就可以通过名字而不是IP地址来访问它们。puppetserver虚拟机上的etc/hosts文件内容如下所示。

/etc/hosts on puppetserver

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
 
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters



puppetclient虚拟机上的/etc/hosts文件内容如下所示。

/etc/hosts on puppetclient

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
 
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters



在重启两台虚拟机后,你应该能够从puppetserver虚拟机上成功运行ping puppetclient命令,反过来也可以从puppetclient虚拟机上成功连接到puppetserver虚拟机,同样你也应该能够在自己的电脑上成功运行 ping 192.168.56.2 和 ping 192.168.56.3

搭建Puppet服务器

现在,我们已经建立了Puppet服务器和Puppet客户端的虚拟机,在虚拟机上安装了Ubuntu,并配置好了网络并正在运行,我们可以开始搭建Puppet服务器系统了。

Ubuntu软件库为我们提供了将服务器系统变为Puppet服务器所需的全部内容,我们不需要手动安装任何软件或者操作外部软件包。

为了安装必要的软件包,我们需要使用ubuntu用户登录到puppetserver虚拟机,然后运行如下命令。

On the puppetserver VM

1
2
~# <strong>sudo apt-get update
~# <strong>sudo apt-get install puppetmaster



我们不需要做其他步骤了,现在Puppet服务器可以使用一个合理的默认配置来运行了。

搭建Puppet客户端

建立Puppet客户端(或者用Puppet术语,代理)并在puppetclient虚拟机上运行它,和建立Puppet服务器并没有太大的区别。首先我们需要安装Puppet客户端软件包。

On the puppetclient VM

1
2
~# sudo apt-get update
~# sudo apt-get install puppet



然后,我们需要编辑etc/puppet/puppet.conf文件,来告诉Puppet代理Puppet服务器的域名,为此我们需要在该文件中添加一行:server=puppetserver

/etc/puppet/puppet.conf on puppetclient

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]
# These are needed when the puppetmaster is run by passenger
# and can 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 VM

1
~# sudo puppet agent --verbose --no-daemonize --onetime



这会向Puppet master进程发起一个连接,这个进程会监听puppetserver虚拟机上的8140端口。这个连接的输出会很详细,然后客户端(代理)就不再继续以后台daemon的方式运行。同时,它只会运行一次,也就是说,当这个连接关闭后,代理进程也会结束。

如果所有的配置都正确,那么第一次运行时的输出如下所示。

在 puppetclient VM 上,运行 Puppet 代理之后,

1
2
3
4
info: Creating a new SSL key for puppetclient
info: Creating a new SSL certificate request for puppetclient
info: Certificate Request fingerprint (md5): 20:74:A7:BD:69:5D:50:8D:6A:79:67:6E:DC:5E:41:E0
Exiting; no certificate found and waitforcert is disabled



这个看上去似乎像是一个错误,但它实际上不是。客户端已经通过这次运行让服务器知道了它的信息了,但是服务器还没有接受这个客户端。下一步,我们必须签署puppetclient虚拟机已经创建的SSL认证请求,并将其发送给服务器。我们可以通过如下命令在服务器上查看那些还没有被签署的认证请求列表。

在 puppetserver 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 上

1
2
3
4
~# sudo puppet cert --sign puppetclient
 
notice: Signed certificate request for puppetclient
notice: Removing file Puppet::SSL::CertificateRequest puppetclient at '/var/lib/puppet/ssl/ca/requests/puppetclient.pem'



切换回puppetclient虚拟机,我们现在能够初始化一个指向服务器的完整连接了。

在 puppetserver VM 上

1
2
3
4
5
6
7
8
~# sudo puppet agent --verbose --no-daemonize --onetime
 
info: Caching certificate for puppetclient
info: Caching certificate_revocation_list for ca
info: Caching catalog for puppetclient
info: Applying configuration version '1395687915'
info: Creating state file /var/lib/puppet/state/state.yaml
notice: Finished catalog run in 0.02 seconds



就是这样——我们的Puppet基础结构已经完全建好并开始运行了。但是,在这个基础结构还并不能做任何事情。我们的目标是通过运行在puppetserver虚拟机上的Puppet master,来管理puppetclient虚拟机上的配置。但是我们目前还没有定义任何信息来触发客户端的配置改动。这就是我们要在使用Puppet来构建可管理的服务器基础结构: 第二部分会涉及的内容。