本文首发于烂泥行天下

有关服务器的自动化管理,这方面以前没有接触过。打算这段时间把这块知识给补上。

现在服务器自动化管理软件,使用最多也最火的就是puppet了。

那么我们今天的主角也就是puppet。分以下几个步骤来介绍:

1、 puppet是什么

2、 puppet优点

3、 安装准备工作

4、 环境准备

5、 源码安装puppet

6、 RPM安装puppet

7、 puppet证书授权

8、 puppet资源

一、puppet是什么

puppet是一种基于ruby语言开发的Lnux、Unix、windows平台的集中配置管理系统。它使用自有的puppet描述语言,可管理配置文件file、用户user、cron任务、软件包、系统服务等系统实体。

puppet把这些系统实体称之为资源,puppet设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。

puppet依赖于C/S(客户端/服务器)的部署架构。它需要在puppet服务器上安装puppet-server软件包(以下简称master),在需要管理的目标主机上安装puppet客户端软件(以下简称agent)。

当agent连接上master后,定义在master端的配置文件会被编译,然后在agent上运行。每个agent默认30分钟会连接一次master,确认配置信息的更新情况。但是这种方式在很多场景下不是很符合系统管理员的要求,所以很多系统管理员也会将agent通过crontab(任务计划)来管理,这样会更加灵活一些。

二、puppet优点

puppet的语法允许你创建一个单独的脚本,用来在你所有的目标主机上建立一个用户。所有的目标主机会依次使用适合本地系统的语法来解释和执行这个模块。如果这个配置是在Red Hat服务器上执行的话,建立用户使用useradd命令,如果这个配置是在FreddBSD服务器上执行的话,则使用adduser命令。

puppet另外一个卓越的地方就是它的灵活性。源于开源软件的天性,你可以自由地获得puppet的源代码。如果你遇到问题并且有能力处理的话,你可以修改或加强puppet的代码使其适用于你的环境,然后解决这个问题。

puppet也是易于扩展的。定制软件包的支持功能和特殊的系统环境配置能够快速简单地添加至puppet的安装程序中。

三、安装准备工作

本次实验OS为centos 6.5 64bit,服务端为:192.168.199.247,客户端为192.168.199.248。

在正式实验之前,我们有几个事情需要先进行处理。

3.1 主机时间同步

为了减少在实验过程中不必要的麻烦,我们需要对所有主机(包括服务器和客户端)进行时间同步。即服务器与客户端的时间相差不能超过秒级。

使用以下命令进行时间同步,如下:

ntpdate timekeeper.isi.edu

clip_p_w_picpath001

如果在进行时间同步时,出现如下错误:

21 Jan 17:20:45 ntpdate[2720]: the NTP socket is in use, exiting

clip_p_w_picpath002

请关闭主机的ntpd服务,然后再进行时间同步。

/etc/init.d/ntpd stop

clip_p_w_picpath003

3.2 修改主机名

因为安装 puppet 时会把主机名写入证书,同时客户端和服务端之间通信需要这个证书。所以需要修改服务器与客户端的主机名。

修改主机名。如下:

hostname s.ilanni.com

执行此命令,可以使主机的主机名立即生效。但是服务器重启后,此修改就会失效。

clip_p_w_picpath004

要是主机名永久生效的话,需要修改/etc/sysconfig/network文件。如下:

cat /etc/sysconfig/network

烂泥:puppet3.7安装与配置_第1张图片

本次实验,我们就不搭建DNS服务器,直接通过修改服务端与客户端的hosts文件来达到各自解析域名的目的。如下:

cat /etc/hosts

192.168.199.247 s.ilanni.com

192.168.199.248 c.ilanni.com

烂泥:puppet3.7安装与配置_第2张图片

3.3 关闭iptables和selinux

我们现在所有的实验都是在关闭iptables和selinux下进行的。

/etc/init.d/iptables status

cat /etc/selinux/config

