Puppet基于Master/Agent模式實現LNMP平臺部署

前言

隨著IT行業的迅猛發展,傳統的運維方式靠大量人力比較吃力,運維人員面對日益增長的服務器和運維工作,不得不把很多重復的、繁瑣的工作利用自動化處理。前期我們介紹了運維自動化工具ansible的簡單應用,本期帶來的是運維自動化神器puppet基于Master/Agent模式實現LNMP平臺部署。

Puppet

簡介

Puppet是基于ruby語言開發的一種Linux、Unix、Windows平臺的集中配置管理系統,可以C/S模式或獨立運行,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。

工作流程

puppet工作流程.jpg

①Agent向Master端發起認證請求

②Master端驗證其合法性,允許其連接

③Agent將本機變量(主機名、內存大小、IP地址等)通過SSL連接發送給Master

④Master檢測Agent的主機名,然后找到manifest對應的node配置,并對該部分內容進行解析。解析結果生成一個“偽代碼”(catelog),并將其發給Agent

⑤Agent接收到“偽代碼”,開始執行

⑥執行時判斷有沒有File文件,如果有,則向fileserver發起請求

⑦判斷有沒有配置Report,如果已配置,則把執行結果發送給服務器

⑧執行結束,檢測系統狀態

實現過程

實驗拓撲

Puppet實現LNMP平臺部署.jpg

#系統環境: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選項,還可以獲得更為詳細的輸出信息。

1.jpg

如果上述的測試啟動沒有問題,可中止當前的啟動,正式啟動服務了

[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節點可以以非守護進程的方式進行,以觀察其初始化過程

2.jpg

#所有agent端都執行以上系列操作

此時,在puppet服務器端使用puppet cert命令管理客戶端的證書請求,其–list選項能夠查看等待簽署證書的客戶端列表,而–sign選項可用于為指定指定節點簽署證書,如果要一次性地為多個節點的證書申請進行簽署可同時使用–all選項

3.jpg

正式啟動服務

[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

(0)
書生書生
上一篇 2015-07-10 23:06
下一篇 2015-07-13 16:46

相關推薦

  • cnetos 6.7 內核編譯

    簡介     Linux內核的體積結構是單內核的,但充分借鑒了微內核設計體系的優點,為內核引入模塊化機制,使得雖然是單內核、但工作在模塊化的方式下、并且這個模塊可以動態裝載或卸載;Linux負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。如是我們在了解Linux內核的基礎上根據自己的需…

    Linux干貨 2016-02-27
  • sed命令應用詳解

    sed應用詳解 sed是文本處理處理工具“三大劍客”之一,它 是一種流編輯器,sed一次只處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(patternspace),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。sed不會修改原文件內容,除非你使用重定向存儲輸出?!?/p>

    Linux干貨 2016-08-11
  • 關于shell腳本基礎第二篇

                          shell腳本編程基礎第二篇 read命令 使用read來把輸入的值非配給一個或者多個shell變量,可以提示用戶輸入一些參數等,此時我們可以使用read命令來完成此功能 re…

    系統運維 2016-08-19
  • N22第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可 [root@localhost ~]# who |cut -d' ' -f1 |sort -u   root   xuc 2、取出…

    Linux干貨 2016-08-29
  • 2017全球互聯網架構大會上海站火熱來襲,等您赴約!

    GIAC 全球互聯網架構大會,是長期關注互聯網技術與架構的高可用架構技術社區推出的,面向架構師、技術負責人及高端技術從業人員的年度技術架構大會。

    2017-11-30
欧美性久久久久