puppet基本原理,并用puppet分段配置nginx反向代理

一、puppet概念

  • 1、puppet是一種Linux、Unix、windows平臺(tái)的集中配置管理系統(tǒng),使用自有的puppet描述語言,可管理配置文件、用戶、cron任務(wù)、軟件包、系統(tǒng)服務(wù)等。puppet把這些系統(tǒng)實(shí)體稱之為資源,puppet的設(shè)計(jì)目標(biāo)是簡(jiǎn)化對(duì)這些資源的管理以及妥善處理資源間的依賴關(guān)系。
  • 2、puppet采用C/S星狀的結(jié)構(gòu),所有的客戶端和一個(gè)或幾個(gè)服務(wù)器交互。每個(gè)客戶端周期的(默認(rèn)半個(gè)小時(shí))向服務(wù)器發(fā)送請(qǐng)求,獲得其最新的配置信息,保證和該配置信息同步。每個(gè)puppet客戶端每半小時(shí)(可以設(shè)置)連接一次服務(wù)器端, 下載最新的配置文件,并且嚴(yán)格按照配置文件來配置客戶端. 配置完成以后,puppet客戶端可以反饋給服務(wù)器端一個(gè)消息. 如果出錯(cuò),也會(huì)給服務(wù)器端反饋一個(gè)消息.
puppet工作流程

puppet三層模型
  • 3、puppet既可以在單機(jī)上使用,也可以以c/s結(jié)構(gòu)使用.在大規(guī)模使用puppet的情況下,通常使用c/s結(jié)構(gòu).在這種結(jié)構(gòu)中puppet客戶端只是指運(yùn)行puppet的客戶端,puppet服務(wù)器端是只運(yùn)行puppetmaster的服務(wù)器.

  • 4、puppet客戶端首先會(huì)連接到puppet服務(wù)器端,并且通過facter工具把客戶端的基本配置信息發(fā)送給服務(wù)器端. 服務(wù)器端通過分析客戶端的主機(jī)名,通過node 定義,找到該主機(jī)的配置代碼,然后編譯配置代碼,把編譯好的配置代碼發(fā)回客戶端,客戶端執(zhí)行代碼完成配置.并且把代碼執(zhí)行情況反饋給puppet服務(wù)器端.

二、puppet的安裝

1、puppet的工作模型:

  • 單機(jī)模型:手動(dòng)應(yīng)用清單,本地編輯清單,在本機(jī)跑清單;
  • master/agent模型:master編輯清單,由agent周期性地向Master請(qǐng)求清單并自動(dòng)應(yīng)用于本地;


    puppet工作模型

2、puppet程序的安裝

  • 可以用epel倉(cāng)庫安裝版本較舊,也可以到官網(wǎng)下載較新版本rpm包安裝。
使用epel源安裝
[root@node-60 ~]# yum install facter puppet.noarch puppet-server.noarch -y
Installed:
 facter.x86_64 0:2.4.1-1.el7             
 puppet.noarch 0:3.6.2-3.el7      
 puppet-server.noarch 0:3.6.2-3.el7     

三、puppet程序

單機(jī)模型:

1、程序環(huán)境:

        配置文件:/etc/puppet/puppet.conf 
        主程序:/usr/bin/puppet 

2、puppet程序

  • 命令格式: puppet <subcommand> [options] <action> [options]

help 顯示幫助
apply 在本地資源清單
describe 顯示幫助清單類型
agent 代理域
master 主域
module 管理模塊
report 報(bào)告
status 服務(wù)端信息
……

  • 命令幫助

'puppet help <subcommand>' for help on a specific subcommand.
'puppet help <subcommand> <action>' for help on a specific subcommand action.

3、子命令:puppet apply:在本機(jī)應(yīng)用

格式:puppet apply [-d|--debug] [-v|--verbose] [-e|--execute] [--noop] <file>

四、puppet資源:

1、資源概念

資源抽象的緯度,RAL資源層如何抽象資源:

  • 類型:具有類似屬性的組件,例如package、service、file;
  • 將資源的屬性或狀態(tài)與其實(shí)現(xiàn)方式分離;
  • 僅描述資源的目標(biāo)狀態(tài),也即期望其實(shí)現(xiàn)的結(jié)果狀態(tài),而不是具體過程;
  • RAL由“類型”和提供者(provider)組成;