烂泥:puppet3.7安装与配置_第3张图片

四、环境准备

puppet的安装可以分为源码安装和RPM安装,但是无论哪一种安装方法,我们都需要在安装之前对其进行几点需要说明。

4.1 puppet安装说明

1、由于puppet是采用ruby语言开发,所以无论是源码还是RPM方式安装puppet,我们都必须要先安装ruby语言环境

2、puppet从2.7版本以后,就需要hiera的支持。所以也必须安装hiera。

3、在前面章节中,我们说明了puppet是一个配置管理系统,而管理的资源,都是系统的实体。但是这些实体,是如何来的呢?这就需要我们安装另外一个资源收集软件—facter。

facter主要用来收集主机的一些信息,比如:CPU、主机IP等。facter把这些收集的信息发送给puppet服务器端,服务器端就可以根据不同的条件来对不同的节点机器生成不同的puppet配置文件。

facter也是ruby语言开发的,这个我们可以在facter的安装文档中可以查看到,如下:

cat README.md

烂泥:puppet3.7安装与配置_第4张图片

4.2 安装ruby

ruby的安装比较简单,我们在此使用是yum进行安装。如下:

yum -y install ruby

烂泥:puppet3.7安装与配置_第5张图片

ruby安装完毕后,我们来查看其生成的文件。如下:

rpm -ql ruby

烂泥:puppet3.7安装与配置_第6张图片

我们可以查看ruby的帮助信息,如下:

ruby -h

烂泥:puppet3.7安装与配置_第7张图片

除此之外,我们还要安装ruby-rdoc这个软件包。该软件包主要用于查看ruby的帮助文档。如下:

yum -y install ruby-rdoc

烂泥:puppet3.7安装与配置_第8张图片

以上就是和ruby有关的软件包,安装完毕后,我们开始来安装facter。

4.3 安装facter

facter我们可以从puppet官网下载,如下:

http://downloads.puppetlabs.com/facter/

烂泥:puppet3.7安装与配置_第9张图片

注意:facter也可以通过yum进行安装,在此我们使用的是源码安装。

下载facter最新的版本,如下:

wget http://downloads.puppetlabs.com/facter/facter-2.3.0.tar.gz

烂泥:puppet3.7安装与配置_第10张图片

解压facter软件包,如下:

tar -xf facter-2.3.0.tar.gz

烂泥:puppet3.7安装与配置_第11张图片

开始安装facter,如下:

ruby install.rb或者./install.rb

烂泥:puppet3.7安装与配置_第12张图片

烂泥:puppet3.7安装与配置_第13张图片

facter安装完毕后,我们来查看下facter的使用帮助。如下:

facter -h

烂泥:puppet3.7安装与配置_第14张图片

如果想查看facter详细帮助信息,我们也可以man下facter。如下:

man facter

烂泥:puppet3.7安装与配置_第15张图片

如果安装没有问题的话,我们在执行facter命令后,会显示facter收集的相关信息。如下:

facter

烂泥:puppet3.7安装与配置_第16张图片

4.4 安装hiera

hiera主要用于控制一些agent经常变化的数值,在puppet2.7以后的版本必须要安装。如果不安装的话,我们在安装puppet时,系统会提示如下错误:

Could not load hiera; cannot install

烂泥:puppet3.7安装与配置_第17张图片

但是在安装hiera之前,我们必须安装额外的yum源,否则系统会提示找不到该软件包。

该yum源,我们可以puppet官网查看到。如下:

https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives

烂泥:puppet3.7安装与配置_第18张图片

按照puppet官网的方法进行安装。如下:

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

clip_p_w_picpath023

yum源配置完毕后,我们现在来安装hiera。如下:

yum -y install hiera

烂泥:puppet3.7安装与配置_第19张图片

以上安装完毕后,我们就可以正式安装puppet。

五、 源码安装puppet

puppet服务端与客户端的源码安装使用的是同一个软件包,安装步骤一样,只是在配置文件方面有细微的差别。

