一步一步學會puppet(一)--工作原理與資源

簡介

puppet是一種Linux、Unix、windows平臺的集中配置管理系統;

使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等,puppet把這些系統實體稱之爲資源;

puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係


puppet的基礎架構

wKioL1N05HCxRF9_AAKs4elQqbI030.jpg

puppet是集中式的配置管理工具,通過自有配置語言對節點進行目標狀態定義,並能夠基於網絡實現目標狀態的維護;


puppet的工作模型

wKiom1N05NHh783aAAaOyl2zD-o470.jpg

puppet通過聲明性、基於模塊的方法進行IT自動化管理;


puppet的基本工作流程

wKiom1N05SvzNLDUAAIlUMdNfsg897.jpg


重要概念

資源:定義目標狀態的核心組件;

核心資源包括:notify、package、group、user、file、exec、cron、service等;

模塊:以資源爲核心,是類的集合,如mod1,mod2

節點:以被管理主機爲爲核心,如node1,node2

puppet利用模塊+節點的方式,實現目標狀態的定義

manifest:清單,用於定義並保存資源,是一個資源組織工具;

facter:獲取各被管理節點資源使用情況的方式;


單機模式下的安裝使用

yum -y install ruby # 安裝ruby環境
yum -y localinstall facter-1.7.3-1.el6.x86_64.rpm # puppet 2.7版本依賴facter 2.0以下的版本
yum -y localinstall puppet-2.7.25-1.el6.noarch.rpm
# 列出資源類型
puppet describe -l
# 顯示資源notify的使用幫助
puppet describe notify


實例解析

核心資源1--notify

# vi /tmp/test.pp
notify {'notice':
    message => 'welcome to puppet world', # notify的輸出的消息
}
# puppet apply test.pp
# puppet apply test.pp -v # 顯示詳細信息,包括配置應用版本號
# puppet apply test.pp -v -d # 開啓debug功能

核心資源2--package

# vi nginx.pp
package {'nginx':
    ensure => present, # 程序包已安裝狀態
    name => nginx,    # 安裝的程序包名
}
# puppet apply nginx.pp -v

核心資源3--file

# vi file.pp
file {'abc.txt':
    ensure => present, # 文件存在
    content => 'hello puppet', # 文件內容
    path => "/tmp/abc2.txt", # 生成的文件
}
file {'fstab.symbolic':
    ensure => present,
    target => "/etc/fstab",    # 鏈接的源文件
    path => "/tmp/fstab.symbolic", # 生成的文件
    links => follow, # 表示爲軟鏈接
}

核心資源4--exec

# vi command.pp
exec {'echo command':
    command => 'mktemp /tmp/tmp.XXXXX', # 執行的命令
    path => '/bin:/sbin:/usr/bin:/usr/sbin', # 命令搜索的路徑
}

核心資源5--user/group

# vi group_user.pp
group {'testgrp':
    ensure => present,    # 保證用戶組存在
    gid => 1001, # 用戶組GID
} ->
user {'testuser':
    ensure => present,    # 保證用戶存在
    gid => 1001,
    uid => 1001,
    home => '/home/test', # 用戶家目錄
    shell => '/bin/tcsh', # 用戶的shell
    password => '$1$7990650b$sAvnSF1/5e4aIWdBMrH7U/', # 用戶密碼
    managehome => true, # 指定創建用戶家目錄
}

核心資源6--cron

# vi cron.pp
cron {'ntpdate':
    ensure => present,
    command => '/usr/sbin/ntpdate 172.16.0.1 &> /dev/null', #執行的命令
    minute => '*/5', # 指定cron運行的時間間隔,其它時間段默認都爲*
}

核心資源7--資源次序require/before

# vi nginx.pp
package {'nginx':
    ensure => present,
    name => nginx,
     # before => Service['nginx'], # 也可在此指定程序包安裝的後續操作
}
service {'nginx':
    enable => true, # 保證服務開機啓動
    ensure => true,
    name => nginx,
    require => Package['nginx'], # 指定服務安裝的前提條件
}

核心資源8--資源次序notify/subsribe

# vi order.pp
file {'/tmp/test4.txt':
    ensure => file,
    content => "hello puppet",
     # notify => Exec['monitor'], # 也可在此指定文件創建後,主動通知下一步的命令執行
}
exec {'monitor':
    command => 'echo "/tmp/test4.txt changed." >> /tmp/monitor.txt',
    refreshonly => true, # 指定只在文件內容發生改變時,才重新執行此處命令
    subscribe => File['/tmp/test4.txt'], # 追蹤上一步創建的文件資源改變情況
    path => '/bin:/sbin:/usr/bin:/usr/sbin',
}

核心資源9--資源次序 ->(次序鏈)/~>(通知鏈)

# vi order2.pp
file {'/tmp/test4.txt':
    ensure => file,
    content => "hello puppet",
} ~>     # 在此爲通知鏈,作用類似notify
exec {'monitor':
    command => 'echo "/tmp/test4.txt changed." >> /tmp/monitor.txt',
    refreshonly => true,
    path => '/bin:/sbin:/usr/bin:/usr/sbin',
}

變量定義及引用

# vi var.pp
$pkgname='haproxy'
package {$pkgname:    # 引用用戶自定義變量
    ensure => present,
}
file {'/tmp/nginx.conf':
    ensure => file,
    content => "worker_processes : $processorcount", # 引用facters變量
}