2、資源的子命令puppet describe:

  • 查詢有多少資源的子命令puppet describe:

puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]
-l:列出所有資源類型;
-s:顯示指定類型的簡(jiǎn)要幫助信息;
-m:顯示指定類型的元參數(shù),一般與-s一同使用;

3、資源的定義

  • 資源定義:向資源類型的屬性賦值來實(shí)現(xiàn),可稱為資源類型實(shí)例化;
  • 定義了資源實(shí)例的文件即清單,manifest;
定義資源的語法:
type {'title':
attribute1  => value1,
atrribute2  => value2,
……
}
  • 注意:type必須使用小寫字符;title是一個(gè)字符串,在同一類型中必須惟一;

4、資源的屬性

資源屬性中的三個(gè)特殊屬性:

Namevar, 可簡(jiǎn)稱為name;
ensure:資源的目標(biāo)狀態(tài);
Provider:指明資源的管理接口;

五、puppet資源類型

  • puppet資源核心類型:
    • group: 組
    • user:用戶
    • packge:程序包
    • service:服務(wù)
    • file:文件
    • exec:執(zhí)行自定義命令,要求冪等
    • cron:周期性任務(wù)計(jì)劃
    • notify:通知
  • puppet describe了解資源類型細(xì)節(jié)命令

1、group:管理組

屬性:

name:組名;
gid:GID;
system:是否為系統(tǒng)組,true OR false;
ensure:目標(biāo)狀態(tài),present/absent;
members:成員用戶;

示例:
[root@node-60 ~]# mkdir manifests
[root@node-60 ~]# cd manifests/
[root@node-60 manifests]# vim first.pp

group{'nginx':
          ensure => present,  #定義目標(biāo)狀態(tài)必須存在,如果沒有則創(chuàng)建
           name   => 'nginx',   #名字
          system =>true,        
}
#測(cè)試預(yù)運(yùn)行一次
[root@node-60 manifests]# puppet apply --verbose --noop first.pp   
Notice: Compiled catalog for node-60 in environment production in 0.11 seconds #編譯時(shí)間
Info: Applying configuration version '1542707136'
Info: Creating state file /var/lib/puppet/state/state.yaml   #生成yaml文件地址
Notice: Finished catalog run in 0.05 seconds

2、user用戶管理

屬性:

name:用戶名;
uid: UID;
gid:基本組ID;
groups:附加組,不能包含基本組;
comment:注釋;
expiry:過期時(shí)間 ;
home:家目錄;
shell:默認(rèn)shell類型;
system:是否為系統(tǒng)用戶 ;
ensure:present/absent;
password:加密后的密碼串;

示例:
[root@node-60 manifests]# vim user1.pp

group{'nginx':
          system => true,
          ensure => present,  #定義目標(biāo)狀態(tài)必須存在,如果沒有則創(chuàng)建
}

user{'nginx':
           uid => 444,
           gid => 'nginx',
           system => true,
           ensure => present,
     }
[root@node-60 manifests]# puppet apply --verbose  user1.pp  #執(zhí)行清單
Notice: Compiled catalog for node-60 in environment production in 0.20 seconds
Info: Applying configuration version '1542724757'
Notice: /Stage[main]/Main/Group[nginx]/ensure: created  #創(chuàng)建nginx組
Notice: /Stage[main]/Main/User[nginx]/ensure: created   #創(chuàng)建nginx用戶
Notice: Finished catalog run in 0.12 seconds
#查詢組和用戶已創(chuàng)建
[root@node-60 manifests]# tail /etc/passwd
nginx:x:444:996::/home/nginx:/bin/bash

3、關(guān)系元參數(shù):before/require依賴關(guān)系,用于管理次序

A before B: B依賴于A,定義在A資源中;

{
...
before  => Type['B'],
...
}

B require A: B依賴于A,定義在B資源中;

{
...
require => Type['A'],
...
}

示例:

[root@node-60 manifests]# vim user1.pp

group{'nginx':
        system => true,
        ensure => present,  #定義目標(biāo)狀態(tài)必須存在,如果沒有則創(chuàng)建
        before => User['nginx'], #前資源依賴
}

user{'nginx':
         uid => 444,
         gid => 'nginx',
         system => true,
         ensure => present,
         #require => Group['redis'], #后資源依賴
   }
~                         

4、package管理程序包

屬性:

ensure:installed安裝最新版本, present安裝, latest裝上, absent不安裝
name:包名;
source:程序包來源,僅對(duì)不會(huì)自動(dòng)下載相關(guān)程序包的provider有用,例如rpm或dpkg;

示例1:
[root@node-60 manifests]# vim package.pp

package{'nginx':
          ensure => latest,
}
[root@node-60 manifests]# puppet apply --verbose  package.pp 
#安裝完成
[root@node-60 manifests]# rpm -q nginx
nginx-1.12.2-2.el7.x86_64

示例2:
[root@node-60 manifests]# vim package1.pp

package{'jdk':
     ensure => installed,    #源安裝
     soure =>  '/root/jdk-7u79-linux-x64.rpm',  #安裝源路徑
     provider => rpm,  #安裝方式
 }

5、service管理運(yùn)行中的服務(wù)

屬性:

ensure:一個(gè)服務(wù)是否應(yīng)該運(yùn)行
enable:開機(jī)自動(dòng)啟動(dòng). true啟動(dòng), false不啟動(dòng), manual手動(dòng)啟動(dòng).
name:
path:The search path for finding init scripts. Multiple values should be separated by colons or provided as an array. 腳本的搜索路徑,默認(rèn)為/etc/init.d/;
hasrestart:是否有restart方法
hasstatus:是否有status探測(cè)方法
start:手動(dòng)定義啟動(dòng)命令;
stop:手動(dòng)定義停止命令;
status:手動(dòng)定義運(yùn)行信息命令;
restart:Specify a restart command manually. If left unspecified, the service will be stopped and then started. 通常用于定義reload操作;

示例:
[root@node-60 manifests]# vim service.pp
 #定義程序包
package{'nginx':         
             ensure => present, #定義目標(biāo)狀態(tài)必須存在,如果沒有則創(chuàng)建
}
#定義服務(wù)
service{'nginx':       
          ensure => running, #啟動(dòng)nginx
          enable => true,      #開機(jī)啟動(dòng)
          require => Package['nginx'],  #依賴于是否安裝了nginx
}
[root@node-60 manifests]# puppet apply --verbose  service.pp 
[root@node-60 manifests]# ss -tnl
#查詢是否啟動(dòng)
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port                            
LISTEN     0      128        *:80                     *:*  

6、資源引用:

Type['title']類型的首字母必須大寫;

資源有特殊屬性:

名稱變量(namevar):
name可省略,此時(shí)將由title表示;
ensure:
定義資源的目標(biāo)狀態(tài);
元參數(shù):metaparameters
依賴關(guān)系:before或require
通知關(guān)系:通知相關(guān)的其它資源進(jìn)行“刷新”操作;

notify通知事件
  • A notify B:B依賴于A,且A發(fā)生改變后會(huì)通知B;
{
...
notify => Type['B'],
...
}
subscribe訂閱事件
  • B subscribe A:B依賴于A,且B監(jiān)控A資源的變化產(chǎn)生的事件;
{
...
subscribe => Type['A'],
...
}

7、文件資源管理file:

管理文件相關(guān)配置,屬主屬組等
ensure屬性:present,absent, file, directory ,link

  • file:類型為普通文件,其內(nèi)容由content屬性生成或復(fù)制由source屬性指向的文件路徑來創(chuàng)建;
  • link:類型為符號(hào)鏈接文件,必須由target屬性指明其鏈接的目標(biāo)文件;
  • directory:類型為目錄,可通過source指向的路徑復(fù)制生成,recurse屬性指明是否遞歸復(fù)制;

