Linux之puppet

puppet簡介

puppet是一套IT基礎設施自動化管理工具,可以管理其整個生命周期,其官方網站:www.puppetlabs.org。其作者Luke Kanies成立了puppetLabs,于2005年發布0.2版本。puppet基于ruby語言研發,puppet有聲明性、基于模型的配置語言,其也有自己的配置編程言。

puppet的優勢

  • 基于master/agent的認證機制
  • 不依賴于客戶端系統的管理權限
  • 可實現配置自動推送給客戶端

puppet的版本

  • 0.2
  • 0.24.X
  • 0.25.X
  • 0.26.X
  • 2.7.X(目前比較流行的版本)
  • 3.0
  • 3.7

puppet的工作原理

  • puppet是C/S架構
  • puppet agent通常運行為一個服務進程,其默認每半個小時向master發出一次連接請求
  • puppet agent并不直接訪問任何manifest,而向master請求一個預編譯的catalog文件
  • puppet master會為發出請求的agent讀取一個名為”site manifest”的特殊manifest文件,并基于此編譯一個catalog后發送給請求者
  • puppet agent在獲取到catalog后,應用于本地文件

因此,基于此種工作架構,僅在master端提供一個或少量幾個Manifest即可實現管理大量的節點,并能提供更加安全的工作過程

puppet的三個層次概念

  • 資源抽象層(resource abstraction layre)

    • 相似的資源被抽象成同一種資源“類型”,如程序包資源、用戶資源及服務資源等
    • 將資源屬性或狀態的描述與其實現方式剝離開來,如僅說明安裝一個程序包而不用關心其具體是通過yum、pkgadd、ports或是其它方式實現
    • 僅描述資源的目標狀態,也即期望其實現的結果,而不是其具體過程,如“確定nginx運行起來”而不是具體描述為“運行nginx命令將其啟動起來
  • 事務層(transaction layer)

定義資源的依賴關系

  • 配置語言(configuration language)

puppet的術語

  • 模塊

是一個完整的功能,包含清單和清單所依賴的文件

  • 站點清單

針對一臺客戶端,它所需要的所有模塊

puppet程序的安裝

客戶端

  • yum install puppet facter

服務端

  • yum install puppet-server

puppet命令

用法格式:puppet <subcommand> [options] <action> [options]

  • subcommand
    • agent
    • apply :在本地運行清單
    • ca :管理本地CA
    • catalog : 查看catalog文件
    • config : 交互完成puppet配置
    • describe : 用來顯示資源類型的幫助
獲取所支持的所有資源類型
  • puppet describe -l
查看資源的使用幫助
  • puppet describe Resource_Type

定義資源常見語法

type {"title":
    attribute => value,
    attribute => value,
}

注意:type必須小寫, tile在同一類型下必須唯一

puppet資源類型

group資源類型

  • allowdupe : 是否允許使用相同的GID號
  • ensure
    • present : 建立
    • absent : 刪除
  • gid : 指定GID號
  • name : 組名,namevar,不顯示定義就使用title
  • system : 是否為系統組
    • true
    • false
  • members : 成員

user資源類型

  • comment : 描述信息
  • ensure
    • present
    • absent
  • expiry : 過期時間
  • gid : 基本組ID
  • groups : 附加組
  • home : 家目錄
  • keys : 指明密鑰
  • name : namevar,不顯示定義就使用title
  • password : 密碼
  • salt : 密碼的salt
  • shell : 默認shell
  • uid : UID
  • system : 是否為系統用戶
    • true
    • false
1、puppet添加組及用戶的示例:

group {'hadoop':
        ensure => present,
        gid => 200,
        system => true,
}

user {'docker':
        ensure => present,
        uid => 5000,
        system => false,
        groups => hadoop,
        home => "/home/docker",
        password => "zhenping.com",
        salt => 3kkxxkjfk,
        shell => "/bin/bash",
        comment => "docker virtual teach",
}

