puppet 基礎應用詳解

運維自動化
html


   運維自動化是指將IT運維中平常的、大量的重複性工做自動化,把過去的手工執行轉換爲自動化操做,自動化是運維工做的生化,運維自動化不單純是一個維護過程,更是一個管理的提高過程,是IT運維的最高層次,也是將來的發展趨勢linux


   雖然沒法作到徹底自動化運維,可是咱們應該努力盡可能的大部分的實現自動化運維;  nginx


自動化運維的層次結構web


   一、第一層-------引導層 Bootstrap正則表達式

   二、第二層-------配置層 Configurationshell

   三、第三層-------命令集控制層 Command and Control
apache


   如圖所示:各層及其實現程序編程


wKioL1N3KgrzpQpKAAIrkuSIo0U246.jpg


Puppet簡介ubuntu


    由上圖可知,Puppet使用在自動化運維的第二層,也就是Configuration配置層。vim

    Puppet是一個IT基礎設施自動化管理工具,它可以幫助管理員管理基礎設施的整個生命週期:供應(provisioning)、配置(configration)、聯動(orchestration)及報告(reporting)

經過使用puppet,能夠實現自動化重複任務、快速部署關鍵性應用以及在本地或者雲端完成主動管理變動和快速擴展架構規模等。

    Puppet基於ruby語言開發,它對於管理員來說是抽象的,只依賴於ruby與facter。其自己可以管理多達40多種資源,例如:file、user、group、package、service、host、cron、exec、yum repo等,適合整個生命週期;

    總結:Puppet 就是集中式的配置管理工具,經過自有配置語言對節點進行目標狀態的定義,並可以基於網絡實現目標狀態的維護。


Mater/agent架構及工做流程


     Puppet是基於master/agent的架構

             master:中心配置庫

             agent : 讀取並應用配置的節點


     工做流程


wKioL1N3LXCgYepbAAEOKwFJBcw799.jpg


如上圖:
agent節點發送本身的事實或者其狀態的數據給master服務器;
master服務器根據agent的目標狀態編譯成Catalog僞代碼,除此之外還將如何在節點上進行配置的相關數據和Catalog一併發送給angent端;
agent端,根據master發送的Catalog和配置數據,先於當前狀態進行比較,而後進行狀態的改變(或者單單進行模擬配置),並將改變結果數據發送給Master;
master端並將報告徹底無障礙的經過開放API,發送給第三方工具;



Puppet術語


一、 manifest(清單)


      puppet的程序文件稱做「manifest(清單)」,以.pp做爲文件名後綴;

      如前所述,puppet語言的核心是「資源定義」,而定義一個資源的核心就在於描述其目標狀態,而nanifest文件就是用來定義resource資源的


      「puppet apply」子命令可以將一個manifest中描述的目標狀態強制實現,所以它一般以manifest文件做爲參數


二、catalog(僞代碼)


      puppet經過manifest同步資源時,不會直接應用manifest文件,而是要通過預先的編譯過程,這是由於manifest文件中可能會包含條件判斷、變量、函數以及其餘的程序邏輯,實際執行中,有可能會基於層次及包含關係存在多個manifest文件,這些文件會被編譯僅同一個稱做「catalog」的文件,編譯完成後的catalog文件僅包含各個資源以及它們同步時的次序;


三、resource (資源)


      若是把OS的全部配置,如用戶帳戶、特定的文件、文件所屬的目錄、運行的服務、程序包以及cron任務等,看做是許多獨立原子單元的集合的化,這些所謂的「單元」就是「資源」;不過這些資源在其大小、複雜程度以及生命週期的跨度上等多個維度上可能會各不相同

      一般來講,類屬於同一種資源的屬性是相近的,如文件都有其屬主和屬組,而用戶賬號則由用戶名、UID、GID等組成;不過即使是同一種資源,其在不一樣OS 上的實現方式卻又可能各不相同,例如在windows上和linux上啓動和中止服務的方式相去甚遠,,所以puppet必須對資源進行某種程度的抽象;

     資源抽象:puppet在如下三個維度來對資源完成抽象

     1)類似的資源被抽象成同一種資源「類型」,如程序包資源、用戶資源及服務資源等;

     2)將資源屬性或狀態的描述與其實現方式玻璃開來,如僅說明安裝一個程序包而不用關心其具體是經過yum、pkgadd、prots或是其餘方式實現;

     3)僅描述資源的目標狀態,也即指望其實現的結果,而不是其具體過程,如「肯定nginx運行起來」而不是具體描述爲「運行nginx命令將其啓動起來」;

    這三個也被稱做puppet的資源抽象層(RAL),RAL由type(類型)和provider(提供者,即不一樣OS上特定實現)組成


