Puppet基于Master/Agent模式实现LNMP平台部署
前言
隨著IT行業(yè)的迅猛發(fā)展,傳統(tǒng)的運維方式靠大量人力比較吃力,運維人員面對日益增長的服務(wù)器和運維工作,不得不把很多重復(fù)的、繁瑣的工作利用自動化處理。前期我們介紹了運維自動化工具ansible的簡單應(yīng)用,本期帶來的是運維自動化神器puppet基于Master/Agent模式實現(xiàn)LNMP平臺部署。
Puppet
簡介
Puppet是基于ruby語言開發(fā)的一種Linux、Unix、Windows平臺的集中配置管理系統(tǒng),可以C/S模式或獨立運行,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務(wù)、軟件包、系統(tǒng)服務(wù)等。
工作流程
①Agent向Master端發(fā)起認證請求
②Master端驗證其合法性,允許其連接
③Agent將本機變量(主機名、內(nèi)存大小、IP地址等)通過SSL連接發(fā)送給Master
④Master檢測Agent的主機名,然后找到manifest對應(yīng)的node配置,并對該部分內(nèi)容進行解析。解析結(jié)果生成一個“偽代碼”(catelog),并將其發(fā)給Agent
⑤Agent接收到“偽代碼”,開始執(zhí)行
⑥執(zhí)行時判斷有沒有File文件,如果有,則向fileserver發(fā)起請求
⑦判斷有沒有配置Report,如果已配置,則把執(zhí)行結(jié)果發(fā)送給服務(wù)器
⑧執(zhí)行結(jié)束,檢測系統(tǒng)狀態(tài)
實現(xiàn)過程
實驗拓撲
| 1 2 3 | #系統(tǒng)環(huán)境:CentOS6.6 #各主機間可通過域名通信,基于hosts實現(xiàn) #各主機時間已同步 |
Puppet Master配置
安裝所需軟件包
| 1 | [root@node1?~]#?yum?install?puppet?puppet-server?-y |
創(chuàng)建模塊目錄
| 1 2 | [root@node1?~]#?cd?/etc/puppet/modules/ [root@node1?modules]#?mkdir?nginx/{files,manifests}?php/{files,manifests}?mysql/{files,manifests}?-pv |
準(zhǔn)備各服務(wù)配置文件
| 1 2 3 | [root@node1?modules]#?cp?/root/files/nginx.conf?nginx/files/ [root@node1?modules]#?cp?/root/files/www.conf?php/files/ [root@node1?modules]#?cp?/root/files/my.cnf?mysql/files/ |
創(chuàng)建各模塊
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | [root@node1?modules]#?vim?nginx/manifests/init.pp class?nginx?{ ????package{'nginx': ????????ensure??=>?present, ????????name????=>?nginx, ????} ????file{'nginx.conf': ????????ensure??=>?file, ????????source??=>?'puppet:///modules/nginx/nginx.conf', ????????path????=>?'/etc/nginx/nginx.conf', ????????require?=>?Package['nginx'], ????} ???service{'nginx': ????????ensure??=>?true, ????????enable??=>?true, ????????subscribe?=>?File['nginx.conf'], ????} } [root@node1?modules]#?vim?php/manifests/init.pp class?php?{ ????package{'php-fpm': ????????ensure??=>?present, ????????name????=>?php-fpm, ????} ????file{'www.conf': ????????ensure??=>?file, ????????source??=>?'puppet:///modules/php/www.conf', ????????path????=>?'/etc/php-fpm.d/www.conf', ????????require?=>?Package['php-fpm'], ????} ???service{'php-fpm': ????????ensure??=>?true, ????????enable??=>?true, ????????subscribe?=>?File['www.conf'], ????} } [root@node1?modules]#?vim?mysql/manifests/init.pp class?mysql?{ ????package{'mysql-server': ????????ensure??=>?present, ????????name????=>?'mysql-server', ????} ????file{'my.cnf',: ????????ensure??=>?file, ????????source??=>?'puppet:///modules/mysql/my.cnf', ????????path????=>?'/etc/my.cnf', ????????require?=>?Package['mysql-server'], ????} ???service{'mysqld': ????????ensure??=>?true, ????????enable??=>?true, ????????subscribe?=>?File['my.cnf'], ????} } [root@node1?modules]#?cd?../manifests/ [root@node1?manifests]#?mkdir?server [root@node1?manifests]#?vim?server/node3.pp node?'node3.scholar.com'?{ ??include?mysql } [root@node1?manifests]#?vim?server/node4.pp node?'node4.scholar.com'?{ ??include?nginx,php } [root@node1?manifests]#?vim?site.pp? import?"server/*.pp" |
以上資源詳解
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #package詳解 ensure:程序包目標(biāo)狀態(tài),{present(installed)|absent|purged|held|latest} name:資源名稱,即軟件包名字,可省略,如果省略,將繼承title的值 provide:軟件包管理器,會自動識別 source:程序包文件路徑 install_options:安裝選項,最常用的是通過INATALLDIR來制定安裝目錄 #file詳解 ensuce:目標(biāo)狀態(tài),{present|absent|directory|file|link} backup:通過filebacket資源來備份文件,值通常為filebucket資源的名稱 content:文件內(nèi)容,生成方式有三種(content,source,target),三者彼此互斥 source:通過制定的url下載文件至本地,格式:puppet:///modules/MODULE_NAME/file_name target:為符號鏈接指定目標(biāo) links:文件為符號連接,{follow|manage} path:文件路徑,必須使用雙引號 mode:定義權(quán)限,通常為8進制數(shù)字 owner:?定義文件的屬主 group:定義文件的屬組 force:強制執(zhí)行刪除文件、鏈接或目錄,僅用于ensure為absent時 purge:清除指定目錄中存在的,但未在資源中定義的文件 resurce:目錄遞歸,{true|false|inf|remote} replace:替換,本地存在的文件與資源中指定的文件內(nèi)容不同時是否執(zhí)行替換,默認為否 #service詳解 ensure:服務(wù)目標(biāo)狀態(tài),{?true(running)|false(stopped)} enable:是否開機自動啟動,{true|false} name:服務(wù)名稱,可以省略,如果省略,將繼承title的值 path:服務(wù)腳本路徑,默認為/etc/init.d/ start:是否啟動服務(wù) stop:是否關(guān)閉服務(wù) restart:是否重啟服務(wù) status:判斷服務(wù)是否運行 #特殊屬性 require:需要依賴于某個資源 before:應(yīng)該先執(zhí)行本資源,在執(zhí)行別的資源 notify:?將當(dāng)前資源的變動信息通知給別的資源 subscribe:訂閱某資源變動信息 ->?:后資源需要依賴前資源 ~>?:前資源變動通知后資源調(diào)用 |
啟動服務(wù)
首次啟動puppet-server守護進程時,其會自動進行運行環(huán)境的初始化,例如創(chuàng)建一個本地CA及服務(wù)器端相關(guān)的證書和密鑰等。初始化操作完成后,puppet就會監(jiān)聽指定的套接字并等待客戶端的連接請求。默認情況下,其證書和密鑰等文件位于/var/lib/puppet/ssl/目錄中。
出于調(diào)試的目的,首次啟動puppet服務(wù)進程可以以非守護進程方式進行,并讓其輸出詳解信息以便于觀察初始化過程。如下所示過程,其逐步展示了創(chuàng)建本地CA、作為puppet服務(wù)器的本地主機向CA申請證書、獲得證書以及CA移出證書簽署請求的過程等,而后啟動服務(wù)進程并準(zhǔn)備接受各agent的連接請求。為下面的命令額外使用--debug選項,還可以獲得更為詳細的輸出信息。
如果上述的測試啟動沒有問題,可中止當(dāng)前的啟動,正式啟動服務(wù)了
| 1 2 3 4 | [root@node1?manifests]#?service?puppetmaster?start Starting?puppetmaster:?????????????????????????????????????[??OK??] [root@node1?manifests]#?ss?-tnlp?|?grep?puppet LISTEN?????0??????5??????????????*:8140?????????*:*??????users:(("puppetmasterd",3186,5)) |
Puppet Agent配置
安裝所需軟件包
| 1 | [root@node3?~]#?yum?install?puppet?-y |
指定puppet server
| 1 2 3 4 5 | [root@node3?~]#?vim?/etc/puppet/puppet.conf???#也可手動命令指定 [agent] server?=?node1.scholar.com |
啟動服務(wù)之前先來看一下各agent端所需軟件是否安裝
| 1 2 3 4 5 6 | [root@node3?~]#?rpm?-q?mysql-server package?mysql-server?is?not?installed [root@node4?~]#?rpm?-q?ngnix package?ngnix?is?not?installed [root@node4?~]#?rpm?-q?php-fpm package?php-fpm?is?not?installed |
啟動服務(wù)
puppet agent在首次啟動時,會向為其指定的puppet server申請證書,并完成后續(xù)連接請求。同樣的理由,出于測試的目的,接入當(dāng)前puppet集群中的首個agent節(jié)點可以以非守護進程的方式進行,以觀察其初始化過程
| 1 | #所有agent端都執(zhí)行以上系列操作 |
此時,在puppet服務(wù)器端使用puppet cert命令管理客戶端的證書請求,其--list選項能夠查看等待簽署證書的客戶端列表,而--sign選項可用于為指定指定節(jié)點簽署證書,如果要一次性地為多個節(jié)點的證書申請進行簽署可同時使用--all選項
正式啟動服務(wù)
| 1 2 3 4 | [root@node3?~]#?service?puppet?start Starting?puppet:???????????????????????????????????????????[??OK??] [root@node4?~]#?service?puppet?start Starting?puppet:???????????????????????????????????????????[??OK??] |
再次檢查各agent端軟件狀態(tài)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@node3?~]#?rpm?-q?mysql-server mysql-server-5.1.73-5.el6_6.x86_64 [root@node3?~]#?service?mysqld?status mysqld?(pid??4526)?is?running... [root@node3?~]#?chkconfig?--list?mysqld mysqld???????????? 0:off?? 1:off?? 2:on??? 3:on??? 4:on??? 5:on??? 6:off [root@node4?~]#?rpm?-q?nginx? nginx-1.0.15-11.el6.x86_64 [root@node4?~]#?service?nginx?status nginx?(pid??6678)?is?running... [root@node4?~]#?chkconfig?--list?nginx nginx???????????? 0:off?? 1:off?? 2:on??? 3:on??? 4:on??? 5:on??? 6:off [root@node4?~]#?rpm?-q?php-fpm php-fpm-5.3.3-46.el6_6.x86_64 [root@node4?~]#?service?php-fpm?status php-fpm?(pid??6309)?is?running... [root@node4?~]#?chkconfig?--list?php-fpm php-fpm???????? 0:off?? 1:off?? 2:on??? 3:on??? 4:on??? 5:on??? 6:off |
各服務(wù)已按預(yù)設(shè)啟動,Puppet基于Master/Agent模式實現(xiàn)LNMP平臺部署成功完成
Puppet Kick
agent跟master默認30分鐘通信一次,如果在這期間,某一服務(wù)出現(xiàn)bug或配置有誤,如何實現(xiàn)緊急推送,盡量減少業(yè)務(wù)損失呢?下面簡單說一下puppet kick功能的實現(xiàn)
Puppet Agent配置
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [root@node3?~]#?vim?/etc/puppet/puppet.conf? [agent] listen=true [root@node3?~]#?vim?/etc/puppet/namespaceauth.conf [puppetrunner] allow?*.scholar.com [root@node3?~]#?vim?/etc/puppet/auth.conf? path?/run method?save allow?node1.scholar.com #?this?one?is?not?stricly?necessary,?but?it?has?the?merit #?to?show?the?default?policy?which?is?deny?everything?else path?/ auth?any [root@node3?~]#?service?puppet?restart Stopping?puppet:???????????????????????????????????????????[??OK??] Starting?puppet:???????????????????????????????????????????[??OK??] #所有agent都執(zhí)行以上操作 |
Puppet Master推送
| 1 2 3 4 5 6 | [root@node1?~]#?puppet?kick?-p?10?--host?node3.scholar.com Triggering?node3.scholar.com Getting?status status?is?success node3.scholar.com?finished?with?exit?code?0 Finished |
推送成功,puppet kick功能實現(xiàn),至此,Puppet基于Master/Agent模式實現(xiàn)LNMP平臺部署實驗全部完成
The end
Puppet基本應(yīng)用就先說到這里了,Puppet功能強大,從管理規(guī)模方面較之Ansible,Puppet還是略勝一籌的,以上只是牛刀小試,有興趣的朋友可以深入研究,部署過程中遇到問題可留言交流。以上僅為個人學(xué)習(xí)整理,如有錯漏,大神勿噴~~~
本文轉(zhuǎn)自 北城書生 ?51CTO博客,原文鏈接:http://blog.51cto.com/scholar/1673562
總結(jié)
以上是生活随笔為你收集整理的Puppet基于Master/Agent模式实现LNMP平台部署的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins + Gitlab + A
- 下一篇: 网线制作(一根网线劈开给2台同时上网使用