一、简介
当站群服务器数量达到一定的规模时,仅依靠人为完成批量部署站群服务器个资源的配置,运维工作将变得繁琐且容易出错,为了解决这一问题,我们应该怎么办呢?我们可以引入一批工具,这批工具可编写相应的 manifests 程式码,执行它便可以自动完成所有的工作,目前比较流行的运维工具主要有:puppet,ansible, slackstack 等,在这我们主要以 puppet 来展开话题。在一些大型网际互联网企业中,运维自动化管理著几百甚至上千台站群服务器,它可以针对多台站群服务器进行统一操作,例如部署统一站群软件、进行统一上线维护等,而且能够快速完成上线部署,减少人力及人力误操作风险。
二、 Puppet 的工作原理
puppet 的目的是让系统管理员只集中于要管理的目标站群服务器,而忽略实现的细节。 puppet 既可以在单机上使用,也可以 C/S 结构使用,在大规模部署 puppet 的情况下,通常我们会使用 C/S 结构,在这种结构下,服务端执行 puppet-master 程式客户端执行 puppet-client 服务程式
具体的工作流程图如下所示:
对于 puppet 的的掌握,理解 puppet 的工作原理是一个必要的的阶段,只有在了解了 puppet 的工作原理后才能更好应用 puppet,下面让我们一起了解学习 puppet 的工作原理:
说到 puppet 的工作原理,不得不从以下四个方面来说到,如下所示:
(1)定义:使用 Puppet 特定的语言定义基础配置资讯。通常我们把这些资讯写在 Modules 中。
(2)WordPress 模板:在配置执行之前检测程式码,但并不真正执行。
(3)执行:定义的配置自动部署。检测并记录下所发生变化的部分。
(4)报告:将期待的变化、实际发生的变化及任何修改传送给报告系统。
如下所示为 puppet 的工作资料流示意图
资料流说明:
首先所有的节点(Node)Node 节点将 Facts 和本机资讯传送给 Master
Master 告诉 Node 节点应该如何配置,将这些资讯写入 Catalog 后传给 Node 。
Node 节点在本机进行程式码解析验证并执行,将结果反馈给 Master 。
Master 通过 API 将资料发给分析工具。报告完全可以通过开放 API 或与其他系统整合。
整个资料流的走向是基于 SSL 安全协议的,如下图所示:
WordPress 模板档案处理过程说明如下:
Puppet 通过编译 Manifest 中的内容 (即 WordPress 模板中内容),将编译好的程式码存入 Catalog 。在执行前先进行程式码的验证,再执行,完成最开始所定义好的状态。程式码编译过程如图所示:
如下所示为整个 puppet 自动部署过程中 agent 和 master 的详细的互动过程:
过程说明:
1. Puppet 客户端 Agent 将节点名与 facts 资讯传送给 Master 。
2. Puppet 服务端 Master 通过分类判断请求的客户端是谁,它将要做什么。这个判断是通过 site.pp 中包含的 Node.pp 配置档案定义的。
3. Puppet 服务端 Master 将所需要的 Class 类资讯进行编译后存入 Catalog 并传送给 Puppet 客户端 Agent,到此完成第一次互动。
4. Puppet 客户端 Agent 对 Catalog 进行程式码验证(语法检查及错误检查)并执行。主要是程式码的验证,并将执行过程的资讯及结果写入日志。
5. Puppet 客户端 Agent 最终达到最开始所定义的状态,并且将结果及任何执行资料通过开放 API 的形式传送给 Puppet 服务端 Master 。
以上就是 puppet 的工作原理需要注意是: 因为整个过程中都是基于 ssl 实现的,所以首要的是保证 agent 和 master 间可以基于 ssl 通讯!
以上内容参考:http://blief.blog.51cto.com/6170059/1760439
三、 puppet 常用资源及配置例项
例项一: 建立 centos 使用者为普通使用者,且 uid 为 4000,gid 为 3000,所属组为 centos,附加组为 mygrp
user{‘centos’:name=>’centos’,#定义使用者名称ensure=>present,#建立使用者uid=>4000,#定使用者idgroups=>’mygrp’,#定义其他附加组require=>Group[‘mygrp’]#此资源依赖于事先建立mygrps组}group{‘mygrp’:name=>’mygrp’,#定义组名ensure=>present,#建立组,与此相反的是absent,删除组gid=>’3000′,#组idsystem=>false,#是否为系统组,预设为 false} 总结:user 常用属性:name:使用者名称,uid: 使用者 id,gid: 组 id,groups: 附加组,comment:注释资讯 expiry: 过期时间,home:家目录,shell:预设的 shell 型别,system:是否为系统组,ensure:建立或删除使用者即 present 、 absent,password:加密后的密码 group 常用属性:ensure:建立或删除组即 present 、 absent,name: 组 id,system:是否为系统组等 [root@node1manifets]#puppetapply-vuser.pp#将此 manifests 清单编译为虚拟码 catalog,并执行,且返回执行结果至此单机模式的 WordPress 主机上 Notice:Compiledcatalogfornode1.alren.cominenvironmentproductionin0.55secondsInfo:Applyingconfigurationversion’1480561275’Notice:/Stage[main]/Main/Group[mygrp]/ensure:createdNotice:/Stage[main]/Main/User[centos]/ensure:createdNotice:Finishedcatalogrunin0.11seconds[root@node1manifets]#idcentosuid=4000(centos)gid=4000(centos)groups=4000(centos),3000(mygrp)[root@node1manifets]#viuser.pp[root@node1manifets]#puppetapply-vuser.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin0.58secondsInfo:Applyingconfigurationversion’1480561376’Notice:/Stage[main]/Main/Group[mygrp]/ensure:removedNotice:/Stage[main]/Main/User[centos]/ensure:removedNotice:Finishedcatalogrunin0.13seconds[root@node1manifets]#idcentosid:centos:nosuchuser[root@node1manifets]#
例项二:此 manifests 程式码为安装 httpd 包,为其提供配置档案,并且启动服务
service{‘httpd’:ensure=>running,enable=>true,restart=>’systemctlrestarthttpd.service’,require=>Package[‘httpd’],}package{‘httpd’:ensure=>installed,}file{‘httpd.conf’:path=>’/etc/httpd/conf/httpd.conf’,source=>’/root/manifests/httpd.conf’,ensure=>file,notify=>Service[‘httpd’],before=>Service[‘httpd’],}package 常用属性:ensure:installed,present,latest,absentname: 包名 source:程式包来源,仅对不会自动下载的相关程式包的 provider 有用,例如 rpm 或 dpkgservicec 常用属性:ensure:running,stopped 执行停止 enable:开机是否启动 restart:重启命令 require:被依赖于事先安装程式包,file 常用属性:path: 档案需放置的位置所在处 source:原始档在哪 ensure:file,present,absent,directory,link…file 指的是普通档案,link 为连线档案,此需结合 target 一起使用 directory:型别为目录,可通过 source 指向的路径复制生成,recuse 属性指明是否为递回复制 owner:属主 group:属组 mode:许可权 [root@node1manifets]#puppetapply-vweb.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin1.48secondsInfo:Applyingconfigurationversion’1480563754’Info:Computingchecksumonfile/etc/httpd/conf/httpd.confInfo:/Stage[main]/Main/File[httpd.conf]:Filebucketed/etc/httpd/conf/httpd.conftopuppetwithsum42566ec31df37e3d44429b285d015e1dNotice:/Stage[main]/Main/File[httpd.conf]/content:contentchanged'{md5}42566ec31df37e3d44429b285d015e1d’to'{md5}8b01e334a6e975b659df5dd351923ccb’Info:/Stage[main]/Main/File[httpd.conf]:SchedulingrefreshofService[httpd]Notice:/Stage[main]/Main/Service[httpd]:Triggered’refresh’from1eventsNotice:Finishedcatalogrunin1.95seconds[root@node1manifets]#ss-tnlStateRecv-QSend-QLocalAddress:PortPeerAddress:PortLISTEN05192.168.122.1:53*:*LISTEN0128*:22*:*LISTEN0128127.0.0.1:631*:*LISTEN0100127.0.0.1:25*:*LISTEN032:::21:::*LISTEN0128:::22:::*LISTEN0128::1:631:::*LISTEN0128:::8088:::*LISTEN0100::1:25:::*[root@node1manifets]#
例项三:每三分钟同步下系统时间, 写入定时任务
cron{‘synctime’:command=>’/usr/sbin/ntpdate10.1.0.1&>/dev/null’,#须执行的命令ensure=>present,#建立任务计划minute=>’*/5′,#过多长是时间执行user=>root,#以谁的身份执行}[root@node1testmanifests]#puppetapply-vcron.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin0.18secondsInfo:Applyingconfigurationversion’1480593969’Notice:/Stage[main]/Main/Cron[synctime]/minute:minutechanged’*/3’to’*/5’Notice:Finishedcatalogrunin0.09seconds[root@node1testmanifests]#crontab-l#HEADER:Thisfilewasautogeneratedat2016-12-0120:06:10+0800bypuppet.#HEADER:Whileitcanstillbemanagedmanually,itisdefinitelynotrecommended.#HEADER:Noteparticularlythatthecommentsstartingwith’PuppetName’should#HEADER:notbedeleted,asdoingsocouldcauseduplicatecronjobs.#PuppetName:synctime*/5****/usr/sbin/ntpdate10.1.0.1&>/dev/null#检视到此任务计划存在 [root@node1testmanifests]#
例项四:puppet 之 if 条件判断
if$osfamily=~/(?i-mx:debian)/{$osfamily为facter中取得的内嵌变数 $webserver=’apache2’#自定义变数}else{$webserver=’httpd’}package{“$webserver”:ensure=>installed,before=>[File[‘httpd.conf’],Service[‘httpd’]],}file{‘httpd.conf’:path=>’/etc/httpd/conf/httpd.conf’,source=>’/root/testmanifests/httpd.conf’,ensure=>file,}service{‘httpd’:ensure=>running,enable=>true,restart=>’systemctlrestarthttpd.service’,subscribe=>File[‘httpd.conf’],#通知其他的资源进行重新整理操作}[root@node1testmanifests]#puppetapply-vif.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin1.53secondsInfo:Applyingconfigurationversion’1480594920’Info:Computingchecksumonfile/etc/httpd/conf/httpd.confInfo:FileBucketgotaduplicatefile{md5}8b01e334a6e975b659df5dd351923ccbInfo:/Stage[main]/Main/File[httpd.conf]:Filebucketed/etc/httpd/conf/httpd.conftopuppetwithsum8b01e334a6e975b659df5dd351923ccbNotice:/Stage[main]/Main/File[httpd.conf]/content:contentchanged'{md5}8b01e334a6e975b659df5dd351923ccb’to'{md5}42566ec31df37e3d44429b285d015e1d’Info:/Stage[main]/Main/File[httpd.conf]:SchedulingrefreshofService[httpd]Notice:/Stage[main]/Main/Service[httpd]:Triggered’refresh’from1eventsNotice:Finishedcatalogrunin1.97seconds[root@node1testmanifests]#ss-tnlStateRecv-QSend-QLocalAddress:PortPeerAddress:PortLISTEN05192.168.122.1:53*:*LISTEN0128*:22*:*LISTEN0128127.0.0.1:631*:*LISTEN0100127.0.0.1:25*:*LISTEN0128:::80:::*LISTEN032:::21:::*LISTEN0128:::22:::*LISTEN0128::1:631:::*LISTEN0100::1:25:::*[root@node1testmanifests]#
例项五:puppet 之 case 语句
case$osfamily{“RedHat”:{$webserver=’httpd’}/(?i-mx:debian)/:{$webserver=’apache2′}default:{$webserver=’httpd’}}package{“$webserver”:ensure=>installed,before=>[File[‘httpd.conf’],Service[‘httpd’]],}file{‘httpd.conf’:ensure=>file,path=>’/etc/httpd/conf/httpd.conf’,source=>’/root/testmanifests/httpd.conf’,}service{‘httpd’:ensure=>running,enable=>true,restart=>’systemctlrestarthttpd.service’,subscribe=>File[‘httpd.conf’],}[root@node1testmanifests]#puppetapply-vcase.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin1.61secondsInfo:Applyingconfigurationversion’1480595667’Info:Computingchecksumonfile/etc/httpd/conf/httpd.confInfo:FileBucketgotaduplicatefile{md5}42566ec31df37e3d44429b285d015e1dInfo:/Stage[main]/Main/File[httpd.conf]:Filebucketed/etc/httpd/conf/httpd.conftopuppetwithsum42566ec31df37e3d44429b285d015e1dNotice:/Stage[main]/Main/File[httpd.conf]/content:contentchanged'{md5}42566ec31df37e3d44429b285d015e1d’to'{md5}3dfa14b023127a3766bddfe15fe14b9a’Info:/Stage[main]/Main/File[httpd.conf]:SchedulingrefreshofService[httpd]Notice:/Stage[main]/Main/Service[httpd]:Triggered’refresh’from1eventsNotice:Finishedcatalogrunin1.91seconds[root@node1testmanifests]##可根据自行的语言习惯选择适合的语法,如下所示同样可达到上诉的目的 $webserver=$osfamily?{“Redhat”=>’httpd’,/(?i-mx:debian)/=>’apache2′,default=>’httpd’,}package{“$webserver”:ensure=>installed,before=>[File[‘httpd.conf’],Service[‘httpd’]],}file{‘httpd.conf’:path=>’/etc/httpd/conf/httpd.conf’,source=>’/root/testmanifests/httpd.conf’,ensure=>file,}service{‘httpd’:ensure=>running,enable=>true,restart=>’systemctlrestarthttpd.service’,subscribe=>File[‘httpd.conf’],}
四、 puppet 类与继承
puppet 中命名的程式码模组,经常需要被使用,如如重写则程式码冗余,使用定义一组通用目标的资源,可在 puppet 全域性呼叫,就能解决这类问题,类可以被继承,也可以包含子类。
类的语法格式有两种,呼叫类的方法常用的有三种,可以在类中传递引数等灵活的操作,如以下例项:
classwebserver{#类申明后续呼叫后才生效,呼叫的方法常用的有三种 $webpkg=$operatingsystem?{/(?i-mx:(centos|redhat|fedora))/=>’httpd’,/(?i-mx:(ubuntu|debian))/=>’apache2′,default=>’httpd’,}package{“$webpkg”:ensure=>installed,}file{‘/etc/httpd/conf/httpd.conf’:ensure=>file,owner=>root,group=>root,source=>’/root/testmanifests/httpd.conf’,require=>Package[“$webpkg”],notify=>Service[‘httpd’],}service{‘httpd’:ensure=>running,enable=>true,}}includewebserver#使用include进行呼叫 #申明呼叫类的第二种方法classweb($webserver=’httpd’){#向类中传递引数package{“$webserver”:ensure=>installed,before=>[File[‘httpd.conf’],Service[‘httpd’]],}file{‘httpd.conf’:path=>’/etc/httpd/conf/httpd.conf’,source=>’/root/testmanifests/httpd.conf’,ensure=>file,}service{‘httpd’:ensure=>running,enable=>true,restart=>’systemctlrestarthttpd.service’,subscribe=>File[‘httpd.conf’],}}class{‘web’:webserver=>’apache2′,#呼叫类}[root@node1~]#puppetapply-v–noopclass2.ppNotice:Compiledcatalogfornode1.alren.cominenvironmentproductionin1.53secondsInfo:Applyingconfigurationversion’1480596978’Notice:/Stage[main]/Web/Package[apache2]/ensure:current_valueabsent,shouldbepresent(noop)Notice:/Stage[main]/Web/File[httpd.conf]/content:current_value{md5}3dfa14b023127a3766bddfe15fe14b9a,shouldbe{md5}8b01e334a6e975b659df5dd351923ccb(noop)Info:/Stage[main]/Web/File[httpd.conf]:SchedulingrefreshofService[httpd]Notice:/Stage[main]/Web/Service[httpd]:Wouldhavetriggered’refresh’from1eventsNotice:Class[Web]:Wouldhavetriggered’refresh’from3eventsNotice:Stage[main]:Wouldhavetriggered’refresh’from1eventsNotice:Finishedcatalogrunin0.65seconds[root@node1~]#
类的继承:子类可继承父类的资源属性,同时可定义父类不存在的额资源属性,一个父类可同时被多个子类所继承
classnginx{#定义父类资讯package{‘nginx’:ensure=>installed,#安装程式包}service{‘nginx’:#启动程式ensure=>running,enable=>true,require=>Package[‘nginx’],}}classnginx::webinheritsnginx{#继承父类的原有属性,同时增加file资源属性file{‘ngx-web.conf’:path=>’/etc/nginx/conf.d/ngx-web.conf’,ensure=>file,require=>Package[‘nginx’],source=>’/root/testmanifests/nginx/ngx-web.conf’,}file{‘nginx.conf’:path=>’/etc/nginx/nginx.conf’,ensure=>file,content=>template(‘/root/testmanifests/nginx.conf.erb’),#此WordPress模板需事先存在方可使用require=>Package[‘nginx’],}Service[‘nginx’]{subscribe=>[File[‘ngx-web.conf’],File[‘nginx.conf’]],#通知其他资源进行重新整理操作}}includenginx::web#呼叫宣告的类
五、 puppetWordPress 模板(此内容不过多解释,需自行加强)
WordPress 模板是一个按照约定的、预定的结构存放了多个档案或子目录的目录,目录里面的这些档案或子目录必须遵循一定的格式的命名规范,puppet 会在配置的路径下查询所需的资源模组。模组的名称通常是只能以小写字母开头,可以包含小写字母,数字下划线,但是不能使用 main 和 settings 。
模组的组成部分:
manifests/: 资源清单
init.pp: 必须定义一个类,类名必须与模组名相同;
files/: 静态档案
templates/:WordPress 模板档案
lib/: 插件外挂目录,常用于储存自定义的 facts 以及自定义型别
spec/:类似于 tests 目录,储存 lib/目录下插件外挂的使用帮助和范例;
tests/:当前模组的使用帮助或使用范例档案;
总结:运维工具有很多例如:Puppet,Ansible,slackstack 等,puppet 还是一个很好用的自动化运维工具,大大减轻的运维人员的重复操作,提高了工作效率,在运维过程中可根据业务需求选择不同的运维工具,在站群服务器数量不是很大的情形下可使用轻量级的 ansible,在站群服务器数量达到一定的规模时使用重量级的 puppet 相对来说效率更高。当面临有得选择的时候想起一句话:箩卜白菜各有所爱,适合自己专注、精通一个运维工具比全会那么一点,解决问题更有优势。
原文地址:http://www.92to.com/bangong/2016/12-09/14172517.html