在下载puppet源码之前,我们还要在master端和agent端创建puppet运行时使用的用户puppet。master端如果不创建的话,master在启动时,会报如下错误:

烂泥:puppet3.7安装与配置_第20张图片

创建puppet用户,如下:

useradd -M -s /sbin/nologin puppet

cat /etc/passwd |grep puppet

烂泥:puppet3.7安装与配置_第21张图片

注意:puppet服务端是以puppet用户运行的,而puppet客户端是root用户运行。

这样做的目的是:master在服务端以普通用户运行安全性比较高,而agent在客户端以root用户运行,是因为master在创建用户、修改系统文件等资源时,需要具有最高权限。

5.1 puppet源码安装

puppet的源码包,我们可以从puppet官网下载。目前puppet最新版为3.7.3.如下:

http://downloads.puppetlabs.com/puppet/

烂泥:puppet3.7安装与配置_第22张图片

下载puppet软件包。如下:

wget http://downloads.puppetlabs.com/puppet/puppet-3.7.3.tar.gz

烂泥:puppet3.7安装与配置_第23张图片

解压puppet软件包,如下:

tar -xf puppet-3.7.3.tar.gz

烂泥:puppet3.7安装与配置_第24张图片

puppet的安装方法与facter的安装一样,如下:

ruby install.rb或者./install.rb

烂泥:puppet3.7安装与配置_第25张图片

puppet安装完毕后,我们来查看下其帮助信息,如下:

puppet help

烂泥:puppet3.7安装与配置_第26张图片

查看puppet的安装位置如下:

ll /etc/puppet/

烂泥:puppet3.7安装与配置_第27张图片

以上就是puppet的安装,安装完毕后。我们现在来配置puppet。

5.2 master端配置

puppet安装完毕后,我们来配置下master端。把puppet源码包ext/redhat/目录下的puppet.conf文件复制到puppet的安装目录/etc/puppet/下,如下:

cp ext/redhat/puppet.conf /etc/puppet/

vi /etc/puppet/puppet.conf

server = s.ilanni.com

certname = s.ilanni.com

pluginsync = false

其中s.ilanni.com表示puppet服务器的主机名。

pluginsync = false表示关闭模块中的插件功能

clip_p_w_picpath033

烂泥:puppet3.7安装与配置_第28张图片

配置文件修改完毕后,我们现在来配置master端的启动脚本。

复制puppet源码包ext/redhat/目录下的server.init文件到/etc/init.d/下,并重命名为puppetmaster。然后赋予puppetmaster可执行权限。如下:

cp ext/redhat/server.init /etc/init.d/puppetmaster

chmod u+x /etc/init.d/puppetmaster

烂泥:puppet3.7安装与配置_第29张图片

注意:master端启动,我们也可以通过puppet master命令来启动。如下:

puppet master

netstat -tunlp |grep "8140"

ps aux |grep puppet

烂泥:puppet3.7安装与配置_第30张图片

其实puppetmaster启动脚本就是使用puppet master命令启动的,如下:

cat /etc/init.d/puppetmaster

烂泥:puppet3.7安装与配置_第31张图片

把puppetmaster加入到开机启动项。如下:

chkconfig --add puppetmaster

chkconfig puppetmaster on

chkconfig |grep puppetmaster

烂泥:puppet3.7安装与配置_第32张图片

以上都配置完毕后,我们来启动puppet服务,如下:

/etc/init.d/puppetmaster start

ps aux |grep puppet

netstat -tunlp

烂泥:puppet3.7安装与配置_第33张图片

通过上图,我们可以很puppet服务使用TCP协议的8140端口,而且运行时使用puppet用户。

puppet服务端配置完毕后,我们现在来配置puppet客户端。

5.3 agent端配置

agent端的配置,只需要把puppet.conf文件复制到puppet的安装目录/etc/puppet/下即可,如下:。

