SVN自助更新:运维利器Puppet实例讲解(一)(1)

Puppet是一种Linux、Unix平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。本文通过Puppet进行Apache Web服务器的配置同步,对于两台以上服务器的配置管理非常方便。

这个SVN自助更新系统的实现思路如下:

一、开发平台

  1. apache+perl-cgi
  2. puppet

二、功能介绍

系统管理员/项目执行者/开发人员通过web的get对应的url,然后触发更新puppet-master中的一个文件,puppet-client在同步时间到来的时候(默认半小时,可改),判断master上对应的项目文件的md5值是否有变化,如果有变化,触发puppet配置中对应的svn更新的程序,完成此项目的更新。

三、系统架构

四、实施步骤及相关说明解释

1、puppet配置

此处puppet的安装方法我就不写了,有需要的自行去网上查找。我这边是CentOS 5.4(服务器端)和CentOS 5.5(客户端),采用yum安装。

A、puppet-master配置

a) 首先是创建autosign.conf文件,此文件用于自动验证。

*.wenzizone.cn

这样所有这个域名过来的请求会自动验证。

b) 修改puppet.conf文件。如果是通过rpm或yum安装,此文件内容可以基本保持不变

[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl    bindaddress = 192.168.192.199[puppetd]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig

此文件主要是定义了一些文件路径,我在这里添加了bindaddress = 192.168.192.199这条,

绑定在了内网的ip上,因为我并不想让我的puppet-master被外网访问到,这个可以因个人环境而定。如果需要看详细的puppet.conf内容可以执行puppet --genconfig。

c) 修改fileserver.conf,增加如下内容

      [system]
           path /etc/puppet/modules/system/files
           allow *.wenzizone.cn
           allow 192.168.192.0/24
       [svnup]
           path /etc/puppet/modules/svn/files
           allow *.wenzizone.cn
       allow 192.168.192.0/24

此文件可以创建一个文件系统,有点类似rsync的配置,后面我会继续介绍。这个意思就是所有wenzizone.cn或者192.168.192.0网段的机器可以访问/etc/puppet/modules/svn/files下的文件。

注:以上三个文件都是放至在/etc/puppet目录下的

d) puppet功能配置

首先看下puppet的目录结构,

/etc/puppet/
|-- auth.conf
|-- autosign.conf
|-- fileserver.conf
|-- manifests
|   |-- huodong_web.pp
|   `-- site.pp
|-- modules
|   |-- svn
|   |   |-- files
|   |   |   |-- hd_zf_up_file
|   |   `-- manifests
|   |       |-- hd_zf_up.pp
|   |       |-- init.pp
|   `-- system
|       |-- files
|       |   |-- puppet.client.conf
|       `-- manifests
|           |-- init.pp
|           |-- puppet_client.pp
`-- puppet.conf

根下的manifests目录放置主配置文件,modules下面是各种的模块,在这里我设置了两个模块,system和svn,其中system用来给我的puppet-client同步puppet.conf文件,svn就是我这次介绍的重点了。

这里插个题外话:puppet的模块都是遵从

|   |-- svn
|   |   |-- files
|   |   `-- manifests
|   |       |-- init.pp

这种结构的,包含模块名字:svn目录,files目录,manifests目录,此目录下包含init.pp文件。

下面先看svn的这个模块

files目录:用来存放触发svn更新的文件的,我们可以在此目录下touch任何一个名字的文件,更新的工作由perl-cgi来控制,我这里使用的名字是:hd_zf_up_file

manifests目录:用来存放puppet的脚本文件的,必须包含init.pp文件,通常情况下可以把脚本都写入到这个一个文件中,但为了便于管理,最好是按照功能或者项目分开存放。我这里的hd_zf_up.pp就是我为公司线上的一个项目建立的。内容如下:

1class hd_zf_up
2{
3    file {
4        "hd_zf_up":
5        group => ‘root‘,
6        mode => ‘600‘,
7        owner => ‘root‘,
8        path => "/tmp/hd_zf_up_file",
9        source => "puppet:///svnup/hd_zf_up_file",
10    }
11
12    exec {
13        "svn up":
14        cwd => "/var/www/html/www.51cto.com/zf",
15        path => "/usr/bin:/usr/sbin:/bin",
16        subscribe => File["hd_zf_up"],
17        refreshonly => true,
18    }
19}

下面详细解释一下:

1行定义了一个类,类似php里的类,用于将相应的方法整合。

