Linux Puppet基礎知識

Linux Puppet基礎知識linux

         Puppet能夠批量配置多個節點,減小運維人員在重複的、繁瑣的工做中花費的時間;能夠輕鬆的管理幾千個節點;nginx

                   官網地址:https://puppet.com/web

         Puppet相對於ansible來講,其不只要運行master端,且在每一個被管控節點上還要安裝並運行agent端;正則表達式

                   master:puppet servershell

                   agent:agent週期性(默認爲30分鐘)的到master端請求與本身相關的配置,進而在本地執行(因此說agent纔是真正管理節點的部件),而後將執行結果報告給master端;apache

                   Note:master與agent使用本身的私有認證機制進行認證,其實也就是ssl,只不過master自建了一個私有CA進行證書籤發;編程

         Puppet工做模式:ubuntu

                   定義:使用puppet配置語言定義基礎配置信息(資源狀態);centos

                   模擬:先在本地模擬執行一遍,若是執行沒有錯誤再應用到各個節點;api

                   強制:比對節點狀態與定義的資源狀態是否一致,若是不一致則agent執行相關配置;強制使當前與定義的目標狀態保持一致;

                   報告:經過puppet API將日誌發送到第三方監控工具,進行監控;還會向master報告相應的執行結果;

         Puppet的三層模型:

                   頂層(Configuration Language,配置語言):定義基礎配置信息;

                   中層(Transactional Layer,事務層):解決資源之間的依賴關係;好比要想啓動某個服務,必需要先安裝這個服務才行;

                   底層(Resource Abstraction Layer,資源抽象層):將主機上每一個可被管理的對象都被定義爲資源;

                          這樣抽象實現之後,能夠將每一個對象與其實現方式隔離開來;好比在系統中安裝一個軟件,在Ubuntu(apk)中安裝和在Centos(yum)中安裝是不一樣的,由於它們使用的工具不一樣,可是經過這個層的隔離,就能夠將具體的實現支持透明化,僅給出要安裝的軟件包,具體的實現交給puppet就能夠了;

                            資源類型:例如用戶、組、文件、服務、cron任務等;

                            屬性及狀態與其實現方式相分離;

                            每一個資源的指望狀態;

         Puppet的核心組件:資源

                   資源清單:manifests,即便用到的資源的列表文件;還有一個叫站點清單:即資源清單的清單,能夠理解爲是應用到某一遠端被管控節點的資源清單的組合;

                   模塊:資源清單及清單中的資源定義的所依賴的文件、模板等數據按特定結構組織起來即爲模塊;模塊最大的好處就是能夠實現代碼重用,從而簡化了繁雜的工做;

 

 

         Puppet工做過程:

                   類型1:僅在本地應用

                            Puppet能夠設置多個資源清單,每一個資源清單包含不一樣資源,用於實現不一樣配置功能;設置完資源清單之後,Puppet會對資源清單進行編譯,進而生成僞代碼(catalog),而後才能在本地節點上應用(執行);

                   類型2:在具備被控的遠端節點上應用

                            agent節點會週期性向master發送請求信息而且發送本身的facts信息(包括主機名、IP地址、CPU核心數等),請求與本身的相關的配置;當master收到agent的請求時,會根據其主機名在本地進行查找,搜尋與請求agent相關的資源清單(manifest),若是找到相匹配的資源清單,則在本地進行編譯,生成僞代(catalog),而後將僞代碼發送給請求的agent,接着agent會在本地應用這個僞代碼,最後將應用結果報告給master端;

 

 

 

         Puppet的master與agent是經過HTTPS協議通訊的;由於master端自帶CA,因此咱們能夠經過master的CA給每一個受其管理的agent端發放證書,從而實現安全通訊;

         Puppet安裝:

                   能夠在官網下載安裝,也能夠直接使用yum安裝;

                  agent節點須要安裝puppet和facter包;

                   master節點須要安裝puppet、facter和puppet-server包;

                  puppet命令用法:具體用法在下面使用時再解釋;

                            幫助:puppet help [subcommand]

                            查看puppet的各類資源類型的信息:puppet describe

                            Usage: puppet <subcommand> [options] <action> [options]

                   定義資源:  

                            格式:

                                     type {‘title’:

                                               attribute1 => value,

                                               attribute2 => value,

                                               ……

                                               }

                                     示例:

                                               user {‘guowei’:

                                                        uid => 1000,

                                                        gid => 1000,

                                                        shell => ‘/bin/bash’,

                                                        home => ‘/home/guowei’,

                                                        ensure => present,

                                               }

                            特殊變量:

                                     Name/Namevar

                                               大多數資源都有一個Namevar屬性,若是過不指出,則title則爲此種資源的Namevar變量的值;好比user的Namevar爲name,file的Namevar爲file;

                                     Ensure

                                               大多數資源都支持的屬性,用於控制此種資源的存在性;其取值通常根據資源的不一樣而不一樣,大致有:present表示存在或者建立、absent表示不存在或者刪除;

                                     Metaparameters

                                              

                            經常使用資源類型:

                                     user,group,file,package,service,exec,cron,notify等;

 

                                     ~]# puppet describe user

                                               經常使用屬性:

                                                        comment:描述信息;

                                                        ensure:建立或刪除用戶,有兩個取值:present、absent;

                                                        expiry:帳戶的過時期限;

                                                        gid:帳號所屬的基本組;

                                                        groups:帳號所屬的附加組;

                                                        home:家目錄;所指定的目錄須要事先建立,且權限正確;

                                                        name:用戶名,且爲Namevar;

                                                        password:帳號密碼;

                                                        password_max_age:密碼最長使用期限;

                                                        password_min_age:密碼最短使用期限;

                                                        shell:帳號使用的shell類型;

                                                        system:帳號是否爲系統用戶,有四個取值:true|yes,false|no;;

                                                        uid:UID,無需解釋;

                                     ~]# puppet describe group

                                               經常使用屬性:

                                                        ensure:建立或者刪除組,有兩個取值:present、absent;

                                                        gid:GID,無需解釋;

                                                        name:組名,且爲Namevar;

                                                        system:是否爲系統組;有四個取值:true|yes,false|no;

                                                        members:指定組成員,本身爲組成員的附加組;

                                               示例:

                                                        ~]# cat test1.pp            此類文件約定成俗以」.pp」結尾

                                                                  group {'distro':

                                                                           gid => 2000,

                                                                           ensure => present,

                                                                  }

                                                                  user {'centos':

                                                                           uid => 2000,

                                                                           gid => 2000,

                                                                           shell => '/bin/bash',

                                                                           home => '/home/centos',     若是是建立用戶,則須要此目錄已經事先存在,且權限正確;

                                                                           ensure => present,          表示建立這個用戶,若是是absent的話就是刪除這個用戶;

                                                                  }

                                                        使用了兩個資源類型(group和user),分別應用了幾個其特有的屬性,屬性的做用就是字面意思,很好理解;

                                     puppet apply:在本地直接應用資源清單定義的資源,無需通過master管理;

                                              用法:puppet apply [-h|--help] [-v|--verbose] [--noop]  <file>

                                                        -h:查看詳細的幫助信息;

                                                        -v:應用時顯示詳細信息;

                                                        --noop:測試應用(執行),而不是真正的應用(執行);

                                     ~]# puppet apply -v test1.pp

                                     ~]# puppet describe file

                                               用途:主要用於管理文件及其內容|從屬關係|權限、目錄、符號連接;

                                               經常使用屬性:

                                                        checksum:校驗文件完整性;

                                                        source:從指定路徑下載文件,能夠是遠程也能夠是本地,通常用於agent從master下載相關配置文件;若是是遠端路徑通常格式爲:puppet:///modules/MODULE_ANME/FILE_ANME;

                                                        content:編寫文件內容,使用」\n」做爲換行符、」\t」做爲製表符;

                                                        ensure:取值爲:present、absent、file、directory、link;

                                                        recurse:遞歸處理目錄或其中的文件,只有當ensure爲directory時才起做用;

                                                        force:強制執行,有四個取值:true|yes,false|no;;

                                                        group:屬組;

                                                        owner:屬主;

                                                        mode:權限:

                                                                 格式:<who><op><perm>

                                                                     * "who" should be u (user), g (group), o (other), and/or a (all)

                                                                     * "op" should be = (set exact permissions), + (add select permissions),or - (remove select permissions)

                                                                     * "perm" should be one or more of:

                                                                         * r (read)

                                                                         * w (write)

                                                                         * x (execute/search)

                                                                         * t (sticky)

                                                                         * s (setuid/setgid)

                                                                         * X (execute/search if directory or if any one user can execute)

                                                                         * u (user's current permissions)   使用用戶的當前權限

                                                                         * g (group's current permissions)

                                                                         * o (other's current permissions)

                                                                 Note:或者使用數字表示權限;

                                                        mtime:最近修改時間;

                                                        path:目標路徑,且爲Namevar;

                                                        target:被建立連接文件的文件;不能與source和content一塊兒使用且ensure需爲link;此時path或title指定的文件爲連接文件;

                                               示例:

                                                        ]# cat test2.pp

                                                                 file {'/tmp/mydir/':

                                                                ensure => directory,

                                                                 }

 

                                                                 file {'/tmp/puppet.file':

                                                                content => 'puppet testing\nhello world!',

                                                                ensure => file,

                                                                owner => 'centos',

                                                                group => 'distro',

                                                                mode => 0400,

                                                                 }

 

                                                                 file {'fstab':

                                                                path => '/tmp/fstab.puppet',

                                                                source => '/etc/fstab',

                                                                ensure => file,

                                                                 }

 

                                                                 file {'/tmp/puppet.link':

                                                                ensure => link,

                                                                target => '/tmp/puppet.file',

                                                                 }

                                                        ]# puppet apply -v -d test2.pp

                                     ~]# puppet describe exec

                                               用途:用於運行系統中的命令且要求所運行的命令具備冪等性,也就是一樣的命令運行屢次都是相同的結果;

                                                        冪等性:

                                                                 1.命令自己具備冪等性;

                                                                 2.資源有onlyif、unless、creates等屬性以實現命令的條件式運行;

                                                                 3.資源有regreshonly屬性,以實現只有訂閱的資源發生變化時才運行;

                                               經常使用屬性:

                                                        command:指定要運行的命令,且爲Namevar;

                                                        creates:此屬性指定的文件不存在時才執行此命令;

                                                        cwd:指定在哪一個目錄下執行命令;

                                                        environment:指定環境變量,通常是不在PATH環境變量中的;

                                                        path:指定環境變量;若是不使用path屬性,則須要使用命令的絕對路徑;

                                                        group:以哪一個組的身份運行命令;

                                                        user:以哪一個用戶的身份運行命令;

                                                        onlyif:只有此處指定的命令的運行結果爲成功(即返回值狀態碼爲0)才執行command中的命令;

                                                        unless:只有此處指定的命令的運行結果爲失敗(即返回值狀態碼爲非0)才執行command中的命令;

                                                        refresh:若是接收到其餘資源發來的refresh通知時,默認是從新執行exec定義的command,可是refresh屬性能夠改變這種行爲,便可指定僅在資源refresh時運行的命令;好比某個服務的配置文件發生了改變,咱們通常都會讓服務重載或者重啓,這種狀況下就能夠經過這個屬性來實現,可是refresh須要接收到某種通知之後才能啓動相應的操做;

                                                        refreshonly:只有接收到refresh時才執行command中的命令,不然不作任何操做;可取值爲:true、force;

                                                        timeout:命令執行的超時時長;

                                               示例:

                                                        ]# cat test3.pp

                                                                 exec {'modprobe ext4':

                                                                           path => '/usr/sbin:/usr/bin',

                                                                           user => root,

                                                                           group => root,

                                                                           refresh => 'modprobe -r ext4 && modeptobe ext4',

                                                                           timeout => 8,

                                                                           tries => 2,

                                                                 }

                                                                 exec {'/bin/echo world > /tmp/hello.txt':

                                                                           user => root,

                                                                           group => root,

                                                                           creates => '/tmp/hello.txt',

                                                                 }

                                                                 exec {'/bin/echo centos7 > /tmp/hello2.txt':

                                                                           user => root,

                                                                           group => root,

                                                                           unless => '/usr/bin/test -f /tmp/hello2.txt',

                                                                 }

                                     ~]# puppet describe notify

                                               用途:用於顯示一些提示信息;

                                               經常使用屬性:

                                                        message:要發送的消息的內容;

                                     ~]# puppet describe cron

                                               用途:設定週期性任務;

                                               經常使用屬性:

                                                        command:指定要運行的命令;

                                                        ensure:添加或刪除cron任務,取值爲:present、absent;

                                                        minute:指定分鐘;

                                                        hour:指定小時;

                                                        month:指定月份;

                                     monthday:指定某月的第幾天,最大取值範圍爲1-31;

                                     weekday:指定星期,取值爲0-7且0與7是同一天;

                                                        user:指定是哪一個用戶的cron任務;

                                                        name:cron任務的名稱;

                                                        target:指定存儲cron任務的文件路徑;

                                                        environment:運行cron任務的環境變量;

                                               示例:

                                                        ]# cat test5.pp

                                                                 cron {'sync time':

                                                                           command => '/usr/sbin/ntpdate api.api.bz &> /dev/null',

                                                                           ensure => present,

                                                                           hour => '*/3',

                                                                 }

                                     ~]# puppet describe package

                                               用途:管理程序包;

                                               經常使用屬性:

                                                        configfiles:指定安裝新的程序包或者從新安裝程序包時,對於以前已經存在配置文件的處理方式;有兩個取值:keep(保存)、replace(替換);

                                                        ensure:安裝或卸載程序包;取值爲:latest(安裝最新版)、指定程序包的版本(VERSION(2.5.3-2.el7))、absent、present|installed、purged(清除);

                                                        install_options:指定安裝選項;

                                                        name:指定安裝包的名稱;

                                                        source:指定程序包的安裝源,能夠是本地路徑或者URL;取值能夠爲yum、apt、rpm、dpkg,若是是後二者的話,須要指明具體路徑;

                                                        provider:指定安裝方式;可取值爲rpm、dpkg、yum、apt;

                                               示例:

                                                        ]# cat test6.pp

                                                                 package {‘zsh’:

                                                                           ensure => latest,

                                                                 }

                                                                 package {‘jdk’:

                                                                           ensure => installed,

                                                                           source => ‘/usr/local/src/jdk-8u25-linux-x64.rpm’,

                                                                           provider => rpm,

                                                                 }

                                     ~]# puppet describe service

                                               用途:管理服務;

                                               經常使用屬性:

                                                        binary:指定啓動特定服務的啓動腳本;

                                                        enable:指定是否爲開機自動啓動;可取值爲:true、false、manual;

                                                        ensure:指定服務狀態;可取值爲stopped|false、running|true;

                                                        hasrestart:說明當前啓動服務的機制是否自帶restart功能;若是沒有能夠經過先中止在啓動來從新啓動;

                                                        hasstatus:相似於上面;

                                                        name:指定服務名稱;

                                                        path:指定啓動服務所用到的腳本的路徑;

                                                        restart:若是服務的啓動腳本不支持restart選項,則能夠經過這個屬性手動設置重啓方式;

                                                        start:相似於上面;

                                                        stop:相似於上面;

                                                        status:相似於上面;

                                                        pattern:用於搜索於此服務相關的進程的模式;當腳本不支持restart/status時,用於肯定服務是否處於運行狀態;

                                               示例:

                                                        ~]# cat test7.pp

                                                                 package {'nginx':

                                                                           ensure => latest,

                                                                 }

 

                                                                 service {'nginx':

                                                                           ensure => running,

                                                                           enable => true,

                                                                           hasrestart => true,

                                                                           hasstatus => true,

                                                                           restart => 'systemctl reload nginx.service',

                                                                 }

                            特殊屬性:Metaparameters

                                     puppte提供了before(在….以前)、require(在….以後)、notify(本身發生改變之後通知其餘資源)和subscribe(本身監控其餘資源,若是其改變,則進行相應的操做)四個元參數來定義資源間的依賴/通知關係;

                                               這四個參數都以另外其餘資源或資源數組做爲其值,這也成爲資源引用;

                                               資源引用通」Type [title]」(資源引用時,其類型名稱的首字母要大寫)這樣的方式進行,好比User[‘centos’];

                                     1.定義依賴關係(before、require)

                                               用於解決資源之間的依賴關係,好比要啓動一個服務,就要先安裝這個服務,不然就會執行錯誤;

                                     示例:

                                               ~]# cat test8.pp

                                                        group {'king':

                                                                 gid => 2500,

                                                                 ensure => present,

                                                                 before => User['man'],       在user以前運行;

                                                        }

 

                                                        user {'man':

                                                                 uid => 2500,

                                                                 gid => 2500,

                                                                 shell => '/bin/bash',

                                                                 home => '/home/centos',

                                                                 ensure => present,

                                                                 #require => Group[‘king’]    在group以後運行;

                                                        }

                                               Note:在表示依賴關係時,還可使用」A ->B 」符號表示A先於B;

                                     2.定義通知關係(notify、subscribe)

                                               用於實現資源之間的信息傳遞,好比當一個服務的配置文件發生改變時,咱們要通知相關的服務腳本從新啓動服務;

                                              示例:

                                                        ~]# cat test9.pp

                                                                 package {'nginx':

                                                                           ensure => latest,

                                                                 }

 

                                                                 file {'/etc/nginx/nginx.conf':

                                                                           ensure => file,

                                                                           source => '/root/modules/nginx/files/nginx.conf',

                                                                           require => Package['nginx'],

                                                                           notify => Service['nginx'],

                                                                 }

 

                                                                 service {'nginx':

                                                                           ensure => running,

                                                                           enable => true,

                                                                           hasrestart => true,

                                                                           hasstatus => true,

                                                                           require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],

                                                                 }

                                              Note:在表示依賴關係時,還可使用」A ~>B 」符號表示A通知B;

                            變量:

                                     1.Puppte中的變量須以」$」開頭,且使用」=」做爲賦值操做符;

                                     2.任何正常數據類型(除了正則表達式)的值均可以被賦予puppet中的變量;如字符串、數值、布爾值、數組、hash以及特殊的undef值(即變量未被賦值);

                                     3.Puppet的每一個變量都有兩個名字:簡短名稱和長格式徹底限定名稱(FQN),徹底限定名稱的格式爲」$scope::variable」;

                                               做用域:定義代碼的生效範圍,以實現代碼間隔離;

                                                        僅能隔離變量、資源的默認屬性;

                                                        不能隔離資源的名稱、及其引用;

                                     4.變量的引用方式:

                                               相對路徑: 即直接使用變量名;

                                               絕對路徑:$scope::scope::variable

                                     5.變量的賦值符號:

                                               =:直接賦值;

                                               +=:追加賦值(在原來的基礎上新增內容);

 

                                     Puppet的數據類型;

                                               字符型:

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

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

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

                                               數值型:

                                                        可爲整數或浮點數,不過,Puppet只有在數值上下文(即作數值運算時)才能把數值當數值對待,其餘狀況下一概以字符型處理;

                                               數組:

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

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

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

                                              布爾型:

                                                        true或false,使用時不能加引號;

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

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

                                               undef:

                                                        從未被聲明的變量的值的類型即爲undef;

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

                                               hash(相似於Python中的字典):

                                                        即爲鍵值數據類型,鍵和值之間使用」=>」分隔,鍵值對兒定義在」{ }」中,彼此間以逗號間隔;好比:{‘A’ => ‘12’,’B’ => ‘abc’}

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

                                                        訪問hash類型的數據元素要使用」鍵」當作索引進行;

                                               正則表達式:

                                                        屬於Puppet的非標準數據類型,不能被賦予給變量,僅能用於有限的幾個接收正則表達式的的地方,即接受使用」=~」及」!~」匹配操做符的位置,一般包括case語句中的selector,以及節點名稱匹配的位置;

                                                        不能傳遞給函數或用於資源屬性的定義;

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

                                                                 OPTION:

                                                                           i:表示忽略字符大小寫;

                                                                           m:表示把.當作換行符;

                                                                           x:忽略模式中的空白字符和註釋;

 

                                                        示例:

                                                                 $packages = $operatingsystem ? {

                                                                           /(?i-mx:ubuntu|debian)/   => ‘apache2’,

                                                                           /(?i-mx:centos|fedora|redhat)/  => ‘httpd’,

                                                                 }  #若是$operatingsystem與ubuntu|debian| centos|fedora|redhat中任何一個鍵相匹配的話$packages就被賦予鍵所對應的值;

                                     Puppet支持的表達式:

                                               比較操做符:==、>、<、>=、<=、!~、=~、!=、in;

                                               邏輯操做符:and、or、!;

                                               算數操做符:+、-、*、/、%、>>、<<;

                                     示例:

                                               ~]# cat test10.pp

                                                        $webserver=httpd

                                                        package {$webserver :

                                                       ensure => latest,

                                                        }

                                     Puppet中變量的種類:

                                               自定義變量:即上面所述的變量

                                               facter變量:agent自身支持的變量,通常是有關本身自己屬性的變量,好比主機名、IP地址、CPU顆數等;可經過facter -p查看全部支持的變量;

                                               內置變量:

                                                        客戶端內置變量:

                                                                 $clientcert

                                                                 $clientversion

                                                        服務器端內置變量:

                                                                 $servername

                                                                 $serverip

                                                                 $serverversion

                                                                 $module_name

                                     Puppet支持的條件判斷語句:

                                               if:

                                                        if CONDITION {

                                                                 statement

                                                                 ……

                                                        }               ------->  到這爲單分支;

                                                        else {

                                                                 statement

                                                                 ……

                                                        }               ------->到這爲雙分支;

 

                                                        if CONDITION {

                                                                 statement

                                                                 ……

                                                        }

                                                        elsif CONDITION {

                                                                 statement

                                                                 ……

                                                        }

                                                        else {

                                                                 statement

                                                                 ……

                                                        }                 ------->到這爲多分支;

                                                        CONDITION的用法:

                                                                 1.比較表達式;

                                                                 2.變量引用;

                                                                 3.有返回值的函數調用;

                                               示例:

                                                        ~]# cat test11.pp

                                                                 if $processorcount > 5 {

                                                                           notice("SMP PC")       這是puppet的一個內置函數,功能相似於notify資源;

                                                                 }

                                                                 else {

                                                                           #notice("KunKun")

                                                                           notify {'message':

                                                                                    message => "KunKun",

                                                                           }

                                                                 }

                                                                 if $operatingsystem =~ /^(?i-mx:(centos|redhat))/ {

                                                                           notice(「Welcome to $1 linux server」)

                                                                 }

                                               case:

                                                        case CONTROL_EXPRESS {

                                                                 Case1,… : {statement…}

                                                                 Case2,… : {statement…}

                                                                 ……

                                                                 default : {statement…}

                                                        }

                                                        CONTROL_EXPRESS:

                                                                 1.比較表達式;

                                                                 2.變量引用;

                                                                 3.有返回值的函數調用;

                                                        Case#:

                                                                 1.比較表達式;

                                                                 2.變量引用;

                                                                 3.僅有一個返回值的函數調用;

                                                                 4.正則表達式;

                                                                 5.default;

                                                        示例:

                                                                 ~]# cat test18.pp

                                                                           case $operatingsystem {

                                                                                    ‘Solaris’ :        { notice(「welcome to Solaris」) }

                                                                                    ‘Redhat’,’Centos’ : { notice(「welcome to Redhat OSFamily」) }

                                                                                    /^(Debian|Ubuntu)$/ : {notice(「welcome to $1 linux」) }

                                                                                    default :           { notice(「welcome,alien *_*」) }

                                               selector:

                                                        用於返回一個值,而不是執行一個代碼塊;能夠將這個值賦值給其餘變量;

 

                                                        CONTROL_VARIABLE ? {

                                                                 case1 => value1,

                                                                 case2 => value2,

                                                                 ……

                                                                 default => value#

                                                        }

                                                        示例:

                                                                 $webservice = $operatingsystem ? {

                                                                           /(?i-mx:ubuntu|debian)/   =>   ‘apache2’,

                                                                           /(?i-mx:centos|redhat)/    =>   ‘httpd’,

                                                                 }    

                                               unless:相似於if;

                            Puppet中的類(class):

                                     用於公共目的的一組資源的集合,相似於代碼塊;建立後可在puppet的全局進行調用,因此類名在全局應該是惟一的,其能夠被應用到全部被管理的節點上;而且類能夠被繼承;

                                     語法格式:

                                               class class_name {

                                                        … puppet code …

                                                        變量

                                                        賦值

                                                        條件判斷

                                                        資源聲明

                                                        ……

                                               }

                                     類的名稱只能以小寫字母開頭,能夠包含小寫字母、數字、下劃線;

                                     每一個類都會引入一個新的變臉scope,這意味着在任什麼時候候訪問類中的變量時,都得使用其徹底限定名稱;不過本地scope能夠從新爲top scope中的變量賦予一個新值;

                                     類也可以接收參數;

                                               class class_name($arg1[=’value1’],$arg2[=‘value2’]) {

                                                        … puppet code …

                                               }

                                     類只有被聲明之後纔可使用;

                                               聲明變量的方法:

                                                        include方式:

                                                                 include class_name1,class_name,…

                                                        require方式:

                                                                 require class_name1,class_name2,…

                                                        像聲明一個資源同樣聲明一個類:

                                                                 class {‘class_name’ :

                                                                           arg1 => ‘value1’,

                                                                           agr2 => ‘value2’,

                                                                           ……

                                                                 }

                                                        使用ENC的風格聲明一個類

                                     示例:

                                               ~]# cat test13.pp

                                                        class nginx($webserver=’nginx’) {   --->默認安裝nginx;

                                                                 package {$webserver :

                                                                           ensure => latest,

                                                                 }

 

                                                                 file {'/etc/nginx/nginx.conf':

                                                                           ensure => file,

                                                                           source => '/root/modules/nginx/files/nginx.conf',

                                                                           require => Package['nginx'],

                                                                           notify => Service['nginx'],

                                                                 }

 

                                                                 service {'nginx':

                                                                           ensure => running,

                                                                           enable => true,

                                                                           hasrestart => true,

                                                                           hasstatus => true,

                                                                           #restart => 'systemctl reload nginx.service',

                                                                           require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],

                                                                 }

                                                        }

                                                       #include nginx

                                                        class {‘nginx’ :

                                                                 webservice => ‘tengine’,     ----->指定安裝tengine;

                                                        }

                                     類繼承:

                                               定義方式:

                                                        class base_class {

                                                                 … puppet code …

                                                        }

                                                        class [base_class::]calss_name inherits base_class {

                                                                 … puppet code …

                                                        }

                                               做用:繼承一個已有的類,並實現覆蓋資源屬性或向資源屬性追加額外值;覆蓋使用」=>」,追加使用「+>」;

                                              類繼承時:

                                                        1.聲明子類時,其基類(父類)會被自動首先聲明;

                                                        2.基類成爲了子類的父做用域,基類中的變量和屬性默認值會被子類複製一份;

                                                        3.子類能夠覆蓋父類中同一資源的相同屬性的值;

                                              Note:咱們能夠將具備會被重複使用的資源放在基類(父類)中,將特有的資源設置在子類中;

                                               示例:

                                                                 ~]# cat test14.pp

                                                                           class nginx {

                                                                                    $services = $operatingsystemmajrelease ? {

                                                                                             /(?i-mx:6)/ => 'service nginx reload',

                                                                                             /(?i-mx:7)/ => 'systemctl reload nginx.service',

                                                                                    }

                                                                                    package {'nginx':

                                                                                             ensure => latest,

                                                                                             name => nginx,

                                                                                    } ->

        

                                                                                    service {'nginx':

                                                                                             enable => true,

                                                                                             ensure => running,

                                                                                             hasrestart => true,

                                                                                             restart => $services,

                                                                                    }

                                                                           }

 

                                                                           class nginx::webserver inherits nginx {

                                                                                    Package [‘nginx’] {

                                                                                             #name +> varnish,   引用父類的package資源,而且追加安裝varnish;

                                                                                             name => tengine,    #引用父類的package資源,而後覆蓋父類的nginx,改爲安裝tengine;

                                                                                    }

                                                                                    file {'/etc/nginx/nginx.conf':

                                                                                             source => '/root/modules/nginx/files/nginx_web.conf',

                                                                                             ensure => file,

                                                                                              notify => Server['nginx'],

                                                                                    }

                                                                           }

 

                                                                           class nginx::proxy inherits nginx {

                                                                                    file {'/etc/nginx/nginx.conf':

                                                                                             source => '/root/modules/nginx/files/nginx_proxy.conf',

                                                                                             ensure => file,

                                                                                             notify => Server['nginx'],

                                                                                    }

                                                                           }

                                                                           include nginx::webserver

                            Puppet中的模板(基於ERB模板語言):

                                     在靜態文件中使用變量等編程元素,生成適用於多種不一樣環境的文本文件(配置文件);ERB即Embedded Ruby,用於實如今文本文件中嵌入ruby代碼,應用時原來的文本文件不會被改變,但ruby代碼會被執行,執行結果將直接替換原來的代碼;

                                     嵌入代碼的方式:

                                               <%= RubyExpression %>:替換爲表達式的值;

                                               <% Ruby Expression %>:僅執行代碼,而不替換;

                                               <% comment %>:文本註釋信息;

                                              <%%:輸出爲」<%」;

                                               %%>:輸出爲」%>」;

                                               <%- Ruby Expression %>:執行時忽略空白字符;

                                               <% Ruby Expression -%>:執行時忽略空白行;

                                     在模板中使用的變量,包括Puppet中的任意可用變量,但要以」@」開頭;

                                     示例:

                                               ~]# cat /root/modules/nginx/files/nginx.conf

                                                        worker_processes <%= @processorcount %>;

                                                                 將變量嵌入到配置文件的模板中;

                                               ~]# cat test15.pp

                                                        $webserver=nginx

                                                        package {$webserver :

                                                                 ensure => latest,

                                                        }

 

                                                        file {'/etc/nginx/nginx.conf':

                                                                 ensure => file,

                                                                 content => template('/root/modules/nginx/files/nginx.conf'),

                                                                           將配置文件模板使用puppet的內置函數輸出爲字節流,而後傳輸給目標配置文件,只有這樣才能夠解析配置文件模板中的變量;

                                                                 require => Package['nginx'],

                                                                 notify => Service['nginx'],

                                                        }

 

                                                        service {'nginx':

                                                                 ensure => running,

                                                                 enable => true,

                                                                 hasrestart => true,

                                                                 hasstatus => true,

                                                                 #restart => 'systemctl reload nginx.service',

                                                                 require => [ Package['nginx'],File['/etc/nginx/nginx.conf'] ],

                                                        }

                                     模塊路徑:

                                               Puppet中的模塊,其實就是一個目錄,而後將須要的文件都已規定的格式放在這個目錄的特定子目錄中,自建的模塊通常都會放在/etc/puppet/modules/中;若是想自建模塊,只須要在此目錄下建立子目錄,這個子目錄的名稱就是模塊的名稱;

                                               模塊目錄(module_name/)包含的文件:

                                                        manifests/:用於存放模塊使用的資源清單;且至少要包含init.pp這個文件,且這個文件至少要包含一個與當前模塊名稱同名的類,從而實現自包含、自識別等功能;

                                                        files/:用於存放模塊使用的靜態文件;而且在管理agent時,agent須要得到這些只有在master端才具備的文件時,master會自動開啓一種能夠傳輸文件的功能,經過設置puppet:///modules/module_name/file_name(紅色部分爲固定格式)將文件傳輸到agent;

                                                        templates/:用於存放模塊使用的模板文件;template(‘module_name/template_name’);

                                                        lib/:插件目錄;

                                                        tests/:當前模塊的使用幫助及示例文件;

                                                        spec/:相似於tests/目錄,存儲lib/目錄下定義的插件的使用幫助及示例文件;

                                     查找、安裝、管理模塊:

                                               puppet module <action> [--environment production ]