cp ext/redhat/puppet.conf /etc/puppet/

cat /etc/puppet/puppet.conf

server = s.ilanni.com

pluginsync = false

其中s.ilanni.com表示puppet服务器的主机名。

pluginsync = false表示关闭模块中的插件功能

烂泥:puppet3.7安装与配置_第34张图片

agent端启动,我们可以通过puppet agent命令来启动。如下:

puppet agent

ps aux |grep puppet

clip_p_w_picpath041

通过上图,我们也可以看出agent端运行时使用的用户为root,而不是puppet用户。

注意:agent端我们使用puppet agent命令来进行各种管理,包括证书的申请、资源的同步,我们都是通过这个命令进行的。

agent可以以两种方式运行:第一种方式是命令接参数连接master,第二种是以守护进程的形式在系统后台运行,默认每30分钟连接一次master,但是这样并不灵活。我们一般是使用第一种方式,并配合crontab使用。

六、 RPM安装puppet

RPM方式安装puppet比较简单,我们只需yum安装即可。如下:

6.1 puppet安装准备工作

在使用RPM安装之前,我们要先配置额外的yum源,否则系统会提示找不到puppet软件包。如下:

yum -y install puppet-server

烂泥:puppet3.7安装与配置_第35张图片

安装额外的yum源,我们可以在puppet的官网查找到yum源。如下:

https://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#for-red-hat-enterprise-linux-and-derivatives

烂泥:puppet3.7安装与配置_第36张图片

按照puppet官网的方法进行安装。如下:

rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm

clip_p_w_picpath023[1]

注意:该yum源无论是master端和agent端都需要进行配置。

6.2 master端安装与配置

现在开始yum安装master端,如下:

yum -y install puppet-server

烂泥:puppet3.7安装与配置_第37张图片

烂泥:puppet3.7安装与配置_第38张图片

通过上图,我们可以看到安装puppet-server是要依赖于facter、hiera和puppet三个软件包。

现在我们来查看puppet-server安装时新建的用户以及puppet服务运行时所用的用户,如下:

cat /etc/passwd

ps aux |grep puppet

烂泥:puppet3.7安装与配置_第39张图片

clip_p_w_picpath046

通过上图,我们可以看到puppet-server在安装时确实新建用户puppet,以及在运行时使用的确实puppet用户。

查看puppet服务所使用的端口,如下:

/etc/init.d/puppetmaster start

netstat -tunlp

烂泥:puppet3.7安装与配置_第40张图片

master端安装完毕后,我们来配置puppet服务的配置文件,其方法和源码安装方法一样。如下:

vi /etc/puppet/puppet.conf

server = s.ilanni.com

certname = s.ilanni.com

pluginsync = false

烂泥:puppet3.7安装与配置_第41张图片

6.3 agent端安装与配置

master端安装完毕后,我们来安装agent端如下:

yum -y install puppet

烂泥:puppet3.7安装与配置_第42张图片

烂泥:puppet3.7安装与配置_第43张图片

RPM安装的puppet客户端与源码安装的一样,我们现在来启动puppet客户端。如下:

烂泥:puppet3.7安装与配置_第44张图片

clip_p_w_picpath052

通过上图,我们可以看出agent端安装时也创建了puppet用户,但是puppet运行时没有使用该用户而是使用root用户。这个与源码安装的相对应。

agent端安装完毕后,我们来配置agent端的配置文件,其方法和源码安装方法一样。如下:

vi /etc/puppet/puppet.conf

server = s.ilanni.com

pluginsync = false

烂泥:puppet3.7安装与配置_第45张图片

七、 puppet证书授权

我们知道puppet为了安全,采用ssl隧道通信,因此需要申请证书来验证。

7.1 master端证书初始化

当master端第一次启动的时候,可以查看/var/log/message日志文件中,有类似如下的信息:

tail -f /var/log/messages

Jan 23 06:39:03 localhost puppet-master[1622]: Signed certificate request for ca