path:文件路徑;
source:源文件;
content:生成文件內(nèi)容;
target:符號(hào)鏈接的目標(biāo)文件;
owner:屬主
group:屬組
mode:權(quán)限;
atime/ctime/mtime:時(shí)間戳;

  • 通知元參數(shù):
    A notify B:B依賴于A,接受由A觸發(fā)refresh;
    B subscribe A:B依賴于A,接受由A觸發(fā)refresh;
示例1:
#文件類型
file{'test.txt':
path    => '/tmp/test.txt',
ensure  => file,  #文件類型
source  => '/etc/fstab',
}

#生成文件內(nèi)容
file{'test.txt':
ensure  => file,  #文件類型
content  => 'Hello world‘, #生成文件內(nèi)容
}

#符號(hào)連接
file{'test.symlink':
path    => '/tmp/test.symlink', #文件路徑
ensure  => link,           #符號(hào)連接類型
target  => '/tmp/test.txt', #符號(hào)鏈接的目標(biāo)文件
require => File['test.txt'],
}

 #目錄
file{'test.dir':
path    => '/tmp/test.dir', #目錄
ensure  => directory, #目錄類型
source  => '/etc/yum.repos.d/',  #目標(biāo)目錄
recurse => true, #是否使用遞歸
}
示例2:
[root@node-60 manifests]# vim service.pp 

package{'redis':
        ensure => present,
} 
file{'/etc/redis.conf':
       ensure => file,
       source => '/root/manifests/redis.conf',
       require => Panckage['redis'], #依賴于redis是否安裝
       owner =>  'redis',
       group =>  'root',
}


service{'nginx':
          ensure => running,
          enable => true,
          subscribe => File['/ect/redis.conf'], #依賴于配置文件改變
}

示例3
[root@node-60 manifests]# vim service.pp 

package{'redis':
        ensure => present,
} 
file{'/etc/redis.conf':
       ensure => file,
       source => '/root/manifests/redis.conf',
       owner =>  'redis',
       group =>  'root',
}


service{'nginx':
          ensure => running,
          enable => true,
}
#鏈?zhǔn)揭?Package['redis'] -> File['/etc/redis.conf'] ~> Service['redis']

7、exec:

任何寫在exec中的命令,必須重復(fù)執(zhí)行多次而不產(chǎn)生危害后果,有冪等性.

command (namevar):要運(yùn)行的命令;
cwd:運(yùn)行命令時(shí)候切換到那個(gè)目錄
creates:文件路徑,僅此路徑表示的文件不存在時(shí),command方才執(zhí)行;
user/group:運(yùn)行命令的用戶身份;
path:尋找command相對(duì)路勁
onlyif:此屬性指定一個(gè)命令,此命令正常(退出碼為0)運(yùn)行時(shí),當(dāng)前command才會(huì)運(yùn)行;
unless:此屬性指定一個(gè)命令,此命令非正常(退出碼為非0)運(yùn)行時(shí),當(dāng)前command才會(huì)運(yùn)行;
refresh:重新執(zhí)行當(dāng)前command的替代命令;
refreshonly:僅接收到訂閱的資源的通知時(shí)方才運(yùn)行;

示例1:
[root@node-60 manifests]# vim test1.pp

exec{'mkdir':
      command => 'mkdir /tmp/testdir',
      path=> '/bin:/sbin:/usr/sbin',
      creates => 'tmp/testdir', #判斷目錄不存在才執(zhí)行command
}

示例2:
[root@node-60 manifests]# vim test2.pp
package{'mogilefs'
        ensure => latest,
   }
exec{'adduser':
      command => 'useradd -r mogilefs',
      path => '/bin:/sbin:/usr/bin:/usr/sbin',
     unless => 'id mogilefs',#此命令執(zhí)行失敗,command才執(zhí)行
     refreshonly => true,
     subscribe => Package['mogilefs'], #訂閱mogilefs包安裝失效

}

8、cron計(jì)劃任務(wù):

實(shí)現(xiàn)及管理計(jì)劃任務(wù),只是有一個(gè)命令和周期時(shí)間屬性