file資源類型

  • content : 直接給出文件內容,支持換行符和制表符
  • source : 從指定位置下載文件,可以是本地文件路徑,也可以是遠程服務端的路徑
  • ensure
    • file : 文件
    • directory : 目錄
    • link :連接文件
    • present
    • absent
  • force : 強行運行
    • true
    • false
  • group : 屬組
  • owner : 屬主
  • mode : 權限,可以使用ugo=rw或可以使用0664
  • replace :覆蓋
  • path : 路徑
  • target : 當ensure為link時,target表示path指向的文件是一個符號連接文件,其目標為些target屬性所指向的路徑,此時content和source屬性自動失效
2、遠程文件復制示例:
file {"/etc/nfs.conf":
        source => [
                "puppet:///modules/nfs/conf.$host",
                "puppet:///modules/nfs/conf.$operatingsystem",
                "puppet:///modules/nfs/conf"
        ]
}


3、向文件中添加文本內容
file {"/tmp/puppet.txt":
        ensure => file,
        content => "This is a puppet write content .",
        owner => docker,
        group => docker,
        mode => 700,
        replace => true,
}

4、創建文件示例
file {"/tmp/test4.txt":
        ensure => present,
}

5、創建目錄示例:
file {"/tmp/test":
        ensure => director,
}

6、創建軟連接
file {"/tmp/fstab_test.link":
        ensure => link,
        target => "/etc/fstab",
}
    將/tmp/fstab_test.link 連接至/etc/fstab

exec資源類型

使用特性
  • 命令本身具有冪等性
  • 資源有onlyif、unless、creates等屬性以實現命令的條件式運行
  • 資源有refreshonly屬性,以實現只有訂閱的資源發生變化時才執行
常用屬性
  • command : 運行的命令,namevar ,也可以在title上直接定義
  • creates : 此屬性指定的文件不存在時才執行命令
  • cwd : 在此屬性指定的路徑下運行命令
  • environment : 命令運行的環境變量,可以直接定義一個path
  • group : 以指定的組運行命令
  • user : 以指定的用戶身份運行命令
  • onlyif : 僅在此命令執行成功(返回狀態碼為0)時,才運行command指定的命令
  • unless : 僅在此命令執行失敗(返回狀態碼非0)時,才運行command指定的命令
  • refresh: 默認是執行command中定義的命令,當接受到其它資源發來的Notify時,即會執行refresh后面指定的命令
  • refreshonly : 僅在訂閱的資源運行成功后,才運行此資源
    • true
    • false
  • returns : 期望的狀態返回值,返回非此值時表示命令執行失敗
  • timeout : 命令執行超時時長
  • tries : 嘗試執行的次數,默認為1次
  • path : 指明命令搜索路徑,其功能類似path環境變量,不定義此屬性,則必須給定命令的絕對路徑
7、判斷ext4模塊是否被裝載,如果未裝載執行裝載操作
exec {"modprobe ext4":
    path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin:/root/bin"],   #導出PATH環境變量
    unless => "lsmod | grep ext4",  #當此操作發現未找到ext4模塊,返回代碼非零,才執行裝載操作
}

8、判斷ext4模塊是否在,如果存在才被裝載
exec {"modprobe ext4":
    path => ["/usr/lib64/qt-3.3/bin","/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin","/root/bin"],
    onlyif => "modinfo ext4",  #此命令返回狀態碼為0時,才執行Modprobe的命令
}


9 當用戶創建成功時,才生成weizi.notify的文件
group {"weizi":
    ensure => present,
    gid => 10000,
    notify => User["weizi"],
}
user {"weizi":
    ensure => present,
    uid => 10000,
#   notify => Exec["/bin/echo hello > /tmp/weizi.notify"],
}

exec {"/bin/echo hello > /tmp/weizi.notify":
    subscribe => User["weizi"],
    refreshonly => true,
}


exec {‘/bin/echo hello > /tmp/hello.txt’:
            user => root,
            group => root,
            creates => ‘/tmp/hello.txt’,
        }
            
    
