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
下一篇 2015-07-13

相關推薦

  • Nginx負載均衡和動靜分離

    實驗目的:實現Nginx的負載均衡和動靜分離 實現環境:一臺server用作Nginx代理(需要兩塊網卡,eth0連接內網,eth1連接外網),兩臺用作web服務(每臺server都定義兩個虛擬機,端口分別是80和8080),一臺客戶端用于驗證結果; 操作步驟 負載均衡的實現: 一、配置IP 1.配置A主機的IP # ip addr add dev eth0…

    2017-05-13
  • rpm 詳解

     rpm 包詳解 程序包的命名格式:name-VERSION.tar.gz 拆包:主包和分包 主包:name-VERSION-release.arch.rpm 支包:name-function-VERSION-release.arch.rpm   注意:程序包之間有時會存在依賴關系,依靠前端工具解決依賴關系 yum Rhel系列系統上的r…

    Linux干貨 2017-08-17
  • Linux udev-ASM(基于oracle5.8)

    之前有客戶有在Linux下使用udev來做ASM,操作系統版本為oracle5.8,實際跟rhel5.8差不多,當時只是做了簡單記錄,現在整理下來,與大家一起分享。 1)需求信息 磁盤分區操作 –省略– 分區后,使用parted讓磁盤生效 需求: 將/dev/sdc1 <–>/dev/asm-disk1 將/d…

    Linux干貨 2016-07-29
  • 細節決定成敗–空格的巨大作用以及正則表達式中元字符的轉義

    字符串的條件判定 1.字符串判定 一定要用雙[[ ]] 2.字符串判定=~默認支持擴展正則表達式,這里注意雙引號的使用 僅僅做是否包含時,有無雙引號無區別。 但是利用其他擴展表達式時 雙引號一定要去掉 錨定示例 多條件判定時-o -a使用時,不能使用雙中括號 空格有無的差別 !的使用細節 !到目前為止 有兩種意義 條件判定取反 歷史命令的調用 兩者的使用卻別…

    2017-03-19
  • bash基礎 if elif 多條件判斷 for循環

    bash基礎 if elif 多條件判斷 for循環

    Linux干貨 2017-10-31
  • 第二周作業

    1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 目錄管理類命令: cd:變更目錄   命令格式:cd [DIRECTORY] pwd:顯示當前目錄的絕對路徑 ls:顯示文件或目錄內容     命令格式:ls [OPTION]… [FILE]… &…

    Linux干貨 2017-01-08
欧美性久久久久