command:要執(zhí)行的任務(wù);
ensure:'present'定義/'absent'刪除;
hour:小時(shí)
minute:分鐘
monthday:日
month:月
weekday:周
user:以哪個(gè)用戶的身份運(yùn)行命令
target:添加為哪個(gè)用戶的任務(wù)
name:cron job的名稱;

示例:
  • 每隔3分鐘向時(shí)間服務(wù)器同步時(shí)間
cron{'timesync':
command => '/usr/sbin/ntpdate 10.1.0.1 &>  /dev/null', #同步時(shí)間
ensure  => present,
minute  => '*/3', #每隔3分鐘
user    => 'root',
}

9、notify顯示輸出:

屬性:

message:信息內(nèi)容
name:信息名稱;

示例:
notify{ 'sayhi':
         message => 'How old are you?',
         name => 'sayhi',
}

六、puppet variable變量

$variable_name=value:以$開頭變量名=值

1、數(shù)據(jù)類型:

  • 字符型:引號(hào)可有可無;但單引號(hào)為強(qiáng)引用,雙引號(hào)為弱引用;
  • 數(shù)值型:默認(rèn)均識(shí)別為字符串,僅在數(shù)值上下文才以數(shù)值對(duì)待;
  • 數(shù)組:[]中以逗號(hào)分隔元素列表;
  • 布爾型值:true, false,不能加引號(hào);
  • hash哈希:{}中以逗號(hào)分隔k/v數(shù)據(jù)列表; 鍵為*
    字符型,值為任意puppet支持的類型;{ 'mon' => 'Monday', 'tue' => 'Tuesday', };
  • undef:未定義 ;

2、表示格式

  • 正則表達(dá)式:

    • 格式
      (?<ENABLED OPTION>:<PATTERN>)
      (?-<DISABLED OPTION>:<PATTERN>)
  • 操作字符OPTIONS:
    i:忽略字符大小寫;
    m:把.當(dāng)換行符;
    x:忽略<PATTERN>中的空白字符

(?i-mx:PATTERN)

  • 注意:不能賦值給變量 ,僅能用在接受=~或 !~操作符的位置;

3、puppet的變量類型:

facts:由facter提供;top scope;

內(nèi)建變量:
master端變量
agent端變量
parser變量
用戶自定義變量:

變量有作用域,稱為Scope;

top scope: $::var_name
node scope
class scope

變量作用域

4、puppet流程控制語句:

(1)、if語句:

if CONDITION {
... #條件滿足執(zhí)行

} else {
... #否則執(zhí)行另一個(gè)
}

  • CONDITION的給定方式:
    (1) 變量
    (2) 比較表達(dá)式
    (3) 有返回值的函數(shù)
示例:
if $osfamily =~ /(?i-mx:debian)/ {  #如果模式匹配不區(qū)分大小寫操作系統(tǒng)是debian
$webserver = 'apache2'   #定義一個(gè)變量為apache2
} else {
$webserver = 'httpd'    #否則定義一個(gè)變量為httpd
}

package{"$webserver":  #定義一個(gè)包
ensure  => installed,    #安裝
before  => [ File['httpd.conf'], Service['httpd'] ], #后面兩個(gè)資源都依賴于這個(gè)資源
}

file{'httpd.conf':     #定義一個(gè)配置文件
path    => '/etc/httpd/conf/httpd.conf', #文件路徑
source  => '/root/manifests/httpd.conf',  #源配置文件
ensure  => file,
}

service{'httpd':  #定義一個(gè)服務(wù)
ensure  => running,  #啟動(dòng)服務(wù)
enable  => true,      #開機(jī)啟動(dòng)
restart => 'systemctl restart httpd.service',  #輸出字符
subscribe => File['httpd.conf'],
}
(2)case語句:

多分支語句格式:

case CONTROL_EXPRESSION {
case1: { ... } #滿足1分支,執(zhí)行后跳出,否則執(zhí)行下一個(gè)分支
case2: { ... } #滿足2分支,執(zhí)行跳出,否則執(zhí)行下一個(gè)分支
case3: { ... } #滿足3分支,執(zhí)行跳出,否則執(zhí)行下一個(gè)分支
...
default: { ... } #所有分支都不滿足,執(zhí)行default跳出
}

  • CONTROL_EXPRESSION:
    (1) 變量
    (2) 表達(dá)式
    (3) 有返回值的函數(shù)

  • 各case的給定方式:
    (1) 直接字串;
    (2) 變量
    (3) 有返回值的函數(shù)
    (4) 正則表達(dá)式模式;
    (5) default