exec {‘/bin/echo hello > /tmp/hello2.txt’:
            user => root,
            group => root,
            unless => ‘/usr/bin/test -e /tmp/hello2.txt’,
        }

notify資源類型

顯示通知信息

nofify {"hello world":}

cron資源類型

管理計劃任務

常用選項
  • command : 要運行的job
  • ensure
    • present
    • absent
  • user : 運行任務的用戶
  • name : 任務計劃的名稱
  • target
  • hour : 小時
  • minute : 分鐘
  • month : 月
  • monthday : 每月的第幾天
  • weekday : 每周幾
  • environment : 運行時的環境變量
10、建立系統時間同步任務
cron {"sync time":
    command => "/usr/sbin/ntpdate 172.16.0.1 &> /dev/null",
    hour => "18",
    minute => "28",
}

[root@Centos7 manifests]# crontab -l
# Puppet Name: sync time
28 18 * * * /usr/sbin/ntpdate 172.16.0.1

package資源類型

管理程序包的安裝、卸載、升級等

常用選項
  • ensure
    • installed
    • present
    • absent
    • purged
    • held
  • discription : 描述信息
  • configfiles : 配置文件
    • keep
    • replace
  • install_options : 安裝選項
  • name : 程序包名稱
  • status : 狀態
  • source : 程序包的來源,可以本地文件路徑或URL
  • provider : 使用什么方式安裝,如安裝rpm命令來安裝
    • rpm
    vim test7.pp
package {‘zsh’:
            ensure => latest,
        }

package {‘jdk’:
            ensure => installed,
            source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm’,
            provider => rpm,
        }

service資源類型

實現服務管理

常用選項
  • binary : 二進制程序文件路徑
  • enable : 是否開機自動啟動
    • true
    • false
    • manual
  • ensure
    • stopped
    • running
  • hasrestart : 服務腳本是否支持restart參數
    • true
    • false
  • hasstatus : 服務腳本是否支持status參數
    • true
    • false
  • name : 服務的名稱,namevar
  • path : 服務腳本的搜索路徑
  • pattern : 用于搜索此服務相關進程的模式,通過匹配進程名稱確定服務是否正常運行
  • restart : 用于執行重啟的命令
  • start : 用于執行開始的命令
  • status
  • stop
11、安裝Nginx軟件包,且定義配置文件及服務啟動設置
package {"nginx":
    ensure => latest,
} ->
file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => "nginx",
    group => "nginx",
    notify => Service["nginx"],
}
service {"nginx":
    ensure => running,      #定義服務運行狀態
    enable => true, #定義是否開機自啟
    hasrestart => true, #nginx支持restart參數
    hasstatus => true,
    path => "/usr/lib/systemd/system",  #服務腳本搜索路徑
    restart => "systemctl reload nginx.service",    #定義restart的方式
}

三種特殊屬性之metaparameters

定義依賴關系
  • 被依賴的資源中使用before
  • 依賴其它的資源中使用require
  • 定義鏈式依賴->
定義通知關系
  • 被依賴的資源中使用notify
  • 監聽其它資源使用notify
  • 定義鏈式通知使用->
資源引用
  • Type["tiele"] : type首字母一定要大寫,如User["zhenping"]
12、定義資源的依賴關系

group {"linux":
    gid => 2001,
    ensure => present,
    before => User["linux"],
}

user {"linux":
    ensure => present,
    uid => 2001,
    gid => 2001,
    shell => "/bin/bash",
    home => "/home/linux",
    system => false,
    password => "zhenping.com”,
    salt => "zhenping",
    require => Group["linux"],
}


13、定義通知關系和依賴關系
package {"nginx":
    ensure => latest,
    allow_virtual => false,
    before => File["/etc/nginx/nginx.conf"],
}

file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => nginx,
    group => nginx,
    require => Package["nginx"],
    notify => Service["nginx"],
    ensure => file,
}
service {"nginx":
    ensure => running,
    enable => true,
    hasrestart => true,
    hasstatus => true,
    restart => "systemctl reload nginx",
    path => "/usr/lib/systemd/system",
    require => [Package["nginx"],File["/etc/nginx/nginx.conf"]],
    subscribe => File["/etc/nginx/nginx.conf"],
}

