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 資源簡介