1. 程式人生 > >DevOps 系列工具之 Puppet 資源簡介

DevOps 系列工具之 Puppet 資源簡介

DevOps Puppet

資源清單

Puppet 可以管理的所有項目被稱為 Puppet 資源。軟件包、配置文件和服務都是 Puppet 所能管理的資源。資源指令組合為 Puppet 清單(Manifest)文件。
資源是 Puppet 配置管理腳本(清單)的組成部分。資源又以下一些元素組成:
類型:將要配置的資源類型(軟件包、服務、文件等)。資源類型有許多種。
標題:配置管理腳本引用資源的方式
屬性:為資源指定的位置。不同資源類型有不同的屬性
提供者:與配置管理腳本引用資源方式相關的工具。通常不在資源陳述中說明。Puppet 根據資源類型自動使用正確的提供者(例如:在基於 CentOS 的操作系統上安裝軟件包時使用 yum)

資源調用順序

清單是資源的集合,它們是管理員用於管理環境中服務器的配置腳本。before、require、notify和subscribe元參數可以定義清單中資源之間的關系
require 確保指定資源在自身資源部署之前存在
subscribe 和require 類似,但有一個額外的功能:Puppet 將監控目標資源的任何更改,並執行相應的操作作為響應。對於服務資源,在檢查到配置文件中的更改後重新啟動服務

    package { ‘apache’:
    name => ‘httpd’,
    ensure => installed,
    }

    file { ‘apacheconf’:
        name => ‘/etc/httpd/conf/httpd.conf’,
        ensure => file,
        mode => 600,
        source => ‘/etc/puppet/files/httpd.conf’,
        require => Package[‘apache’],
    }

    service { ‘apache’:
    name = >’httpd’,
    ensure => running,
    enable => true,
    subscribe => File[‘apacheconf’],
}

在第一次聲明資源時,類型名是小寫的,以後在清單中引用時類型名的第一個字母為大寫。

before 和 notify 分別為 require 和 subscribe 相反。如果在清單中使用 before 和 notify ,則寫法如下:

    package {‘apache’:
        name => ‘httpd’,
        ensure => installed,
        before => File[‘apacheconf’],
    }

    file {‘apacheconf’:
        name => ‘/etc/httpd/conf/httpd.conf’,
        ensure => file,
        mode => 600,
        source => ‘/etc/puppet/files/httpd.conf’,
        notify => Service[‘apache’],
    }

    service {‘apache’:
        name => ‘httpd’,
        ensure => running,
        enable => true,
    }

變量的使用

在清單文件中,所有的變量清單都以 $ 作為前綴,包括自動生成的 fact 變量。變量不需要指定數據類型。
在代碼中使用包含字符串值的變量時,必須使用雙引號而不是單引號。

    $webserver=‘httpd’
    file {‘apacheconf’:
        name => “/etc/$webserver/conf/$webserver.conf”,
        ensure => file,
        mode => 600,
        source => “/etc/puppet/file/$webserver.conf”,
        require => Package[‘apache’],
    }

條件語句

Puppet 支持的 if 和 case 條件表達式

    if $operatingsystem == ‘centos’ {
        $webserver = ‘httpd’
        $confpath = “/etc/$webserver/conf/$webserver.conf”
    }

    elsif $operatingsystem = ‘ubuntu’ {
        $webserver = ‘apache2’
        $confpath = “/etc/$webserver/$webserver.conf”
    }

    else {
        fail (“Unsupported OS”)
    }

case 條件語句

    case $operatingsystem {
        centos: {
            $webserver = ‘httpd’
            $confpath = “/etc/$webserver/conf/$webserver.conf”
        }
        ubuntu: {
            $webserver = ‘apache2’
            $confpath = “/etc/$webserver/$webserver.conf”
        }
        default: {
            fail(“Unsupported OS”)
        }
    }

    package { ‘apache’:
        name => $webserver,
        ensure => installed,
    }
    file {‘apacheconf’:
        name => $confpath,
        ensure => file,
        mode => 600,
        source => “/etc/puppet/files/$webserver.conf”,
        require => Package[‘package’],
    }

    service {‘apache’:
        name => $webserver,
        ensure => running,
        enable => true,
        subscribe => File[‘apacheconf’],
    }

為了促進高效的代碼重用,Puppet Labs 設計了 Puppet 類功能,其概念類似於面向對象編程語言中的類。
class apache {
….
}

只需在原來的代碼上修改3行就可以實現一個類,

Puppet Forge 在線共享模塊存儲庫,http://forge.puppetlabs.com
模塊需要一種特殊的樹結構,Puppet 清單才能正確訪問它們。Puppet 生成模塊目錄文件夾的命令:
puppet module generate username-modulename
用戶名+模塊名 格式命名,需要修改為模塊名,
子目錄: files templates

manifests 是重要的文件夾,包含與模塊相關的所有Puppet 代碼。標準模塊的慣例是有一個定義類的特殊清單文件 init.pp。
files 在清單執行期間分發的所有文件(如 apache 配置文件)必須放置在這個目錄下
lib 如果編寫了任何自定義fact 變量或者類型,將代碼放在這個目錄下
spec 這個文件夾包含用於lib文件夾中自定義代碼的測試
templates 如果想要部署根據運行時信息更改的軟件包配置或者內容文件,將它們和一些嵌入ruby erb 代碼一起放在這個目錄
tests 放置模塊使用方法的示例
metadata.json 包含semver 格式的模塊版本名稱,以及Puppet module generate 命令提供的其余數據

把上面的代碼寫入:
/etc/puppetlabs/puppet/modules/apache/manifests/init.pp
把配置文件放入:
/etc/puppetlabs/puppet/modules/apache/files 目錄

source => “puppet:///modules/apache/$webserver.conf”

在 master agent 模式中,讓agent端應用新配置,可以手動觸發,也可以等到下一次自動化 Puppet 代理執行。
手動觸發:
在 Agent 端執行
puppet agent -td
puppet agent 命令告訴代理執行 Puppet 主服務器為它保留的指令
puppet apply 指令用於本地 puppet 清單的臨時執行

DevOps 系列工具之 Puppet 資源簡介