14、定義鏈式依賴關系:
package {"nginx":
    ensure => latest,
    allow_virtual => false,
    before => File["/etc/nginx/nginx.conf"],
} ->

file {"/etc/nginx/nginx.conf":
    source => "/tmp/nginx.conf",
    owner => nginx,
    group => nginx,
    ensure => file,
} ->
service {"nginx":
    ensure => running,
    enable => true,
    hasrestart => true,
    hasstatus => true,
    restart => "systemctl reload nginx",
    path => "/usr/lib/systemd/system",
}


示例二、
$webserver = $operatingsystem ? {
    /^(?i-mx:ubuntu|debian)/ => "apache2",
    /^(?i-mx:centos|redhat)/ => "httpd",
}

package {$webserver:
    ensure => latest,
    allow_virtual => false,
}
file {"/etc/httpd/conf/httpd.conf":
    source => "/tmp/httpd.conf",
    ensure => file,
}
service {$webserver:
    ensure => running,
    enable => true,
    restart => "systemctl restart httpd",
    path => "/usr/lib/systemd/system",
    subscribe => File["/etc/httpd/conf/httpd.conf"],
}

puppet變量及作用域

變量

puppet變量名稱必須以$開頭,賦值操作符為"=",任何非正則表達式類型的數據均可賦值變量,puppet的每個變量都有兩個名字,簡短名稱和長格式完全限定名稱

作用域

定義代碼的生效范圍,以實現代碼單隔離

  • 僅能隔離: 變量,資源的默認屬性
  • 不能隔離: 資源的名稱,及引用
每個變量兩種引用路徑
  • 相對路徑 :$name
  • 絕對路徑 :$::scope::scope:variable
變量的賦值符號
  • =
  • +=
變量中的種類
  • 自定義變量
  • facter變量 : 可直接引用,可以使用facter -p命令查看
  • 內置變量
    • 客戶端內置
      • $clientcert
      • $clientversion
    • 服務端內置
      • $servername
      • $serverip
      • $serverversion
      • $module_name
變量的使用示例
$webserver=nginx
package {$webserver:
    ensure => latest,
}

puppet支持的數據類型

  • 字符型

可以不用引用,支持單引號(強引用,不做變量替換),雙引號(弱引用 )

  • 布爾型

其值為true,false

  • undef

未聲明的變量,直接定義使用的

  • 數值型

整數和浮點數

  • 數組