示例:
case $osfamily {  #判斷系統(tǒng)類型
"RedHat": { $webserver='httpd' }   #如果系統(tǒng)為Redhat,則變量值為httpd
/(?i-mx:debian)/: { $webserver='apache2' }  #如果不區(qū)分大小寫匹配是debian系統(tǒng),變量值為apache2
default: { $webserver='httpd' } #如果都不是,則變量值為httpd
}

package{"$webserver": #定義安裝包,值為case判斷變量$webserver的結(jié)果
ensure  => installed,     #安裝
before  => [ File['httpd.conf'], Service['httpd'] ],
}

file{'httpd.conf':  #定義配置文件
path    => '/etc/httpd/conf/httpd.conf',
source  => '/root/manifests/httpd.conf',
ensure  => file,
}

service{'httpd':  #定義服務(wù)
ensure  => running, #啟動(dòng)
enable  => true,
restart => 'systemctl restart httpd.service',
subscribe => File['httpd.conf'],
}
(3)、selector語句:

CONTROL_VARIABLE ? {
case1 => value1,
case2 => value2,
...
default => valueN,
}

  • CONTROL_VARIABLE的給定方法:
    (1) 變量
    (2) 有返回值的函數(shù)

  • 各case的給定方式:
    (1) 直接字串;
    (2) 變量
    (3) 有返回值的函數(shù)
    (4) 正則表達(dá)式模式;
    (5) default

注意:不能使用列表格式;但可以是其它的selecor;

示例1:
$pkgname = $operatingsystem ? {
/(?i-mx:(ubuntu|debian))/       => 'apache2',
/(?i-mx:(redhat|fedora|centos))/        => 'httpd',
default => 'httpd',
}

package{"$pkgname":
ensure  => installed,
}
示例2:
$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/manifests/httpd.conf',
ensure  => file,
}

service{'httpd':
ensure  => running,
enable  => true,
restart => 'systemctl restart httpd.service',
subscribe => File['httpd.conf'],
}

七、puppet的類

1、類的概念

  • puppet中命名的代碼模塊,常用于定義一組通用目標(biāo)的資源,可在puppet全局調(diào)用;
    類可以被繼承,也可以包含子類;

2、語法格式:

class NAME {
...puppet code...
}

class NAME(parameter1, parameter2) {
...puppet code...
}
類代碼只有聲明后才會(huì)執(zhí)行,調(diào)用方式:
  • (1) include CLASS_NAME1, CLASS_NAME2, ...
  • (2) class{'CLASS_NAME':
    attribute => value,
    }
示例1:
#聲明一個(gè)類
class apache2 {
$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  => '/tmp/httpd.conf',
require => Package["$webpkg"],
notify  => Service['httpd'],
}