四、resource declaration (資源申報)


      在爲puppet定義一個資源時,須要爲其指定所述的類型和資源標題,並同時配置一系列的屬性和對應的值。puppet經過特有的語言來描述和管理資源

      這種語法被成爲「資源申報(resource declaration)」,它是puppet語言的核心組成部分,在定義中,僅描述了資源的目標狀態而沒有提到爲達到目標所須要採起的任何步驟

     type { 'title':

         attribute => value,

      }

     puppet有許多內置的資源類型,而經過安裝插件還能夠繼續新增額外的類型

     能夠經過官網參考頁面http://docs.puppetlabs.com/references/latest.html獲取詳情,也可使用「puppet describe」命令來獲取puppet當前所能支持的類型列表及每種類型的詳細信息;






puppet安裝


     puppet的安裝有三種方式

        一、gem安裝(相似於perl中的cpan)

        二、源包下載 http://yum.puppetlabs.com/el/

https://yum.puppetlabs.com/el/6.5/products/x86_64/

         三、yum安裝,須要配置好epel源


puppet資源介紹



# yum  -y install puppet 使用yum的方式安裝puppet,版本爲2.7

      puppet describe -l  列出全部資源


      其中咱們重點學習notify、package、user、group、file、exec、cron、service


一、package

         puppet支持使用的軟件包管理器:yum,rpm,apt,ports,gem,msi,dpkg,pkg。。。

         package的經常使用參數

            ensure:程序包的目標狀態;

            name  :資源的名稱,即軟件包的名稱

            provider:軟件包管理器

            source  :指定程序包文件路徑

           install_option :安裝選項,最經常使用的是經過IINSTALLDIR來指定安裝目錄          


# rpm -q nginx
package nginx is not installed
# vim nginx.pp
  package {'nginx':
       ensure => present,
 }
# puppet apply nginx.pp
# rpm -q nginx
nginx-1.0.15-5.el6.x86_64



二、service

     經常使用參數

         ensure:服務的目標狀態,true(running)和false(stoppd)

         enbale:是否開機自動啓動,true和false

         name  :服務名稱

         path  :服務腳本路徑

         start :啓動命令

         stop  :關閉命令

         restart:重啓命令

         status :狀態命令


# vim  test.pp
service {'httpd':
        ensure => true,
        enable => true,
        name   => 'httpd',
}
# puppet apply test.pp
notice: /Stage[main]//Service[httpd]/ensure: ensure changed 'stopped' to 'running'
notice: Finished catalog run in 0.74 seconds
# service httpd status
httpd (pid  18326) 正在運行...
# chkconfig --list httpd
0:off   1:off   2:on    3:on    4:on    5:on    6:off


三、user :管理用戶


        經常使用屬性

           ensure:目標狀態 present或absent

           name  :用戶名

           uid   : 用戶ID

           system: 系統用戶

           home  : 指定家目錄

           shell : 默認shell

           gid   : 基本組ID

           password:用戶密碼

           managehome:是否建立家目錄,默認爲false



# vim  test.pp
user {'zxj':
  ensure => present,
  gid    => 1001,
  uid    => 1001,
  home   => '/home/zxj',
  shell  => '/bin/tcsh',
  managehome => true,
  password => 123456,
}
# puppet apply test.pp
# tail /etc/passwd | grep zxj
zxj:x:1001:500::/home/zxj:/bin/tcsh


     ###注意password最好使用openssl passwd -1 -salt `openssl rand -hex 4`生成密碼串