元素可為任意可用數據類型,包括數據和hash,索引從0開始,還可以使用負數,表示方式為`[item1,item2,...]

  • hash

鍵為字符串,而值可以是任意數據類型,表示方式為{key => value,key => value,...}

  • 正則表達式

非標準數據類型,不能賦值給變量,其語法格式表示如下:

(?<ENABLE-OPTION>:<SUBPATTERN>)
(?-<ENABLE-OPTION>:<SUBPATTERN>)

OPTIONS
    i : 忽略字符大小寫
    m : 把 . 當換行符
    x : 忽略模式中的空白和注釋

puppet表達式

  • 比較操作符
    • ==
    • !=
    • <
    • <=
    • >
    • >=
    • !~
    • =~
    • in
  • 邏輯操作符
    • and
    • or
    • !
  • 算術操作符
    • +
    • -
    • *
    • /
    • >> (左移位)
    • << (右移位)

puppet條件判斷語句

if判斷語句

使用格式:

單分支:
if CONDITION {
    ....
} 

雙分支:
if CONDITION {
    ....
} else {
    ....
}

多分支:
if CONDITION {
    ....
} elsif CONDITION {
    ....
} else {
    ....
}

配置示例
if $operatingsystem =~ /^(?i-mx:(redhat|centos))/ {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }

    service {"nginx":
        ensure => running,
        enable => true,
        hasrestart => true,
        hasstatus => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
    }
}


if $processorcount >1 {
    notice (“SMP Host.”)
} else {
    notice (“pool Guy.”)
}

if $operatingsystem =~ /^(?i-mx:(redhat|centos|fedora))/ {
    notice("welcom to $1 distribution linux.")
}

注意:此處的$1表示后向引用 ,引用括號中匹配到的內容

case判斷語句

語句格式:
case CONTROL_EXPRESSION {
    case1, case2: { statement }
    case3, case4: { statement }
    default:      { statement }

}

CONTROL_EXPRESSION可以是以下格式:
1、表達式
2、變量
3、函數(有返回值)

case可以是:
1、字符串
2、變量
3、正則表達式
4、函數(有返回值)
5、default

selector語句

語句格式:

CONTROL_VARIABLE ? {
    case1 => value1
    case2 => value2
    ...
}

注意:selector不能用于一個已經嵌套于selector的case中,也不能用于一個已經嵌套于case的case語句中

類似于case,但分支的作用不在于執行代碼片段,而是返回一個直接值

配置示例
$webserver = $operatingsystem ? {
    /^(?i-mx:ubuntu|debian)/ => "apache2",
    /^(?i-mx:centos|redhat)/ => "httpd",
}

puppet類(class)

用于公共目的的一組資源,是命名的代碼塊,創建后可在puppet全局進行調用

類的特性

  • 類可以被繼承
  • 類的名稱只能包含小寫字母、數字、下劃線且必須以小寫字母開頭
  • 每個類都會引入一個新的變量scope,需要訪問類的變量時,都得使用完全限定名稱
  • 在本地scope可以重新為top scope中的變量賦予一個新值

類的聲明方式

定義好的類需要聲明后才會被執行

類的聲明方式一
  • include class_name,class_name,...
示例:
class webserver {
    $webserver = $operatingsystem ? {
        /^(?i-mx:ubuntu|debian)/ => "apache2",
        /^(?i-mx:centos|redhat)/ => "httpd",
    }

    package {$webserver:
        ensure => latest,
        allow_virtual => false,
    }
    file {"/etc/httpd/conf/httpd.conf":
        source => "/tmp/httpd.conf",
        ensure => file,
    }
    service {$webserver:
        ensure => running,
        enable => true,
        restart => "systemctl restart httpd.service",
        path => "/usr/lib/systemd/system/",
        subscribe => File["/etc/httpd/conf/httpd.conf"],
    }

}
include webserver  #直接調用webserver類
類的聲明方式二
  • class {'base::linux'} : 此聲明為一個子類,或者如下申明方式(給類傳遞參數):
class {"class_name":
    variable => value,
}
示例
class httpd($webserver='nginx') {   #此處的變量定義為默認值,當未在聲明中設定變量值,就使用默認的變量值

    package {$webserver:
        ensure => latest,
        allow_virtual => false,
    }
    file {"/etc/httpd/conf/httpd.conf":
        source => "/tmp/httpd.conf",
        ensure => file,
    }
    service {$webserver:
        ensure => running,
        enable => true,
        subscribe => File["/etc/httpd/conf/httpd.conf"],
    }

}
class {"httpd":
    webserver => "httpd", #在類聲明的時候,給類傳遞一個參數
}

類的繼承

  • 聲明子類時,其基類會被自動首先聲明
  • 基類成為子類的父作用域,基類中的變量和屬性默認值會被子類復制一份
  • 子類可以覆蓋父類中同一資源的相同屬性的值

通常將公共功能定義為基類,需要增加的功能定義為子類,其繼承一個已有的類,并實現覆蓋資源屬性,或向資源屬性追加額外值

  • 使用如下定義符:
    • => : 定義新的值
    • +> : 添加值
    class apache {
      service {'apache':
        require => Package['httpd'],
      }
    }

    class apache::ssl inherits apache {
      Service['apache'] {
        require +> [ File['httpd.pem'], File['httpd.conf'] ],
      }
    }
繼承類的定義方式
class base_class {
    ....puppet code....
}

class base_class::class_name inherits base_class {
    ....puppet code....
}
使用示例
class nginx {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }
}

class nginx::webserver inherits nginx {
    file {"/etc/nginx/nginx.conf":
        source => "/tmp/nginx.conf",
        owner => nginx,
        group => nginx,
        mode => 0644,
        ensure => file,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}

class nginx::proxy inherits nginx {
    file {"/etc/nginx/nginx.conf":
        source => "/tmp/proxy/nginx.conf",
        owner => nginx,
        group => nginx,
        ensure => file,
        mode => 0644,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}

include nginx::webserver

puppet模板

基于ERB(擴展ruby語言)模板語言,在靜態文件中使用變量等編程元素生成適用于多種不同環境的文本文件(配置文件),主要用于實現在文本文件中嵌入ruby代碼,原來的文件信息不會被改變,但ruby代碼會被執行,執行結果將直接替換原來代碼

模板代碼的添加方式
  • <%= ruby expression %> : 替換為表達式的值
  • <% ruby expression %> : 僅執行代碼,而不替換
  • <%# comment %> : 文本注釋
  • <%% :做轉義,輸出為<%
  • %%> :做轉義,輸出為%>
  • <%- rubycode %> : 忽略空白字符
  • <% rubycode -%> : 忽略空白行
在模板中可以使用變量,包括puppet的任意可用變量,但變量名需以@字符開頭
模板中的條件判斷
  • 單分支判斷語句

    <% if CONDITION -%>
        some text
    <% end %>
    
  • 多分支判斷語句

    <% if CONDITION -%>
        some text
    <% else %>
        some other text
    <% end %>
    
模板中的迭代實現

模板的中的迭代是為了實現某配置文件中批量添加生成配置信息,如配置nginx中的Location時,當有多個Location段需要添加,可以將location賦值給一個數組,利用迭代將值引用到配置文件中。

  • 定義格式
<% @ArrayName.echo do | Variable_name | -%>
    some text with <%= Variable_name %>
<% end %>
模板文件的定義示例:
1、配置模板配置文件
vim /tmp/nginx.conf
worker_processes <%= @processorcount %>;  #此處變量為facter中的變量,可以直接引用

2、puppet腳本配置語言
vim nginx.pp
class nginx {
    package {"nginx":
        ensure => latest,
        allow_virtual => false,
    }
}

class nginx::webserver inherits nginx {
    file {"/etc/nginx/nginx.conf":
  #如果定義好的配置文件,使用了ERB的配置語法,此處文件復制不能使用source,而是需要使用content參數,利用template函數生成對應的配置文件,此為固定格式用法(將使用template函數生成文本內容,再導入至/etc/nginx/nginx.conf文件中)
        content => template("/tmp/nginx.conf"), 
        owner => nginx,
        group => nginx,
        mode => 0644,
        ensure => file,
        require => Package["nginx"],
    }

    service {"nginx":
        ensure => running,
        enable => true,
        restart => "systemctl reload nginx",
        path => "/usr/lib/systemd/system/",
        hasstatus => true,
        hasrestart => false,
        subscribe => File["/etc/nginx/nginx.conf"],
    }
}
include nginx::webserver

puppet模塊

在puppet中,模塊本身用一個目錄來表示,其需要存放于puppet的modulepath參數所定義的目錄中,如/etc/puppet/modules。在manifests/init.pp需定義一個與模塊名相同的類名,以完成自包含、自裝載、自識別

模塊目錄組成格式

  • /etc/puppet/modules/ : 模塊存放的默認路徑,在此目錄下建立相應的模塊目錄即可
    • module_name/ : 模塊名稱
      • manifests/ : 資源清單目錄
        • init.pp : 默認的資源定義文件,此文件必須存在
      • files : 靜態配置文件存放路徑
      • templates : ERB模塊配置文件存放路徑,其文件結束后綴為.erb
      • lib : 插件目錄
      • tests:當前模塊的使用幫助文件及示例文件
      • spec : 類似于tests目錄,存儲lib目錄下定義的插件的使用幫助和示例文件
    ```
    示例:
    [root@Centos7 manifests]# tree /etc/puppet/modules/
    /etc/puppet/modules/
    `-- nginx
    |-- files
    |   `-- nginx.conf
    |-- lib
    |-- manifests
    |   `-- init.pp
    |-- spec
    |-- templates
    |   `-- nginx.conf.erb
    `-- tests
    
    [root@Centos7 manifests]# cat init.pp
    class nginx {
        package {"nginx":
            ensure => latest,
            allow_virtual => false,
        }
    }

    class nginx::webserver inherits nginx {
        file {"/etc/nginx/nginx.conf":
            content => template("nginx/nginx.conf.erb"),  #模板文件定義的路徑為“模塊名/erb文件”
            owner => nginx,
            group => nginx,
            mode => 0644,
            ensure => file,
            require => Package["nginx"],
        }

        service {"nginx":
            ensure => running,
            enable => true,
            restart => "systemctl reload nginx",
            path => "/usr/lib/systemd/system/",
            hasstatus => true,
            hasrestart => false,
            subscribe => File["/etc/nginx/nginx.conf"],
        }
    }

    class nginx::proxy inherits nginx {
        file {"/etc/nginx/nginx.conf":
            source => "puppet:///modules/nginx/nginx.conf", #配置文件路徑路徑為"協議:///modules/模塊名/靜態配置文件"
            owner => nginx,
            group => nginx,
            ensure => file,
            mode => 0644,
            require => Package["nginx"],
        }

        service {"nginx":
            ensure => running,
            enable => true,
            restart => "systemctl reload nginx",
            path => "/usr/lib/systemd/system",
            hasstatus => true,
            hasrestart => false,
            subscribe => File["/etc/nginx/nginx.conf"],
        }
    }
    ```