Jan 23 06:39:04 localhost puppet-master[1622]: s.ilanni.com has a waiting certificate request

Jan 23 06:39:04 localhost puppet-master[1622]: Signed certificate request for s.ilanni.com

Jan 23 06:39:04 localhost puppet-master[1622]: Removing file Puppet::SSL::CertificateRequest s.ilanni.com at '/var/lib/puppet/ssl/ca/requests/s.ilanni.com.pem'

Jan 23 06:39:04 localhost puppet-master[1622]: Removing file Puppet::SSL::CertificateRequest s.ilanni.com at '/var/lib/puppet/ssl/certificate_requests/s.ilanni.com.pem'

Jan 23 06:39:04 localhost puppet-master[1634]: Reopening log files

Jan 23 06:39:04 localhost puppet-master[1634]: Starting Puppet master version 3.7.3

烂泥:puppet3.7安装与配置_第46张图片

从日志中我们可以看出第一次启动master端时,puppet服务会在本地创建认证中心,给自己授权证书和key,这个我们可以在/var/lib/puppet/ssl看到那些证书和key。如下:

ll /var/lib/puppet/ssl

烂泥:puppet3.7安装与配置_第47张图片

这个目录和/etc/puppet/puppet.conf文件中配置的ssldir路径有关系。

我们也可以查看master端给自己授权的证书文件,如下:

ll /var/lib/puppet/ssl/ca/signed

烂泥:puppet3.7安装与配置_第48张图片

7.2 agent端申请证书

agent端在第一次连接master端时,会向master端申请证书。如果master端没有授予agent端证书,那么agent端和master端之间的连接是不会建立成功的。

此时agent端会持续等待master端授权证书,并会每隔2分钟去检查master端是否签发证书。

我们现在使用puppet agent --server s.ilanni.com连接master端,如下:

puppet agent --server s.ilanni.com

clip_p_w_picpath057

7.3 master端授权证书

agent端申请证书完毕后,需要我们切换到master端,使用puppet cert命令来对agent端授权证书。

有关puppet cert的使用,我们可以查看pupper cert的帮助信息。如下:

pupper cert

烂泥:puppet3.7安装与配置_第49张图片

在上图中,puppet cert已经给出如何给一个agent端进行授权证书的例子。

现在我们来查看master端有哪些主机在申请证书,如下:

puppet cert list

clip_p_w_picpath059

通过上图,我们很明显的可以看到c.ilanni.com客户端正在申请证书。

现在我们来给agent端授权证书,使用如下命令:

puppet cert sign c.ilanni.com

烂泥:puppet3.7安装与配置_第50张图片

注意:如果实际生产环境客户端数量比较多的话,我们可以一次性授权所有证书。如下:

puppet cert sign --all

烂泥:puppet3.7安装与配置_第51张图片

在master端查看所有已经通过认证的agent端,如下:

puppet cert -all

烂泥:puppet3.7安装与配置_第52张图片

现在我们再来看看master端给agent端授权的证书文件,如下:

ll /var/lib/puppet/ssl/ca/signed

烂泥:puppet3.7安装与配置_第53张图片

通过上图,我们可以看出master端授权客户端c.ilanni.com的证书文件是c.ilanni.com.pem。

7.4 查看agent端证书

在master端授权完毕后,我们现在切换到agent端查看授权的证书文件,如下:

ll /var/lib/puppet/ssl/certs

烂泥:puppet3.7安装与配置_第54张图片

通过上图,我们可以看出agent端的证书文件c.ilanni.com.pem与master端的证书文件是一样的。

7.5 puppet证书问题

在实际的生产环境中,可能会出现已经通过master端认证的agent端主机名被修改或者其他一些误操作,从而导致agent端无法与master端进行正常通信。

当遇到这种情况时,我们一般的处理方法是先删除master端和agent端的相关的认证文件,然后在agent端重新申请证书。

具体操作如下:

agent端,删除/var/lib/puppet/ssl目录,如下:

rm -fr /var/lib/puppet/ssl

烂泥:puppet3.7安装与配置_第55张图片

master端,删除/var/lib/puppet/ssl/ca/signed目录下的证书文件,如下:

rm -fr /var/lib/puppet/ssl/ca/signed/c.ilanni.com.pem

烂泥:puppet3.7安装与配置_第56张图片

以上操作完毕后,agent端再次申请证书即可。

八、 puppet资源

puppet环境搭建完毕后,我们现在开始来介绍puppet资源相关的内容。

8.1 puppet的资源类型及帮助

puppet的资源,我们是可以通过相关命令查看puppet支持的资源类型。

通过前面的章节,我们知道puppet是支持子命令进行查询的。如下:

puppet help ca

烂泥:puppet3.7安装与配置_第57张图片

查看puppet支持的资源类型。如下:

puppet describe --list

烂泥:puppet3.7安装与配置_第58张图片

也可以通过puppet resource --type命令查询,如下:

puppet resource --type

烂泥:puppet3.7安装与配置_第59张图片

通过上图,我们可以看到puppet支持用户user、文件file、crontab等大部分的资源。

如果想查看user的资源,我们还是继续使用puppet describe user命令进行查看。如下:

puppet describe user

烂泥:puppet3.7安装与配置_第60张图片

如果我们想查看user在puppet站点site.pp文件中的具体使用方法,可以通过如下命令进行查看:

puppet resource user

烂泥:puppet3.7安装与配置_第61张图片

通过上图,我们可以看到puppet已经给出了user使用的例子,我们只需要按照这个例子进行操作即可。

注意:如果puppet describe帮助中没有该资源在site.pp站点中的使用详情,我们可以去到puppet resource中进行查看。

烂泥:puppet3.7安装与配置_第62张图片

烂泥:puppet3.7安装与配置_第63张图片

这个只是以user资源为例,如果想查看host资源的帮助,我们也可以使用类似的命令,如下:

puppet resource host

烂泥:puppet3.7安装与配置_第64张图片

如果你不想在本机进行查看,那么也可以去puppet官网进行查看,如下:

https://docs.puppetlabs.com/references/latest/type.html

烂泥:puppet3.7安装与配置_第65张图片

烂泥:puppet3.7安装与配置_第66张图片

8.2 puppet资源配置文件

puppet的资源配置文件在服务端的/etc/puppet/manifests目录下,我们需要在该目录下创建一个站点文件site.pp。

我们在该文件中创建需要同步到agent端的资源,如下:

cat /etc/puppet/manifests/site.pp

烂泥:puppet3.7安装与配置_第67张图片

node default{

file { "/tmp/test.txt":

content => "Hello,ilanni,this is puppet test!\n"}

}

以上命令表示在puppet资源配置文件冲创建一个默认节点,使用file资源,在agent端的/tmp/目录下创建test.txt,内容为:Hello,ilanni,this is puppet test!\n

注意:其中的\n表示换行。如果不加\n的话,查看该文件内容时会显示成这样:

烂泥:puppet3.7安装与配置_第68张图片

同时site.pp文件创建完毕后,我们要先重启下master端,如下:

/etc/init.d/puppetmaster restart

烂泥:puppet3.7安装与配置_第69张图片

现在切换到agent端同步该资源,如下:

puppet agent --test --server s.ilanni.com

clip_p_w_picpath080

通过上图,我们可以看到agent端已经把master端的资源的同步到本地。

现在我们来查看,agent端的/tmp目录下是否有test.txt这个文件。如下:

cat /tmp/test.txt

clip_p_w_picpath081

通过上图,我们可以看到agent端确实已经同步到master端的资源。/tmp目录下确实有test.txt这个文件,而且内容也确实和master端的一样。

到此有关puppet3.7搭建与配置介绍完毕,下一篇文章我们会介绍在生产环境中,puppet同步的资源。