四、 cron

         管理定義週期性任務

         經常使用屬性:

            ensure:目標狀態  present,absent

            command:命令或腳本

            environment:運行時的環境變量

            hour       :時

            minute     :分

            month      :月

            monthday   :日

            weekday    :周

            name       :名稱

            user       :用戶



# vim  test1.pp
cron {'ntpdate':
     ensure => present,
     command => '/usr/sbin/ntpdate time.windows.com &> /dev/null',
     minute => '*/3',
}
# puppet apply test1.pp
# crontab -l
*/3 * * * * /usr/sbin/ntpdate time.windows.com &> /dev/null


五、group

      管理系統上的組

      經常使用參數

      ensure:目標狀態,present,absent

      name  :組名

      gid   : GID

      system :系統組


# vim  test2.pp
group { 'zxj':
     ensure => present,
     name   => zxj,
     gid    => 1001,
}
# puppet apply test2.pp
# tail /etc/group | grep zxj
zxj:x:1001:


六、exec

       執行命令,一般在不得不用時才使用,慎用,一般用於完成puppet自身沒法完成的功能

       經常使用參數

       command:要執行的命令,一般爲命令的完整路徑

       path : 命令搜索路徑

       group:執行命令的組

       user : 執行命令的用戶

       onlyif:0,表示僅在命令的狀態返回值爲0時才執行此命令

       refresh:定義接受的其餘資源的通知時,則須要從新執行此命令

       refreshonly:僅當被依賴的額資源發生改變時才被觸發

       tries:嘗試次數,默認爲1

       try_sleep :屢次嘗試之間的時間間隔


# vim  test3.pp
exec {'mkdir':
     command =>'mkdir /tmp/test',
     path    =>'/bin:/sbin:/usr/bin:/usr/sbin',
}
# puppet apply test3.pp
# ls -l /tmp/
total 4
drwxr-xr-x 2 root root 4096 Apr  7 06:56 test


七、file

        管理文件、目錄、軟連接;生成文件內容;管理文件權限屬性;也能夠經過source屬性到指定位置下載文件;經過recurse屬性來獲取目錄。

        經常使用參數

        backup:經過filebacket資源來備份文件,值一般爲filebacket資源的名稱

        content:文件內容,生成方式有三種(content,source,target)三者彼此互斥

        source :經過指定的ur下載文件至本地,獲取文件格式爲

                puppet:///modules/MODULE_NAME/file_names

        target : 爲符號連接指定目標

        links  :文件爲符號連接,值爲「follow」,「manage」

        path  :文件路徑,必須使用雙引號

        mode  :定義權限,一般爲8進制數字

        owner :定義文件的屬主

        group :定義文件的屬組

        force :強制執行刪除文件、連接或目錄,僅用於ensure爲absent時

        purge :清除指定目錄存在的,但未在資源中定義的文件

        resurce:目錄遞歸,值爲true,false,inf,remote

        replace:替換,本地存在的文件與資源中指定的文件內容不一樣時是否執行替換,默認爲否


# vim  test4.pp
file {'fstab.link':
     ensure => present,
     target => '/etc/fstab',
     links  => 'follow',
     path   => "/tmp/fstab.link"
}
# puppet apply test4.pp
notice: /Stage[main]//File[fstab.link]/ensure: created
notice: Finished catalog run in 0.02 seconds
# ls -l /tmp
-rw-r--r-- 1 root root    0 Apr  7 07:07 fstab.link


八、notify

     調試輸出

     經常使用參數

       message: 信息

       name   : 信息名稱


資源引用


     Type['title]


         例如 Package['nginx']

     注意:資源類型首字母必定要大寫


元參數metaparams

      用於定義資源間的依賴關係,及應用次序;通知機制    

      特殊屬性

1)require (須要依賴於某資源)



service {'nginx':
        ensure  =>true,
        enable  =>true,
        name    =>name,
        require =>Package['nginx'],
}
package {'nginx':
         ensure =>present,
         name   =>nginx,
}
###nginx服務,依賴於nginx安裝包先安裝完畢。


2)before  (在哪一個資源以前)


