[翻译]用 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.exe, VirtualBox-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的网络是可用的。点击在列表旁边的小螺丝刀图标,在弹出的窗口中,需要确认Adapter和DHCP 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 loiface lo inet loopbackauto eth0iface eth0 inet static address 192.168.56.2 netmask 255.255.255.0auto eth1iface eth1 inet dhcp |
对于 puppetclient 来说,该文件如下所示。
/etc/network/interfaces on puppetclient
|
1
2
3
4
5
6
7
8
9
10
|
auto loiface lo inet loopbackauto eth0iface eth0 inet static address 192.168.56.3 netmask 255.255.255.0auto eth1iface 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 localhost127.0.1.1 puppetserver192.168.56.3 puppetclient# 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 |
puppetclient虚拟机上的/etc/hosts文件内容如下所示。
/etc/hosts on puppetclient
|
1
2
3
4
5
6
7
8
9
10
|
127.0.0.1 localhost127.0.1.1 puppetclient192.168.56.2 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 |
在重启两台虚拟机后,你应该能够从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=puppetserverlogdir=/var/log/puppetvardir=/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 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 puppetclientinfo: Creating a new SSL certificate request for puppetclientinfo: 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认证请求,并将其发送给服务器。我们可以通过如下命令在服务器上查看那些还没有被签署的认证请求列表。
在 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 puppetclientnotice: Signed certificate request for puppetclientnotice: 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 --onetimeinfo: Caching certificate for puppetclientinfo: 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基础结构已经完全建好并开始运行了。但是,在这个基础结构还并不能做任何事情。我们的目标是通过运行在puppetserver虚拟机上的Puppet master,来管理puppetclient虚拟机上的配置。但是我们目前还没有定义任何信息来触发客户端的配置改动。这就是我们要在使用Puppet来构建可管理的服务器基础结构: 第二部分会涉及的内容。
[翻译]用 Puppet 搭建易管理的服务器基础架构(1)的更多相关文章
- [翻译]用 Puppet 搭建易管理的服务器基础架构(4)
我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第四部分. 原文地址:http://blog.jobbole.com/89214/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...
- [翻译]用 Puppet 搭建易管理的服务器基础架构(3)
我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加 ...
- [翻译]用 Puppet 搭建易管理的服务器基础架构(2)
我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第二部分. 原文地址:http://blog.jobbole.com/87680/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...
- SaltStack 是一个服务器基础架构集中化管理平台
SaltStack详细部署 一.基础介绍============================================================================== ...
- Linux系统搭建并管理Git服务器
搭建Git服务器 GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓 ...
- phpMyAdmin搭建及管理多台数据库服务器
phpMyAdmin搭建及管理多台数据库服务器 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 php-5.5. ...
- 用go-module作为包管理器搭建go的web服务器
本篇博客主要介绍了如何从零开始,使用Go Module作为依赖管理,基于Gin来一步一步搭建Go的Web服务器.并使用Endless来使服务器平滑重启,使用Swagger来自动生成Api文档. 源码在 ...
- 搭建kerberos和NTP服务器以及安全的NFS服务
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独搭建Kerberos和NTP时钟服务的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需 ...
- 搭建自己的Nuget服务器
序言 你们公司有没有好多项目,有没有好多类库,你们的类库是在tfs中管理,还是svn或者github,又或者是各自为政版本类库随意使用? 那么你们使用者写类库的时候方便吗? 有没有更新下载,版本不一致 ...
随机推荐
- 几个最常用的用来代替Div的HTML5元素
虽说html5中大多数功能性的元素如<video><canvas><audio>等还得不到当前主流浏览器的支持(主要就是指IE浏览器了),但至少那些个与布局相关的元 ...
- .NET Memory Profiler 查看内存使用情况
1 简介 .Net Memory Profiler(以下简称Profiler):专门针对于.NET程序,功能最全的内存分析工具,最大的特点是具有内存动态分析(Automatic Memory Anal ...
- iOS-Swift编程
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- OpenCASCADE Curve Length Calculation
OpenCASCADE Curve Length Calculation eryar@163.com Abstract. The natural parametric equations of a c ...
- ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
出于编程上的便利,我们通常不会直接利用ConfigurationBuilder创建的Configuration对象读取某个单一配置项的值,而是倾向于将一组相关的配置绑定为一个对象,我们将后者称为Opt ...
- css:图标与文字对齐的两种方法
(好久没写博客了,这几个月的积累比较零碎,记在本子上,现在开始整理归类) 在平时写页面的过程中,常遇到要把小图标与文字对齐的情况.比如: 总结了两种方法,代码量都比较少. 第一种 对img设置竖直方向 ...
- C++基础知识
基础知识 &&和||具有"短路"特性,特别是在第二个操作数有++或--时要注意. 显式类型转换 (类型说明符)表达式 //C风格的 类型说明符(表达式) //cpp ...
- Machine Learning
Recently, I am studying Maching Learning which is our course. My English is not good but this course ...
- MySQL入门02-MySQL二进制版本快速部署
在上篇文章 MySQL入门01-MySQL源码安装 中,我们介绍了MySQL源码安装的方法. 源码安装虽然有着更加灵活和更加优化等诸多优势.但源码编译安装部署的过程相对复杂,而且整个过程所花费的时间很 ...
- 简析Geoserver中获取图层列表以及各图层描述信息的三种方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 实际项目中需要获取到Geoserver中的图层组织以及各图层 ...