3行是puppet的file方法,网上的介绍file是一种资源,我这里认为当作方法比较合适,这样就可以跟php的类相似了,file后面大括号里的都是file这个方法的属性。属性用来赋值,方法用来调用。当然怎样理解因人而异。

4行给这个file方法定义了一个方便使用的别名

5行定义此文件的属组是root

6行定义此文件的访问模式是只有属主用户可读可写

7行定义文件的属主也是root

8行定义此文件在puppet-client端的放置位置及文件名

9行定义了从puppet-master的什么文件拿到那个文件。这里就用到了前fileserver.conf定义的内容,可以看到svnup是预定义的别名,它实际对应的路径是/etc/puppet/modules/svn/files,这样后面跟的文件就会到这个路径下去取。整个svn这部分的配置理解就是:puppet-client要从source定义的路径拿到hd_zf_up_file文件放到client的/tmp目录下并将文件所以权给root用户和组,访问模式是600。

12行定义了puppet的exec方法,这个方法是使puppet执行系统命令或脚本用的。

13行是定义了exec要执行的命令,在这里是要求puppet执行svn up这个命令。也就是更新项目的命令

14行定义了上面的svn up命令要在什么目录下执行

15行定义了path的变量,用于系统可以找到svn对应的命令。

16行定义了一个依存关系,我们这里和17行联合起来解释,当file方法定义里的那个文件的md5值发生变化的时候,此exec方法触发,即当上面source里面定义的文件md5值发生改变了,就执行svn up这个命令。

题外话:起先我这里并没有想到要和一个文件进行联立,但结果发现,puppet会在每次触发的时候都执行exec这个方法,这会造成网络资源的消耗,因为svn里的数据并不是每次都有更新的,所以没必要每次都执行。

到此svn up这部分的配置就完成了。接下来看看init.pp里面的内容

class svn
{   
    import "hd_zf_up.pp"
}

可以看到,init.pp的内容还是很简单的,只是引入了我们定义好的pp文件。

下面来介绍system那个模块的内容,这部分内容我主要讲同步puppet-client端配置文件的这个功能,这样方便我们一次性配置好client端的puppet。

files目录下:放置的是puppet.client.conf文件,主要内容如下

[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl
[puppetd]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig    server = app-21-199.wenzizone.cn    runinterval = 300show_diff=true

从内容上看,基本上和master上一样,主要区别是后三行,server用于指明master的名字,可以是ip可以是对应的主机名(前提是你已经有了对应的解析)。runinterval用于指定puppet-client每次执行的间隔,单位是秒,最后一行是当文件被替换的时候是否显示不一样的地方。

manifests目录下同样放置了init.pp文件,同时我还自定义了一个puppet_client.pp,内容如下:

1 class puppet_client
2  {
3      file
4      {
5          "puppet_conf":
6          path => "/etc/puppet/puppet.conf",
7          source => "puppet:///system/puppet.client.conf",
8      }
  
9      exec
10      {
11          "reload-puppet-client":
12          command => "/etc/init.d/puppet force-reload",
13          require => Service["puppet_client"],
14          refreshonly => true,
15      }
  
16      service
17      {
18          "puppet_client":
19          name => "puppet",
20          enable => true,
21          ensure => running,
22          hasrestart => true,
23          hasstatus => true,
24          subscribe =>File["puppet_conf"],
25      }
26 }

相同的内容就不重复介绍了。这里exec部分的11行并不是直接写的要执行的命令,而是定义了富有含义的名字,比较直观,然后在12行通过command定义了要执行的命令。

13行表明exec能不能执行是依赖于service这个方法的,后面详细介绍。

16行开始定义了一个新的方法service。顾名思义就是服务类的方法。

18行同样定义了一个富有含义的名称。

19行定义这个服务的名字,这里的名字必须和/etc/init.d下对应的名字一样

20行表示此服务在开机时是否启动,true是启动

21行表示是否运行此服务,running表示运行。

22行指出管理脚本是否支持restart参数,如果不支持,就用stop和start实现restart效果. 可以设置的值是true 或 false

23行指出管理脚本是否支持status参数,puppet用status参数来判断服务是否已经在运行了,如果不支持status参数,puppet利用查找运行进程列表里面是否有服务名来判断服务是否在运行. 可以设置的值是true或false

24行表示,此服务运行依赖file这个方法,同时exec又require了service,这样当file里定义的配置文件有变化及文件md5值不一样的时候,exec就执行force-reload的命令。

再来看init.pp内容

1 class system
2 {   
3      import "puppet_client.pp"
4 }

此内容很简单,主要是定义了一个system的类,然后导入puppet_client.pp的内容。

到此puppet上自定义的两大功能就介绍完成了,下面看看puppet如何加载。

回到/etc/puppet/manifests目录下,主要文件就两个,site.pp和huodong_web.pp。site.pp是主文件,huodong_web.pp是我为我需要svn更新的web服务器做的。内容如下

1 node "app198-vhost-192-55" {
2      #系统初始化工具
3      include system
4      include puppet_client  
5      #祝福活动页面更新
6      include svn
7      include hd_zf_up
8 }

1行定义了一个主机名,此处可以是主机名可以是ip地址

3加载system类,这个类是在system模块下的init.pp中定义的

4在system类加载后就来加载puppet_client的类,这个累是在system模块下的puppet_client.pp定义的。

6,7行同样是加载svn模块中定义好的类。

接下来看site.pp的内容

1 node default
2 {
3      import "huodong_web.pp"
4 }

这个主文件的内容也很简单,首先定义了一个默认node,然后加载了huodong_web.pp文件。

到此master上puppte部分的配置就全部完毕了。接下来看client端上的配置

B、puppet-client上的配置

a) 登录到app198-vhost-192-55这台主机上,yum安装puppet,然后在命令行执行