service {'nginx':
        ensure  =>true,
        enable  =>true,
        name    =>nginx,
}
package {'nginx':
        ensure  =>present,
        name    =>nginx,
        before  =>Service['nginx'],
}
####nginx的安裝包在nginx服務啓動以前安裝


3)notify (通知某資源)



file {'/tmp/test1.txt':
      ensure  =>file,
      content =>"hello puppet",
      notify  => Exec['monitor'],
}
exec {'monitor':
       command =>'echo "/tmp/test1.txt changed." >> /tmp/monitor.txt',
       refreshonly =>true,
       path    => '/bin:/sbin:/usr/bin:/usr/sbin',
}


4)subscribe 訂閱 (訂閱某資源,即在某資源存在或者改變後再訂閱)



service  {'nginx':
         ensure   =>true,
         enable   =>true,
         name     =>nginx,
         subscribe =>Package['nginx'],
}
package  {'nginx':
         ensure   =>present,
         name     =>nginx,
}


5)當資源出現鏈狀關係時如何處理


package {'nginx',
         ensure =>present,
} ->
service {'nginx',
         ensure => ture,
         enable => ture,
}
->表示後邊的資源依賴於當前的資源


   其中還有一個~> 表示前資源發生改變後通知後邊的資源


puppet的變量


   puppet的變量名稱以"$"開頭,賦值操做符爲"=",應合變量值爲"" ,或者什麼都不寫


   一、puppet的變量能夠接受的數據類型

        ###puppet語言支持多種數據類型以及用於變量和屬性的值,以及函數的參數

      1)字符型

         非結構化的文本字符串,可使用引號,也能夠不用;

         單引號中的變量不會替換,而雙引號中的可以進行變量替換;

         字符型值也支持使用轉衣符;

      2)數值型

         可爲整數或浮點數,不過puppet只有在數值上下文才把數值當數值型對待

         其餘狀況下一概以字符型處理


      3)數組

         數組值爲中括號"[]"中的逗號分隔的項目列表,最後一個項目後邊能夠有逗號;

         數組中的元素能夠爲任意可用數據類型,包括hash或其餘數組;

         數組索引爲從0開始的證書,也可使用負數索引;


      4)布爾型

         true和false ,不能加引號;

         if語句的測試條件和比較表達式都會返回布爾型值;

         另外,其餘數據類型也能夠自動轉換爲布爾型,如空字符串爲false等;


      5)undef

          從未被生命的變量的值類型即爲undef;

          也可手動爲某變量賦予undef值,即直接使用不加引號的undef字符串;


      6)hash

       即爲外鍵值數據類型,鍵和值之間使用"=>"分隔,鍵值對兒定義在"{}",彼此間以逗號分隔;

       其鍵爲字符型數據,而值能夠爲puppet 支持的任意數據類型;

       訪問hash類型的數據元素要使用"鍵"看成索引進行


    二、puppet的變量類型

       1)自定義變量

       2)facter變量

        #facter -p 能夠列出全部的faceter變量

       3)內置變量


         agent: $environment,$clientcert,$clinetversion

         master:$serverip, $servername,$serverversion

    三、正則表達式

       屬於puppet的非標準數據類型,不能賦值給變量,僅能用於有限的幾個接受正則表達式的地方,即接受使用"=~" 及"!~"匹配操做符的位置,一般包括case語句中的selector,以及節點名稱匹配的位置;它們不能傳遞給函數或用於資源屬性的定義;


      puppet中的正則表達式支持使用(?<ENABLED OPTION>:<SUBPATTERN>)和(?-《DISABLED OPTION>:<SUBPATTERN>)兩個特殊的符號


      例以下面的示例表示作正則表達式匹配時啓用選項"i"(忽略字符大小寫),但不支持使用"m"(把.看成換行符)和"x"(忽略模式中的空白字符和註釋)



$package = $opratingsystem ? {
    /(?i-mx:ubuntu|debian)/    => 'apache2',
    /(?i-mx:centos|fedora|redhat)/ => 'httpd',
}




puppet表達式



Comparison Oprators
   == (equality)
   != (non-equality)
   <  (less than)
   >  (greater than)
   <= (less than or equal to)
   >= (greater than or equal to)
   =~  (regex match)
   !~  (regex non-match)
   in
