话说工欲善其事,必先利其器。当我们面对几十台机器需要同时进行环境管理时,一个适合的工具就非常重要了,这里我们介绍的工具是puppet,也就是google正在使用的devops工具。当新的工具引入时,大家肯定都会有个疑问:这个工具的使用成本有多高,让它运行起来困难吗?这篇文档将会回答这个问题,答案就是,搭建一个puppet的运行环境非常简单。
当然,第一个问题是puppet能帮我们做什么,当然,它能帮我们管理大量机器的环境,那么,它是如何做到这一点的?
一、 puppet的工作模式
puppet通过master/agent的工作模式管理环境,我们使用一台服务器作为我们的master,master的最重要职责就是管理需要应用到各个agent节点上的环境状态说明,这个环境状态说明我们使用manifest这个单词来描述。
需要被管理的机器我们称为agent,它们定时的去master查看是否有新的manifest需要应用,如果有的话就应用使自己的环境与master所要求的环境一致,并返回执行的结果report。
想象一下,我们是连锁酒店比如如家的老板,作为连锁酒店我们需要保持酒店风格的一致性,于是我找到了总管(master),我告诉他,我们现在有两种房间,一个是标准间一个是单人间,标准间的状态说明manifestA是两张床,单人间的状态说明manifestB是一张床,你去办。总管回答说,好,没问题。具体的各个房间就是agent,总管先给这些房间分类,1、2、3属于标准间,4、5、6属于单人间,总管对这些房间说,标准间要应用manifestA有两张床,单人间要应用manifestB有一张床。于是,奇迹发生了,所有的agent都拿到了各自的manifest,于是,属于标准间的agent给自己放了两张床,属于单人间的agent给自己放了一张床,然后将执行完的结果告诉了master。很好,又过了一天,我发财了,想给标准间增加电视这个manifest,我对master说,标准间,电视。于是agent们又照办了。可是有问题了,有人抗议单人间没有电视,怎么办?我想了想,决定标准间也不放电视了,也就是状态要回滚,怎么办?于是我将manifest们用SVN管理起来,直接回滚,真爽。
二、 安装puppet
好吧,我们已经了解了puppet的工作模式,那么接下来就是,我们如何安装puppet呢?恩,等等,我们好像要安装两种模式呢,master和agent。对的,master和agent是puppet两种不同的运行模式,但它们的安装却是相同的。我们需要在master服务器和所有需要被管理的机器上都安装puppet。
安装puppet需要先安装它的依赖,puppet依赖于ruby和facter。Ruby自然不用多说,因为puppet就是ruby写的,facter是做什么的呢?它是用以侦测机器的环境的,比如说机器是实体机还是虚拟机?机器安装的操作系统是什么?IP地址是什么?有了facter,统统搞定。
1、 安装ruby
版本1.8.7,源代码安装,ruby-1.8.7.tar.gz已经躺在版本库里了。
Ø 解压:
gzip -d -c ruby-1.8.7.tar.gz| tar xf -
Ø 配置:
cd ruby-1.8.7
./configure
Ø 安装:
sudo make
sudo make install
Ø 运行:
ruby --version
2、 安装facter
版本1.6.3,源代码安装,facter-1.6.3.tar.gz同样已经在版本库里。
Ø 解压:
gzip -d -c facter-1.6.3.tar.gz| tar xf -
Ø 安装:
cd facter-1.6.3
sudo ruby install.rb
Ø 运行:
facter --version
3、 安装puppet
版本2.7.6,源代码安装,puppet-2.7.6.tar.gz同样已经在版本库里。
Ø 解压:
gzip -d -c puppet-2.7.6.tar.gz| tar xf -
Ø 安装:
cd puppet-2.7.6
sudo ruby install.rb
Ø 运行:
puppet --version
三、 配置puppet
安装完毕,我们开始配置,配置分为三步:配置master、配置agent以及建立master和agent之间的通联。
1、 配置master
Ø 配置/etc/hosts
127.0.0.1 localhost master.puppet.com
Ø 配置puppet配置文件
Puppet的主配置文件为puppet.conf,位于/etc/puppet, 我们不需要改动。
几个重要的配置项:
n confdir:puppet主工作目录,主要放置puppet配置文件、manifests、认证证书以及模块,静态内容。其中manifests和模块需要被SVN管理。默认/etc/puppet。
n vardir:puppet运行时数据放置地址,主要有缓存的数据、报表、备份文件等,动态内容。默认/var/lib/puppet。
n manifestdir:manifests放置的目录,默认/etc/puppet/manifests
n modulepath:puppet运行时查找模块的搜索路径。同样,模块需要被SVN管理。默认/etc/puppet/modules。
我们可以通过下面命令查看puppet的各项配置:
puppet master –configprintconfdir
Ø 创建puppet用户/组
puppet master启动需要创建puppet这个用户和puppet这个用户组。
puppet master --mkusers
Ø 启动
puppet master
这是一个后台程序
2、 配置agent
Ø 配置/etc/hosts
127.0.0.1 localhost agent1.puppet.com
10.6.222.87 [masterip] master.puppet.com
Ø 配置puppet配置文件
与master相比,增加server的配置
server =master.puppet.com
3、 建立master与agent之间的通联
Ø agent向master申请ssl证书
puppet agent --test
Ø master认证agent请求
puppet cert list
puppet cert sign agent1.puppet.com
Ø 启动agent
puppet agent
四、 运行一个测试
好了,我们现在已经建立起puppet整个的运行环境了,是时候测试一下了。还记得在哪里放置我们的manifest吗?是的,在master机器,在manifestdir中。我们建立site.pp这个文件,声明我们想有个helloworld的文件。
#site.pp
file { "/tmp/helloworld":
content => “hello world!”
}
等待一下,会发生什么?是的,在agent机器上,我们能够看到/tmp/helloworld这个文件被建立了,内容也正是我们期望的“hello world!”。就是这样!很简单!