模塊管理工具

puppet module 命令
  • puppet help module :獲取puppet module的幫助信息
  • Usage : puppet module <action> [--environment production ] [--modulepath $basemodulepath ]
    • <action>
      • install : 到puppet forge中心安裝模塊
      • list : 查看已安裝的模塊
      • search : 到forge中心搜索模塊
      • uninsall : 卸載模塊
      • upgrade : 更新模塊

puppet Master/Agent模式

master/agent工作原理

master/agent強依賴于DNS服務(證書簽署是對FQDN做證書頒發的),由master端定義好功能模塊,再到/etc/puppet/manifests/定義site.pp文件,定義站點所需要的資源。master端通過自建CA并簽發證書給各站點,使用證書驗證客戶端的身份,當站點發出請求時Master端將查找site.pp文件中定義的資源,編譯成catalog,發送給客戶端。 agent默認每隔30分鐘向Master發送node_name和facts,并請求catalog,在本地執行catalog代碼。master與agent二者之間基于https協議通信,其遠程過程調用方式為xmlrpc機制。

master/agent程序安裝
  • master端
    • yum install puppet puppet-server facter (如果master端不需要對自己管理時,可以不需要安裝puppet)
  • agent端
    • yum install puppet facter
master/agent監聽端口
  • master : 8140/tcp
  • agent : 8139/tcp