puppetd --server app-21-199.wenzizone.cn –test
由于我们是做的自动签名,并且在服务器上配置了puppet-client的配置文件,所以执行完过后puppet自动会以守护进程的方式启动
b) 配置svn更新主目录,及web页面项目的主目录,在我这个案例中的主目录是/var/www/html/www.51cto.com/zf,进入到这里使用svn co svn_source ./将初始的项目导入出来。这样就为了svn up命令执行做好了对应的环境。
通过简单的两步,就已经把puppet-client上的准备工作都完成了,是不是很简单。
那么下面就是perl-cgi部分了。
C、部署svn自助更新web脚本
这里可以将脚本部署在和puppet-master同一台主机上,当然也可以考虑分布式的,那样就需要调整这个脚本。现在先以同一台机器为例。
a)安装apache,配置cgi目录
因为我们的访问量不会很大,我直接用yum安装了。所以cgi目录使用的是默认的cgi-bin目录。
b)编写对应的脚本pjupdate.cgi

#! /bin/env perl

use CGI;

my $query = CGI->new(); #初始化cgi实例

my $file_name = $query->param(‘pjname‘);         #将url中pjname的值赋给$file_name变量

my $up_time = `date +%s`;                                      #获得从1970-01-01 00:00:00 UTC到现在的秒数

my $dst_dir = "/etc/puppet/modules/svn/files/";      #目标文件的目录

my $success = open FH,">".$dst_dir.$file_name;     #开的目标文件,即触发svn的文件
if(!$success) {
   print "Content-type:text/html\n\n";

print "不能更新此项目,请联系管理员!";    #如果打开不成功进行提示,通常是权限问题,文件属主改成apache执行用户

} else {

print FH"$up_time";             #更新文件内容,为了达到变更此文件md5值的效果

print "Content-type:text/html\n\n";

print "更新已经开始,请5~10分钟后查看页面";
}

close(FH);

五、测试

使用方法:通过

http://test.wenzizone.cn/cgi-bin/pjupdate.cgi?pjname=hd_zf_up_file

触发更新。

可以看到,pjname的值实际上就是磁盘上我定义的那个文件的名字。这样只要使用不同的文件,再配置不同的puppet的pp文件,就能实现多个项目自助更新了。同样,因为puppet是分布式的c/s模式,所以在同一时间,也可以实现对多台服务器的更新。

到此,这个自助svn更新系统就介绍完毕了。有几点需要注意的:

  1. 请确认部署环境中有对应的主机名到ip地址的解析环境,本文所在环境已存在内部dns,所以全部使用主机名。
  2. 所有puppet主机时间要保持一致。
  3. 注意防火墙对puppet端口的限制,如果非必要,可以关闭防火墙。
时间: 2024-10-13 22:47:53

SVN自助更新:运维利器Puppet实例讲解(一)(1)的相关文章

运维利器rshell,功能强大似Ansible/Puppet/Chef,配置简单如Putty!