if語句的使用

# vi if.pp
if $operatingsystem =~ /^(?i-mx:(centos|redhat|fedora))/ { # 正則表達式作爲if語句的判斷條件
    notice("Welome to $1 linux world.")
}
if $operatingsystem == 'CentOS' { # 等值比較運算作爲if語句的判斷條件
    notify {'centos': message => "Welcome to CentOS linux world.",}
} elsif $operatingsystem == 'Fedora' {
    notify {'fedora': message => "Welcome to Fedora linux world.",}
} else {
    notify {'unkown': message => "Unkown Operating System",}
}

case語句的使用

# vi case.pp
case $operatingsystem { # case語句進行多值比較,並執行匹配的響應代碼塊
    /^(?i-mx:centos|fedora|redhat)/ : {package{"httpd":ensure => present,provider => yum,}}
    /^(?i-mx:ubuntu|debian)/ :{package{"apache2":ensure => present,provider => apt,}}
    default: {notify {"notice":message => "unknown system",}}
}

seletor語句的使用,語法與case類似

# vi selector.pp
$webserver = $operatingsystem ? { # seletor類似三目運算符,直接返回匹配項的value值
    /^(?i-mx:centos|fedora|redhat)/ => 'httpd',
    /^(?i-mx:ubuntu|debian)/ => 'apache2',
}
$webprovider = $operatingsystem ? {
    /^(?i-mx:centos|fedora|redhat)/ => 'yum',
    /^(?i-mx:ubuntu|debian)/ => 'apt',
}
package {$webserver:
    ensure => present,
    provider => $webprovider,
}

puppet的類使用

# vi class.pp
class nginx {
    package {'nginx': 
    ensure => present,
    }
service {'nginx':
    ensure => true,
    require => Package['nginx'],
    }
}
include nginx # 聲明類
# class {nginx:} # 聲明類的另一種方式

puppet的帶參數的類使用

# vi class2.pp
$webserver = $operatingsystem ? {
    /^(?i-mx:centos|fedora|redhat)/ => 'httpd',
    /^(?i-mx:ubuntu|debian)/ => 'apache2',
}
class httpd ($pkgname='apache2') {
    package {"$pkgname":
    ensure => present,
    }
    service {"$pkgname":
        ensure => true,
        require => Package["$pkgname"],
    }
}
class {'httpd':     # 聲明類,並將pkgname變量的值帶入
    pkgname => $webserver,
}

puppet模塊的使用--實例1

# vi class3.pp
class nginx {
    package {'nginx':
    ensure => present,
    }
}
class nginx::rproxy inherits nginx { # 定義nginx的子類rproxy,繼承nginx類的相關屬性
    file {'/etc/nginx/nginx.conf':
        ensure => file,
        source => "/tmp/nginx/nginx.reverse_proxy.conf",
        force => true,
        notify => Service['nginx'],
    } ->
    service {'nginx':
        ensure => true,
    }
}
class nginx::web inherits nginx {    # 定義nginx的子類web,繼承nginx類的相關屬性
    file {'/etc/nginx/nginx.conf':
        ensure => file,
        source => "/tmp/nginx/nginx.web.conf",
        notify => Service['nginx'],
    } ->
    service {'nginx':
        ensure => true,
    }
}
# vi node.pp
import "/tmp/class3.pp"
include nginx::web    # 聲明子類
# puppet applay -v node.pp

puppet模塊的使用--構建模塊nginx

cd /etc/puppet/modules
mkdir -pv nginx/{files,lib,manifests,templates} # 創建模塊nginx所需的目錄結構
./nginx/files:    # 編輯類中所需的靜態文件
total 8
-rw-r--r-- 1 root root 1062 May 15 18:15 nginx.reverse_proxy.conf
-rw-r--r-- 1 root root 1059 May 15 18:15 nginx.web.conf
./nginx/manifests:    # 定義模塊所需的清單文件,init.pp文件是必須的
total 12
-rw-r--r-- 1 root root 131 May 15 18:33 init.pp
-rw-r--r-- 1 root root 246 May 15 18:15 rproxy.pp
-rw-r--r-- 1 root root 213 May 15 18:34 web.pp
# vi init.pp    # 定義nginx主類
class nginx {
    package {'nginx':
        ensure => present,
    }
}
# vi rproxy.pp    # 定義nginx的子類之一
class nginx::rproxy inherits nginx {
    file {'/etc/nginx/nginx.conf':
        ensure => file,
        source => 'puppet:///modules/nginx/nginx.reverse_proxy.conf',
        force => true,
        notify => Service['nginx'],
    } ->
    service {'nginx':
        ensure => true,
    }
}
# vi web.pp    # 定義nginx的子類之一
class nginx::web inherits nginx {
    file {'/etc/nginx/nginx.conf':
        ensure => file,
        source => 'puppet:///modules/nginx/nginx.web.conf',
        notify => Service['nginx'],
    }
    service {'nginx':
        ensure => true,
    }
}
puppet apply -v -e 'include nginx' # 調用模塊,執行nginx服務安裝配置

總結

通過以上實例的理解和學習,可以對puppet中主要的資源類型和用法加深了理解,最後2個實例已經開始嘗試已模塊化的結構去運行puppet了,下一篇將會介紹puppet更多用法,敬請期待!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章