/etc/puppet/puppet.conf配置文件
  • [main] : 應用于server端和agent端,都會生效
  • [agent] : 應用于agent端生效
顯示或配置參數
  • puppet config print : 打印puppet的配置選項(對master/agent都生效)
  • puppet config set key=value : 設置puppet的配置選項(對mster/agent都生效)
注意:此些值的修改是對/etc/puppet/puppet.conf文件生效
手動生成配置文件
  • master端
        puppet master —genconfig > /etc/puppet_default.conf 
        mv /etc/puppet/puppet.conf /etc/puppet/puppet.conf.bak
        mv /etc/puppet_default.conf /etc/puppet.conf
  • agent端
puppet agent —genconfig >> /etc/puppet.conf (可以追加,在agent端使用覆蓋)
  • 生成配置文件的注意事項
1、生成新的配置之前不能刪除或移動原有的puppet.conf
2、生成的配置中,有的參數已經被廢棄,與現有puppet版本可能不兼容
3、有的參數的默認值與現在的版本所支持值可能不相兼容
4、配置信息可以不使用此工具生成,可以直接在配置文件中添加
Master/agent服務管理
  • master端
    • systemctl start puppet-server.service
  • agent端
    • systemctl start puppet.service
(puppet cert命令)證書管理工具
  • Usage: puppet cert <action> [-h | --help]
    • action
      • clean node_name : 清除node_name節點的證書
      • list : 查看未簽署的證書請求
      • list -all : 查看所有證書
      • sign "node_name" : 對node_name簽署證書
      • sign -all : 簽署所有證書請求
      • verify : 檢驗