[--modulepath $basemodulepath ]

                                                        ACTIONS:

                                                               build        Build a module release package.

                                                                changes      Show modified files of an installed module.

                                                               generate     Generate boilerplate for a new module.

                                                               install      Install a module from the Puppet Forge or a release archive.

                                                               list         List installed modules

                                                               search       Search the Puppet Forge for a module.

                                                               uninstall    Uninstall a puppet module.

                                                               upgrade      Upgrade a puppet module.

                                                        詳細使用方法請查看:puppet help module

                                     示例:

                                               ~]# mkdir -pv /etc/puppet/modules/nginx/{manifests,files,templates,tests,lib,spec}

                                               ~]# tree /etc/puppet/modules/

                                                        /etc/puppet/modules/

                                                        └── nginx

                                                        ├── files

                                                      │   ├── nginx_proxy.conf

                                                         │   └── nginx_web.conf

                                                         ├── lib

                                                         ├── manifests

                                                          │   └── init.pp

                                                          ├── spec

                                                          ├── templates

                                                          │   └── nginx.conf.erb

                                                         └── tests

                                               ~]# cd /etc/puppet/modules/nginx/

                                               ~]# cat manifests/init.pp

                                                        class nginx {

                                                                 $services = $operatingsystemmajrelease ? {

                                                                           /(?i-mx:6)/ => 'service nginx reload',

                                                                           /(?i-mx:7)/ => 'systemctl reload nginx.service',

                                                                 }

                                                                 package {'nginx':

                                                                           ensure => latest,

                                                                 } ->

          

                                                                 service {'nginx':

                                                                           enable => true,

                                                                           ensure => running,

                                                                           hasrestart => true,

                                                                           restart => $services,

                                                                 }

                                                        }

 

                                                        class nginx::webserver inherits nginx {

                                                                 file {'/etc/nginx/nginx.conf':

                                                                           #source => '/etc/puppet/modules/nginx/files/nginx_web.conf',

                                                                           source => 'puppet:///modules/nginx/nginx_web.conf',

                                                                           ensure => file,

                                                                          notify => Service['nginx'],

                                                                 }

                                                        }

                                                        class nginx::proxy inherits nginx {

                                                                 file {'/etc/nginx/nginx.conf':

                                                                           content =>template('nginx/nginx.conf.erb'),

                                                                           ensure => file,

                                                                           notify => Service['nginx'],

                                                                 }

                                                        }

                                               ~]# puppet apply -v -e 'include nginx::webserver'

                                                        指定要應用的的類;

 

 

      注:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪

相關文章
相關標籤/搜索