service{'httpd':
ensure  => running,
enable  => true,
}
}
#調(diào)用apache2類,此句必須的
include apache2  
示例2:
#定義類
class dbserver{$pkgname){
          package{"$pkgname":
                       ensuer => latest,
         }
           service{"$pkgname":
                      ensuer => running,
                       enable=> true,
}
}
#判斷系統(tǒng)類型
if $operatingsystem == "CentOS" {
      $dbpkg = $operantingsystemmajrelease ? {
       7 => 'mariadb-server',
      default => 'mysqld-server',
}

#調(diào)用類
class {'dbserver':
             pkgname=> $dbpkg,
}

3、類的繼承

類繼承的方式:

格式:class SUB_CLASS_NAME inherits PARENT_CLASS_NAME {
...puppet code...
}

nginx分段配置反向代理示例:

class nginx {        #定義nginx父類
            package{'nginx':
           ensure  => installed,
}

service{'nginx':
          ensure  => running,
          enable  => true,
          restart => '/usr/sbin/nginx -s reload',
          }
}

class nginx::web inherits nginx {             #定義nginx的web子類,繼承于nginx父類
                       Service['nginx'] {
                       subscribe => File['ngx-web.conf'],
}

file{'ngx-web.conf':
                      path    => '/etc/nginx/conf.d/ngx-web.conf',
                       ensure  => file,
                      source  => '/root/manifests/ngx-web.conf',
}
}

class nginx::proxy inherits nginx {              #定義nginx的proxy子類,繼承于nginx父類
                   Service['nginx'] {
                    subscribe => File['ngx-proxy.conf'],
}

file{'ngx-proxy.conf':
                path    => '/etc/nginx/conf.d/ngx-proxy.conf',
                ensure  => file,
                source  => '/root/manifests/ngx-proxy.conf',
      }
}

include nginx::proxy                 #執(zhí)行nginx的proxy子類
  • 在子類中為父類的資源新增屬性或覆蓋指定的屬性的值:
Type['title'] {
attribute1 => value,
...
}
  • 在子類中為父類的資源的某屬性增加新值:
Type['title'] {
attribute1 +> value,
...
}

八、puppet模板:

  • erb:模板語言,embedded ruby;ruby內(nèi)嵌模板語言

puppet兼容的erb語法:
https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html

  • 格式:
file{'title':
ensure  => file,
content => template('/PATH/TO/ERB_FILE'),
}

文本文件中內(nèi)嵌變量替換機(jī)制:
<%= @VARIABLE_NAME %>

示例1:
[root@node-60 manifests]# vim nginx2.pp

package{'nginx':
        ensure => latest,
  }
file{ 'nginx.conf':
      path => '/etc/nginx/nginx.conf',
      content => template('/root/manifests/nginx.conf.erb'),  #模板文件       
  }     

#編輯模板文件  
[root@node-60 manifests]# cp /etc/nginx/nginx.conf nginx.conf.erb
[root@node-60 manifests]# vim nginx.conf.erb 
..........
user nginx;
worker_processes <%=@processorcount %>;  #把模板生成的代碼替換到此處,代表有幾個(gè)物理cpu內(nèi)核
...........

#執(zhí)行
[root@node-60 manifests]# puppet apply --verbose  nginx2.pp 
[root@node-60 manifests]# cat /etc/nginx/nginx.conf
..........
user nginx;
worker_processes 1;  #此處已經(jīng)變成1
..........

示例2:

class nginx {
            package{'nginx':
            ensure  => installed,
}

service{'nginx':
           ensure  => running,
           enable  => true,
           require => Package['nginx'],
           }
}

class nginx::web inherits nginx {
         file{'ngx-web.conf':
         path    => '/etc/nginx/conf.d/ngx-web.conf',
         ensure  => file,
          require => Package['nginx'],
          source  => '/root/manifests/nginx/ngx-web.conf',
}

file{'nginx.conf':
          path    => '/etc/nginx/nginx.conf',
          ensure  => file,
          content => template('/root/manifests/nginx.conf.erb'),    #配置文件使用模板
          require => Package['nginx'],
}

Service['nginx'] {
subscribe => [ File['ngx-web.conf'], File['nginx.conf'] ],
}
}

include nginx::web

九、puppet模塊:

  • 模塊就是一個(gè)按約定的、預(yù)定義的結(jié)構(gòu)存放了多個(gè)文件或子目錄的目錄,目錄里的這些文件或子目錄必須遵循一定格式的命名規(guī)范;

1、模塊路徑

  • puppet會(huì)在配置的路徑下查找所需要的模塊;

MODULES_NAME:模塊名稱
manifests/ 清單文件目錄
init.pp 資源文件
files/ 配置文件目錄
templates/ 所依賴的模板目錄
lib/插件目錄
spec/
tests/

模塊名只能以小寫字母開頭,可以包含小寫字母、數(shù)字和下劃線;但不能使用”main"和"settings“;

manifests/
* init.pp:必須一個(gè)類定義,類名稱必須與模塊名稱相同;
* files/:靜態(tài)文件;
     puppet URL:
       puppet:///modules/MODULE_NAME/FILE_NAME
* templates/:模板目錄
* tempate('MOD_NAME/TEMPLATE_FILE_NAME')
lib/:插件目錄,常用于存儲(chǔ)自定義的facts以及自定義類型;
* spec/:類似于tests目錄,存儲(chǔ)lib/目錄下插件的使用幫助和范例;
* tests/:當(dāng)前模塊的使用幫助或使用范例文件;

注意:
(1)、puppet 3.8及以后的版本中,資源清單文件的文件名要與文件聽類名保持一致,例如某子類名為“base_class::child_class”,其文件名應(yīng)該為child_class.pp;
(2)、無需再資源清單文件中使用import語句;
(3)、manifests目錄下可存在多個(gè)清單文件,每個(gè)清單文件包含一個(gè)類,其文件名同類名;

2、puppet config命令:

  • 獲取或設(shè)定puppet配置參數(shù);

格式:puppet config print [argument]

  • puppet查找模塊文件的路徑:modulepath
查詢可用模塊
[root@node-60 ]# puppet module serch nginx
安裝模塊
[root@node-60 ]# puppet module install oris-nginx
創(chuàng)建自定義chrony模塊示例:

#創(chuàng)建模塊目錄
[root@node-60 ~]# mkdir moudules
[root@node-60 ~]# cd moudules/

#創(chuàng)建固定格式目錄
[root@node-60 moudules]# mkdir chrony/{manifest,files,templates,lib,spec,tests} -pv
[root@node-60 moudules]# cd chrony/manifest/


#創(chuàng)建資源清單文件
[root@node-60 manifest]# vim init.pp

class chrony {
           package{'chrony':
       } ->
    file{'chrony.conf':
           path => '/etc/chrony.conf',
           source => 'puppet:///modules/chrony/chrony.conf',
         } ~>
      service{'chronyd':
            ensure => running,
            enable => true,
             }
      }
#把配置文件拷貝到files目錄下
[root@node-60 manifest]# cp /etc/chrony.conf ../files/

#修改配置文件相關(guān)項(xiàng)
[root@node-60 manifest]# vim  ../files/chrony.conf 
.........
server time1.aliyun.com iburst
........

#把自定義chrony模塊目錄拷貝到etc
[root@node-60 moudules]# cp -a chrony/ /etc/puppet/modules/
[root@node-60 moudules]# puppet module list
/etc/puppet/modules
└── chrony (???)
[root@node-60 moudules]# puppet apply -v -d -e 'include chrony'
mariadb模塊中的清單文件示例:
class mariadb($datadir='/var/lib/mysql') {
package{'mariadb-server':
ensure  => installed,
}

file{"$datadir":
ensure  => directory,
owner   => mysql,
group   => mysql,
require => [ Package['mariadb-server'], Exec['createdir'], ],
}

exec{'createdir':
command => "mkdir -pv $datadir",
require => Package['mariadb-server'],
path => '/bin:/sbin:/usr/bin:/usr/sbin',
creates => “$datadir",
}

file{'my.cnf':
path    => '/etc/my.cnf',
content => template('mariadb/my.cnf.erb'),
require => Package['mariadb-server'],
notify  => Service['mariadb'],
}

service{'mariadb':
ensure  => running,
enable  => true,
require => [ Exec['createdir'], File["$datadir"], ],
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Puppet理論定義: Puppet 是一個(gè)跨平臺(tái)的集中化配置管理系統(tǒng),它使用自有的描述語言,可管理配置文件、用戶...
    屬于你的世界閱讀 1,091評(píng)論 0 2
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,272評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 【0403~悅讀感悟】2263~泡沫 《把時(shí)間當(dāng)作朋友》~李笑來 摘抄 001 時(shí)間是現(xiàn)實(shí)的人的朋友,是不現(xiàn)實(shí)的人...
    持續(xù)行動(dòng)的泡沫閱讀 136評(píng)論 6 5
  • 1.付出不亞于任何人的努力 2.要謙虛,不要驕傲 3.要每天反省 4.活著,就要感謝 5.積善行,思利他 6.不要...
    Kleven_gao閱讀 136評(píng)論 0 0

友情鏈接更多精彩內(nèi)容