site.pp定義站點調用的模塊
  • 以主機名直接給出其相關定義
node 'node_name' {
    ....puppet code....
    include nginx::webserver
}
  • 把功能相近的主機名給出其相關定義
node /^web\d+\.magedu\.com/ {
    ....puppet code...
    include nginx::webserver
}
  • 節點的繼承
node "basenode" {
    include ntp
}

node "web.zhenping.com" inherits basenode {
    include nginx::proxy
}

對節點配置分段管理
/etc/puppet/manifests/
    vim site.pp
    import "webserver/*.pp"
    
    webservers/
        unicom.pp
        telecom.pp
    cacheservers/
    appservers/
master/agent配置示例
1、配置master端
# puppet master --no-daemonize -v #首次以前臺模式啟動,確認無誤再運行為后端
# systemctl start puppetserver.service
# systemctl enable puppetserver.service
# ss -tnlp : 8140/tcp

2、定義站點配置文件
# cd /etc/puppet/manifests/
# vim site.pp  #必須先為站點定義好站點文件,不然agent端啟動時會報錯
node /^centos7.pc\d+/ {
    include nginx::webserver
}

3、配置agent端(發送證書簽署請求給Master)
# puppet agent --server=master_hostname --no-daemonize --noop --test -v #建議首次啟動時以前臺模式運行,確認OK后,再將運行為后端


4、在master端為客戶端簽署證書
# puppet cert list #首先查看未簽署的證書列表
# puppet cert sign node_name 
    或者
# puppet cert sing -all

5、以守護進程方式啟動agent
# systemctl start puppet

####必要是清除客戶端請求
#puppet cert list -all : 查看已經簽署的客戶端證書
# puppet cert clean node_name : 清除一個Node的簽署證書

# rm -rf /var/lib/puppet/ssl : 移除agent端的ssl證書

master/agent的多環境支持
puppet的多環境支持:
    master端環境配置段:為不同的主機配置不同的配置
        [master]
        enviroment = production, testing, development   #聲明master支持那些環境配置

        [production](生產環境)
        manifest = /etc/puppet/environments/production/manifests/site.pp
        modulepath = /etc/puppet/enviroments/production/modules/
        fileserverconfig = /etc/puppet/fileserver.conf
        
        [testing]
        manifest = /etc/puppet/environments/testing/manifests/site.pp
        modulepath = /etc/puppet/enviroments/testing/modules/
        fileserverconfig = /etc/puppet/fileserver.conf

        [development]
        manifest = /etc/puppet/environments/development/manifests/site.pp
        modulepath = /etc/puppet/enviroments/development/modules/
        fileserverconfig = /etc/puppet/fileserver.conf  
    
    agent端配置文件:
        [agent]
        enviroment = testing
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Puppet理論定義: Puppet 是一個跨平臺的集中化配置管理系統,它使用自有的描述語言,可管理配置文件、用戶...
    屬于你的世界閱讀 989評論 0 2
  • 1.puppet 是什么 puppet是一個開源的軟件自動化配置和部署工具,很多大型IT公司均在使用puppet對...
    milo_e1ce閱讀 4,934評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • Puppet部署與應用 前言:到目前為止,我們已經搭建了很多的服務器,每一臺服務器都需要執行很多的命令,給我的感覺...
    李偉銘MIng閱讀 2,806評論 0 3
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,946評論 6 342