Boolean Operators
   and
   or
   !(not)
Arithmetic Operators
   + (addintion)
   - (subtraction)
   / (division)
   *  (multiplication)
   << (left shift)
   >> (right shift )





puppet條件判斷


一、if


if  statement  ----if  語句
單分支:
    if CONDITION {
        statment
        ...
     }
雙分支
    if CONDITION  {
       statment
       ...
    }
    else {
       statment
       ...
    }
多分支
    if  CONDITION  {
       statment
       ...
    }
    elsif CONDITION {
       statment
       ...
    }
    else {
       statment
       ...
    }


    例1


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

    例2


if $operatingsystem  == 'centos' {
       notify {'centos':message => "Welcome to CentOS linux",}
}elsif $operatingsystem == 'RedHat' {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
       notify {'redhat': message=> "Welcome to RedHat linux",}
}elsif $operatingsystem == 'Fedora' {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
       notify {'fedora': message=> "Welcome to Fedora linux",}
}else {
       notify {'unknown': message => "Unknown Opreating System",}
}


二、case語句



case $operatingsystem {
 'Solaris':   {notice("Welcome to Solaris")}
 'RedHat','CentOS': {notice ("Welcome to RedHat OSFamily")}
  default:     {notice("Welcome,alien*_*")}
}


三、selectors語句



語法格式
CONTROL_VARIABLE ? {
  case1 => value1
  case2 => value2
  ...
  default => valueN
}


   例


$webserver = $operatingsystem ? {
    /^(?i-mx:centos|fedora|redhat)/ => 'httpd/,
    /^(?i-mx:ubuntu|debian)/        => 'apache2',
}
$webprovider = $operatingsystem ? {
    /^(?i-mx:cenotos|fedora|redhat)/ => 'yum',
    /^(?i-mx:ubuntu|debian)/         => 'apt',
}
package {"$webserver":
        ensure => present,
        provider => $webprovider,
}


puppet中的類


   Classl是用於通用目標或目的一組資源,所以它是命令的代碼塊,在某位置建立以後能夠在puppet全局使用。相似於其餘編程語言中的類的功能,puppet的類可繼承,也能夠包含子類,定義類的語法

   class my_class {

         ...puppet code ...

   }


   例如:定義一個名叫nginx的類,其中包含兩個類資源,一個是package類型的nginx,一個是service的nginx

   class nginx {

   package {'nginx':

         ensure   => present,

          name    => nginx,

   }

   service {'nginx':

         ensure    =>true,

         enable    =>true,

         subscribe =>Package['nginx'],

   }

   }

   注意:類的名稱只能以小寫字母開頭,能夠包含小寫字母,數字和下劃線。


類的聲明

    在manifest文件中定義的類不會直接被執行 ,他們須要事先聲明後才能 被執行。

    要聲明一個類須要藉助include函數,也能夠像聲明一個資源同樣聲明類class {'class_name'}

    例如:


# vim  test.pp
class nginx {
    package {'nginx':
          ensure   => present,
           name    => nginx,
    }
    service {'nginx':
          ensure    =>true,
          enable    =>true,
          subscribe =>Package['nginx'],
    }
}
include nginx


# puppet apply test.pp 應用一個類便可



帶參數的類

   在定義帶參數的類時,須要將參數聲明在類名後的小括號"()"中,建議參數有默認值,若是使用多個參數,須要使用逗號分隔。

   在類傳遞參數時,其方式相似於定義資源的屬性

   class {'class_name':

         params1 => value1,

         params2 => value2,

   }


類的繼承調用


   類能夠基於父類調用,調用時,應該指定經過inherits調用父類



class nginx {
package {'nginx':
       ensure => present,
       name   => nginx,
}
}
class nginx::web inherits nginx {
service {'nginx':
       ensure  =>true,
       enable  =>true,
}
}
include nginx::web

    =>  在子類中覆蓋父類中的資源

    +>  在子類中爲父類中的資源新增額外的屬性


PS:總結也許不全面,不足之處請之處!

相關文章
相關標籤/搜索