#运维利器rshell,功能强大似Ansible/Puppet/Chef,配置简单如Putty! rshell:多Linux主机远程批量执行Shell命令和上传下载文件(跨平台,无依赖,免安装) 源码获取,https://github.com/luckywinds/rshell,喜欢请加星,多谢. ##背景 在多主机运维场景下,最核心最常用的操作就是批量远程执行命令.上传和下载文件,通常大家会想到Ansible.Puppet.Chef等自动化工具,但是又都对工具自身的部署配置抓狂,又对Putty

自动化运维利器---pssh

有的公司,机房有60台服务器,有的公司机房有3000台服务器,还有的更多!这么多的服务器,要执行相同的系统配置操作,怎么办? 答案1:   一台一台的部署,有点活活累死的感觉! 答案2:  写SHELL脚本,一回车,全部机器就都执行了.是个办法,但是效率很低,不是吗?! 答案3 :    用pssh,它是运维利器啊! pssh:   parallel-ssh ,即并行ssh,是一个用Python编写的工具,作用就是并行在多台服务器上执行命令.比如,在晚上12:00 分这个时间,同时在3000台服

自动化运维平台puppet的高级应用

一.模板的应用 到目前为止,资源申报.定义类.声明类等所有功能都只能一个manifest文件中实现,但这却非有效的基于puppet管理IT资源架构的方式.实践中,一般需要把manifest文件分解成易于理解的结构,例如将类文件.配置文件甚至包括后面讲提到的模板文件等分类存放,并且通过某种机制在必要时将他们整合起来.这种机制即成为"模板",它有助于结构化.层次化的方式使用puppet,而puppet则基于"模块自动装载器"完成模块装载 从另一个角度来说,模板实际上就是

自动化运维工具puppet的部署与应用

作为一名运维工程师,维护服务器的正常运行是最基本的职责,随着服务器的增多,任务量也随之增大,就需要寻找一款能够降低工作量的工具.那么今天就给大家介绍一批工具,这批工具是"可编程"的,只需要为这批工具写上几行代码,它便会自动完成所有的工作,这批工具就是运维自动化puppet(为什么说是一批工具,因为软件不止一个).Puppet可以针对多台服务器进行统一的操作,例如:软件分发,统一执行脚本,在服务器上写好脚本分发给客户机,客户机就会自动执行,减少了人力及误操作风险. 1. puppet工作

云主机远程协同运维利器,好用的远程协同会诊平台推荐

我们在日常运维过程中,难免会遇到一些自己无法独立解决的问题,尤其是在遇到突发故障时,我们就会寻求协助,借助他人的力量共同解决问题,而多人共同解决问题最好的方式无疑是大家面对同一个场景,协同操作,进行问题分析,因此我们会经常使用到远程协同软件或平台,但是我们在使用市面上各类协同软件或平台的过程中总是会遇到以下一些问题: 1.协同参与者需要安装协同软件:2.要求协同参与者同时在线:3.协同过程无授权体系支撑,导致协同操作不安全.不可控:4.协同过程无日志记录,无法事后回溯. 那么一个好的协同会诊平台

Ansible:分布式场景下的自动化运维利器实战!!!

项目背景: 实验环境: 软件介绍 Ansible是一种集成IT系统的配置管理.应用部署.执行特定任务的开源平台,它是基于python语言,由Paramiko和PyYAML两个关键模块构建.集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架. ansible软件的一些特

程序员简单打造一个灵活智能的自动化运维系统C#实例程序

你是一个程序员,被派去管理公司500台计算机.这些机器可能需要执行一些自动化任务,一台台手动操作会把你累死.重复性的工作还是交给电脑处理,怎么解决这个问题呢?一个自动化的运维系统是必须的.自己实现的好处是直观,可以掌握运维的每一个环节. 思路 可以在这些电脑上安装一个程序,此程序定期执行一个请求,去我们的中心服务器上获取指令,然后执行这些指令就可以了.这些指令可以是一个脚本文件,但最通用的应该是一个包含指令的压缩包.大体的步骤就是:下载->解压->运行. 实现 客户端开发,C#开发一个wind

Linux系统运维面试题,Linux运维经典面试题讲解

这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题. 1.Linux如何挂载windows下的共享目录? mount.cifs //IP地址/server /mnt/server -o user=administrator,password=123456 linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号 2.如何查看http的并发请求数与其

老男孩教育Linux运维课程是如何讲解MySQL数据库的?

老男孩专业DBA课程表如下: http://oldboy.blog.51cto.com/2561410/1951684 本博文课表即将出书<跟老男孩学习Linux运维:MySQL数据库实战>,敬请关注.