前言
隨著IT行業的迅猛發展,傳統的運維方式靠大量人力比較吃力,運維人員面對日益增長的服務器和運維工作,不得不把很多重復的、繁瑣的工作利用自動化處理。前期我們介紹了運維自動化工具ansible的簡單應用,本期帶來的是運維自動化神器puppet基于Master/Agent模式實現LNMP平臺部署。
Puppet
簡介
Puppet是基于ruby語言開發的一種Linux、Unix、Windows平臺的集中配置管理系統,可以C/S模式或獨立運行,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。
工作流程
①Agent向Master端發起認證請求
②Master端驗證其合法性,允許其連接
③Agent將本機變量(主機名、內存大小、IP地址等)通過SSL連接發送給Master
④Master檢測Agent的主機名,然后找到manifest對應的node配置,并對該部分內容進行解析。解析結果生成一個“偽代碼”(catelog),并將其發給Agent
⑤Agent接收到“偽代碼”,開始執行
⑥執行時判斷有沒有File文件,如果有,則向fileserver發起請求
⑦判斷有沒有配置Report,如果已配置,則把執行結果發送給服務器
⑧執行結束,檢測系統狀態
實現過程
實驗拓撲
#系統環境:CentOS6.6 #各主機間可通過域名通信,基于hosts實現 #各主機時間已同步
Puppet Master配置
安裝所需軟件包
[root@node1 ~]# yum install puppet puppet-server -y
創建模塊目錄
[root@node1 ~]# cd /etc/puppet/modules/ [root@node1 modules]# mkdir nginx/{files,manifests} php/{files,manifests} mysql/{files,manifests} -pv
準備各服務配置文件
[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/
創建各模塊
[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"
以上資源詳解
#package詳解 ensure:程序包目標狀態,{present(installed)|absent|purged|held|latest} name:資源名稱,即軟件包名字,可省略,如果省略,將繼承title的值 provide:軟件包管理器,會自動識別 source:程序包文件路徑 install_options:安裝選項,最常用的是通過INATALLDIR來制定安裝目錄 #file詳解 ensuce:目標狀態,{present|absent|directory|file|link} backup:通過filebacket資源來備份文件,值通常為filebucket資源的名稱 content:文件內容,生成方式有三種(content,source,target),三者彼此互斥 source:通過制定的url下載文件至本地,格式:puppet:///modules/MODULE_NAME/file_name target:為符號鏈接指定目標 links:文件為符號連接,{follow|manage} path:文件路徑,必須使用雙引號 mode:定義權限,通常為8進制數字 owner: 定義文件的屬主 group:定義文件的屬組 force:強制執行刪除文件、鏈接或目錄,僅用于ensure為absent時 purge:清除指定目錄中存在的,但未在資源中定義的文件 resurce:目錄遞歸,{true|false|inf|remote} replace:替換,本地存在的文件與資源中指定的文件內容不同時是否執行替換,默認為否 #service詳解 ensure:服務目標狀態,{ true(running)|false(stopped)} enable:是否開機自動啟動,{true|false} name:服務名稱,可以省略,如果省略,將繼承title的值 path:服務腳本路徑,默認為/etc/init.d/ start:是否啟動服務 stop:是否關閉服務 restart:是否重啟服務 status:判斷服務是否運行 #特殊屬性 require:需要依賴于某個資源 before:應該先執行本資源,在執行別的資源 notify: 將當前資源的變動信息通知給別的資源 subscribe:訂閱某資源變動信息 -> :后資源需要依賴前資源 ~> :前資源變動通知后資源調用
啟動服務
首次啟動puppet-server守護進程時,其會自動進行運行環境的初始化,例如創建一個本地CA及服務器端相關的證書和密鑰等。初始化操作完成后,puppet就會監聽指定的套接字并等待客戶端的連接請求。默認情況下,其證書和密鑰等文件位于/var/lib/puppet/ssl/目錄中。
出于調試的目的,首次啟動puppet服務進程可以以非守護進程方式進行,并讓其輸出詳解信息以便于觀察初始化過程。如下所示過程,其逐步展示了創建本地CA、作為puppet服務器的本地主機向CA申請證書、獲得證書以及CA移出證書簽署請求的過程等,而后啟動服務進程并準備接受各agent的連接請求。為下面的命令額外使用–debug選項,還可以獲得更為詳細的輸出信息。
如果上述的測試啟動沒有問題,可中止當前的啟動,正式啟動服務了
[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配置
安裝所需軟件包
[root@node3 ~]# yum install puppet -y
指定puppet server
[root@node3 ~]# vim /etc/puppet/puppet.conf #也可手動命令指定 [agent] server = node1.scholar.com
啟動服務之前先來看一下各agent端所需軟件是否安裝
[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
啟動服務
puppet agent在首次啟動時,會向為其指定的puppet server申請證書,并完成后續連接請求。同樣的理由,出于測試的目的,接入當前puppet集群中的首個agent節點可以以非守護進程的方式進行,以觀察其初始化過程
#所有agent端都執行以上系列操作
此時,在puppet服務器端使用puppet cert命令管理客戶端的證書請求,其–list選項能夠查看等待簽署證書的客戶端列表,而–sign選項可用于為指定指定節點簽署證書,如果要一次性地為多個節點的證書申請進行簽署可同時使用–all選項
正式啟動服務
[root@node3 ~]# service puppet start Starting puppet: [ OK ] [root@node4 ~]# service puppet start Starting puppet: [ OK ]
再次檢查各agent端軟件狀態
[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
各服務已按預設啟動,Puppet基于Master/Agent模式實現LNMP平臺部署成功完成
Puppet Kick
agent跟master默認30分鐘通信一次,如果在這期間,某一服務出現bug或配置有誤,如何實現緊急推送,盡量減少業務損失呢?下面簡單說一下puppet kick功能的實現
Puppet Agent配置
[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都執行以上操作
Puppet Master推送
[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功能實現,至此,Puppet基于Master/Agent模式實現LNMP平臺部署實驗全部完成
The end
Puppet基本應用就先說到這里了,Puppet功能強大,從管理規模方面較之Ansible,Puppet還是略勝一籌的,以上只是牛刀小試,有興趣的朋友可以深入研究,部署過程中遇到問題可留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/6236