puppet

puppet簡介

    puppet採用C/S星狀的結構,全部的客戶端和一個或幾個服務器交互。每一個客戶端週期的(默認半個小時)向服務器發送請求,得到其最新的配置信息,保證和該配置信息同步。每一個puppet客戶端每半小時(能夠設置)鏈接一次服務器端, 下載最新的配置文件,而且嚴格按照配置文件來配置客戶端. 配置完成之後,puppet客戶端能夠反饋給服務器端一個消息. 若是出錯,也會給服務器端反饋一個消息.html

    ~]# puppet descript [-s|--short] [-p|--providers] [-l|--list] [-m|--meta] [type]     //使用查詢
    	-l:列出全部資源類型
    	-s:顯示指定類型的簡要幫助信息
    	-m:顯示指定類型的元參數
    
    Usage: puppet [subcommand] [options] [action] [options]	
    
      
      
      
      
    • agent
    • ca:管理本地CA
    • apply:在本地運行清單
    • catalog:查看catalog文件
    • config:交互完成puppet配置
  1. 關係元參數:before/require
    • A before B: B依賴於A
    • B require A: B依賴於A
    package {'nginx':
            name    =>      'nginx',
            ensure  =>      latest,
    #       before  =>      Service['nginx']
    
    }
    
    service {'nginx':
            name    =>      'nginx',
            enable  =>      true,
            require =>      Package['nginx']
    
    }
    須要事先定義package資源,並且該資源必須是服務所依賴的資源,在表示須要依賴上面的package才能運行service.

    在引用時,資源的首字母必須大寫,如:java

    Type['title']   如  Service['nginx']
    

  2. notify和subscribe:都是觸發的意思
  3. file {'/tmp/test':
            name    => '/tmp/test',
            ensure  => file,
            content => 'Hello World',
    #	notify	=> Exec['monitor']
    
    }
    
    exec {'monitor':
            name    => 'monitor',
            command => 'echo "/tmp/test has changed" >> /tmp/change',
            subscribe => File['/tmp/test'],
    
            refreshonly => true,
    
            path    => '/bin:/sbin:/usr/bin'
    }
    
    每一次應用都會觸發Exec['monitor']此處不寫refresh,其也是能夠執行的file每被應用一次,其就會往monitor中寫入相應的文件。若加入此句refreshonly=true,其會只在file資源改變時寫入內容(觸發exec)
  4. 資源的狀態鏈依賴定義:
  5. package {'nginx':
            name    => 'nginx',
            ensure  => latest,
    } -> 
    
    file {'/etc/nginx/nginx.conf':
            path    => '/etc/nginx/nginx.conf',
            source  => '/root/puppet/nginx.conf',
    } ->
    
    service {'nginx':
            ensure  => true,
            enable  => true,
    }
    
    Package['nginx'] -> File['/etc/nginx/nginx.conf'] ~> Service['nginx']
    
    
    
    ->:用於定義次序鏈,即nginx安裝以後纔會處理配置文件~>:用戶定義通知鏈,配置文件處理好了以後會通知服務也能夠在定義資源時直接定義
    1. 參數簡介:
      1. group:Manager groups
        • name:組名
        • gid:GID
        • ensure:目標狀態,present/absent
        • system:是否爲系統組
        • members:成員用戶

      2. user:Manager user
        • name:用戶名
        • uid,gid,comment,expiry,shell,system,home
        • ensure:present/absent
        • password:加密後的密碼串
        • 可用今生成密碼:openssl passwd -1 -salt `openssl rand -hex 4`node

        group {'mysqll':
                ensure  => present,
                gid     => 1200,
        } ->
        
        user {'ming':
                name    => "ming",
                ensure  => present,
                uid     => 1200,
                groups  => 'mysqll',
                home    => "/home/dai",
                password => '$1$ce1a71ce$c05P/h2f9bwImXX0WILlU0',
                shell   => "/bin/bash",
                comment => "You is my creat",
        }
        

      3. package:
        • provider:rpm,yum
        • ensure:installed,present,latest,absent,purged
        • name:包名
        • source:程序包來源,僅對不會自動下載相關程序包的provider有用,例如rpm或dpkg
        package { 'nginx':
                provider => yum,
                name    => 'nginx',
                ensure => latest
        }
        

      4. service
        • ensure:true或false表示啓動或關閉
        • enable:true或false是否開機自動啓動或不自啓動
        • path:腳本的搜索路徑,默認爲/etc/init.d/
        • restart:一般用於定義reload
        • hasrestart:true,false,服務腳本是否支持restart參數
        • hasstatus:屬性

      5. file
        • ensure:
          • file:類型爲普通文件,其內容由content屬性生成或複製由source屬性指向的文件路徑來建立
          • link:類型爲連接,必須由target屬性指明其連接的目標文件
          • directory:類型爲目錄,可經過source指向的路徑複製生成,recurse屬性指明是否遞歸複製
        • path:文件路徑
        • source:源文件
        • content:文件內容,content => template('')
        • target:符號連接的目標文件,當ensure爲link時,target表示path指向的文件是一個符號鏈接文件,其目標爲些target屬性所指向的路徑,此時content和source屬性自動失效
        • owner,grouop,mode,atime,ctime,mtime
        file {'/test':
                ensure  => file,
                content => "This is test",
                owner   => 'ming',
                group   => 'mysqll',
                mode    => 777,
        }
        
        file {'/directory':
                ensure  => directory,
        }
        
        file {'/test.link':
                ensure  => link,
                target  => '/test'
        }
        
        
        file {
            "jdk-8u25-linux-x64.rpm":
             ensure  => file,
             path    => '/tmp/jdk-8u25-linux-x64.rpm',
             source  => 'puppet:///modules/jdk8/jdk-8u25-linux-x64.rpm';
            "java.sh":
             ensure => file,
             path    => '/etc/profile.d/java.sh',
             source  => 'puppet:///modules/jdk8/java.sh';
             }
        
        
        建立文件建立目錄建立連接可傳送多個文件,可分開定義,但最後一個條件得是;結尾

      6. exec:
        • command:要運行的命令
        • creates:文件路徑,僅此路徑表示的文件不存在時,command方纔執行
        • user/group:運行命令的用戶身份
        • cwd:指定在哪一個目錄運行命令,若是此目錄不存在則運行失敗。
        • path:命令path的路徑,相似於PATH環境變量
        • onlyif:此屬性指定一個命令,此命令正常(退出碼爲0)運行時,當前command纔會運行
        • unless:此屬性指定一個命令,此命令非正常退出(退出碼爲非0)運行時,當前command纔會運行
        • refresh:從新執行當前command的替代命令
        • refreshonly:僅接收到訂閱的資源的通知時方纔運行
        • environment:命令運行時的環境變量,能夠直接定義一個path
        exec {'clean log':
                command => "/bin/bash cleanning.sh",
        
                cwd     => "/usr/local/cripts",
        
                provider => shell,
                logoutput => true,
        
                onlyif  => "/usr/bin/test `du /var/log/message | cut -f1 -gt 102400`"
        
        }
        執行命令的內容指定命令在哪一個目錄下執行爲true時,表示無論命令執行成功與否都輸出日誌onlyif參數控制了命令執行的條件,如上只有當message文件大小超過100M時,才執行command的參數指定的cleanning.sh腳本

        未添加控制參數的exec資源將變得很是危險,由於它會在客戶端每次從服務端更新資源時被執行。須要交互的命令一搬都不能執行成功mysql


      7. cron:計劃任務
        • command:要執行的任務
        • ensure:present/absent
        • hour,minute,monthday,month,weekday
        • user,以哪一個用戶的身份運行命令
        • target:添加爲個哪一個用戶的任務
        • name: corn job的名稱
        cron{'timesync':
        	command => '/usr/sbin/ntpdate 10.1.0.1 &> /dev/null',
        	ensure  => present,
        	minute  => '*/3',
        	user    => 'root',
        }		
        

      8. notify:
      9. sends an arbitrary message to the agent run-time log.
        • message:信息內容
        • name:信息名稱

      10. puppet variable:
      11. $variable_name=value:引用變量時能夠直接 使用或者使用雙引號linux

        做用域:nginx

        • 僅能隔離:變量,資源的默認屬性
        • 不能隔離:資源的名稱,及引用

        引用路徑:web

        • 相對路徑:$name
        • 絕對路徑:$::scope::scope:variable

        變量的賦值符號:正則表達式

        • =
        • +=
        數據類型:
        • 字符型:引號無關緊要,但單引號爲強引用,雙引號爲弱引用
        • 數值型:默認均識別爲字符串,僅在數值上下文才以數值對待
        • 數組:[]中以逗號分隔元素列表,從0開始,也能夠用下標爲-1,-2..意思是從右邊開始的第一個,第二個
        • 布爾型值:true,false不能加引號
        • hash:{}中以逗號分隔k/v數據列表:鍵爲字符型,值爲任意puppet支持的類型,訪問hash類型的數據元素要使用「鍵」當作索引進行:
        • { 'mon' => 'Monday', 'tue' => 'Tuesday'};
        • undef:未定義
        正則表達式: OPTIONS:
        • i:忽略字符大小寫
        • m:把.當換行符
        • x:忽略 中的空白字符
        • (?i-mx:PATTERN),不能賦值給變量,僅能用在接受=~或!~操做符的位置。-mx就是表示不使用m和xsql

      12. 流程控制語句:
        1. if語句:
        2. if CONDITION {
          	....
          } else {
          	....
          }
          
          
          
          ex:
          
          if $osfamily =~ /(?i-mx:(debian|ubuntu))/ {
          	$webserver = 'apache2'
          } else {
          	$webserver = 'httpd'
          }
          
          package {"$webserver":
                  ensure  => latest,
          }
          
          file {'httpd.conf':
                  path    => '/etc/httpd/conf/httpd.conf',
                  source  => '/root/puppet/httpd.conf',
                  ensure  => file,
                  require => Package["$webserver"],
          #       notify  => Service['httpd']
          }
          
          service {'httpd':
                  ensure  => true,
                  enable  => true,
                  restart => 'systemctl restart httpd.service',
                  subscribe => File['httpd.conf']
          }  
          
          CONDITION的給定方式:變量,比較表達式,有返回值的函數只要當配置文件發生改變時,纔會觸發重啓

        3. case語句:
        4. case CONTROL_EXPRESSION {
          	case1: { ... }
          	case2: { ... }
          	case3: { ... }
          	default: { ... }
          }
          
          
          
          
          
          ex:
          
          case $osfamily {
          	"Redhat": { $webserver='httpd' }
          	/(?i-mx:debian)/: { $webserver='apache2' }
          	default: { $webserver='httpd'}
          }
          
          CONTROL_EXPRESSION:變量,表達式,有返回值的函數各case的給定方式:直接字符串,變量,有返回值的函數,正則表達式模式,default
        5. selector語句:
        6. CONTROL_VARIABLE ? {
          	case1 => value1,
          	case2 => value2,
          	...
          	default => valueN,
          }
          
          
          
          ex:
          $pkgname = $operatingsystem ? {
          	/(?i-mx:(unbuntu|debian))/	=> 'apache2',
          	/(?i-mx:)(redhat|defora|centos))/	=> 'httpd',
          	defautl => 'httpd'
          
          }
          
          package{"$pkgname":
          	ensure	=> installed,
          }
          
          CONTROL_VARIABLE的給定方法:變量,有返回值的函數各case的給定方式:直接字符串,變量,有返回值的函數,正則表達式模式,default注意:不能使用列表格式,但能夠是其它的selector


      13. 類:
      14. 爲了實現通用目標或目的組織在一塊兒的一個或多個資源,即命名爲代碼塊shell

        • 類在某位置建立以後可在puppet全局使用
        • puppet的類能夠繼承,也能夠包含子類
        • 類的名稱只能小寫字母開頭,能夠包含小寫字母,數字和下劃線
        • 每一個類都會引入一個新的變量scope,這意味着在任什麼時候候訪問類中的變量時,都得使用其徹底限定名稱,如${nginx::params::name}

        類的分類:

        • 不帶參數的類:可經過include或資源的方式進行聲明使用
        • 帶參數的類:同一個類在不一樣的OS上可能會略有不一樣,所以須要經過獲取相應系統的fact來實現有區別對待。然而,萬一相應的OS沒有輸出類所指望的fact或者是類依賴於非fact因素時,此機制將沒法知足需求。此時就須要使用帶參數的類來完成此類功能,同時在聲明類時爲其參數傳遞相應的值便可完成功能。只能使用資源式的聲明方式

        調用方式:

        1. include CLASS_NAME1,CLASS_NAME2,...
        2. class{'CLASS_NAME': attribute => value, }

        類的聲明方式一:

        class apache2 {
                $webserver = $operatingsystem ? {
                        /(?i-mx:(centos|redhat|fedora))/        => 'httpd',
                        /(?i-mx:(ubuntu|debian))/       => 'apache2',
                        default => 'httpd'
                }
        
                package {'httpd':
                        ensure  => latest,
                        before  => File['httpd.conf']
                }
        
                file {'httpd.conf':
                        ensure  => file,
                        path    => '/etc/httpd/conf/httpd.conf',
                        source  => '/root/puppet/httpd.conf',
                        notify  => Service['httpd']
                }
        
                service {'httpd':
                        ensure  => true,
                        enable  => true,
                        restart => 'systemctl restart httpd.service',
                }
        }
        include apache2
        
        直接調用apache2類

        類的聲明方式二:

        class apache2($webserver='apache2') {
        
                package {"$webserver":
                        ensure  => latest,
                        before  => File['httpd.conf']
                }
        
                file {'httpd.conf':
                        ensure  => file,
                        path    => '/etc/httpd/conf/httpd.conf',
                        source  => '/root/puppet/httpd.conf',
                        notify  => Service['httpd']
                }
        
                service {'httpd':
                        ensure  => true,
                        enable  => true,
                        restart => 'systemctl restart httpd.service',
                }
        }
                class{'apache2':
                        webserver       => 'httpd'
                }
        
        
        沒有傳遞參數,將會使用默認httpd參數自定義實例變量結果,而且上變量得有默認值,不然不予執行

        類的繼承:

        一般將公共功能定義爲基類,須要增長的功能定義爲子類,其繼承一個已有的類,並實現覆蓋資源屬性,或向資源屬性追加額外值

        • 聲明子類時,其基類會被自動聲明
        • 基類成爲子類的父做用域,基類中的變量和屬性默認值會被子類複製一份
        • 子類能夠增長和覆蓋父類中同一資源的相同屬性
        • 在子類中爲父類的資源新增屬性或覆蓋指定的屬性的值
        • Type['title'] {
          	attribute	=> value,
          
          	...
          }
          引用並修改
        • 在子類中爲父類資源的某屬性增長新值
        • Type['title'] {
          	attribute	+> value,
          
          	...
          }
          添加新值
        class apache2($webserver='apache2') {
        #       $webserver = $operatingsystem ? {
        #               /(?i-mx:(centos|redhat|fedora))/        => 'httpd',
        #               /(?i-mx:(ubuntu|debian))/       => 'apache2',
        #               default => 'httpd'
        #       }
        
                package {"$webserver":
                        ensure  => latest,
                        before  => File['httpd.conf']
                }
                service {'httpd':
                        ensure  => true,
                        enable  => true,
                        restart => 'systemctl restart httpd.service',
                }
        }
        
        class apache2::web inherits apache2 {
        
                Service['httpd'] {
                        subscribe => File['httpd.conf']
                }
        
                file {'httpd.conf':
                        ensure  => file,
                        path    => '/etc/httpd/conf/httpd.conf',
                        source  => '/root/puppet/httpd.conf',
                        notify  => Service['httpd']
                }
        }
        
        class {'apache2':
                webserver       => 'httpd',
        }
        
        include apache2::web
        子類繼承父類的方式如上:父類::子類 inherits 父類

      15. 模板
      16. 基於ERB(擴展ruby語言)模板語言,在靜態文件中使用變量等編程元素生成適用於多中不一樣環境的文本文件(配置文件),主要用於實如今文本文件中嵌入ruby代碼,原來的文件信息不會被改變,但ruby代碼會被執行,執行結果將直接替換原來代碼

        模板代碼的添加方式:

        • <%= ruby expression %>:替換爲表達式的值
        • <% ruby expression %>:僅執行代碼,而不替換
        • <%# comment %>:文本註釋
        • <%- rubycode %>:忽略空白字符
        • <% rubycode -%>:忽略空白行
        • 還有判斷語句,請參考官方文本連接

        其它更多添加方式請參考官方文檔:

        https://docs.puppet.com/puppet/latest/lang_template_erb.html

        在模板文件中可使用變量,包括puppet的任意可用變量,但變量名需以@開頭。.erb可用可不用,在配置文件後加.erb只是爲了好分辨

        ~]# mv nginx.conf nginx.conf.erb
        ~]# vim nginx.conf.erb
        worker_processes
        
        class nginx {
                package {'nginx':
                        provider => yum,
                        ensure  => latest,
                }
        }
        
        class nginx::web inherits nginx {
                file {'nginx':
                        ensure  => file,
                        content => template('/root/puppet/nginx.conf.erb'),
        
                        path    => '/etc/nginx/nginx.conf',
                        require => Package['nginx'],
                        notify  => Service['nginx']
                }
        
                service {'nginx':
                        ensure  => true,
                        enable  => true,
                        restart => 'systemctl reload nginx.service',
                        subscribe => File['httpd.conf']
                }
        }
        include nginx::web
        <%= @processorcount %>若是定義好配置文件,使用了ERB的配置語法,文件複製不能用source,而是須要使用content參數,利用template函數生成對應的配置文件,此爲固定格式用法(將使用template函數生成文本內容,再導入至對應的配置文件)

      17. 模塊目錄:
        • ~]# tree /nginx/
          /nginx/
          ├── files
          ├── lib
          ├── manifests
          │   └── init.pp
          ├── spec
          ├── tempaltes
          │   └── nginx.conf.erb
          └── tests
          
        • /etc/puppet/modules/:模塊存放的默認路徑,在此目錄下創建相應的模塊目錄便可
        • modue_name:模塊名稱
        • manifests:資源清單目錄
        • init.pp:默認的資源定義文件,此文件必須存在
        • files:靜態配置文件存放路徑
        • puppet URL: puppet:///modules/MODULE_NAME/FILE_NAME

        • templates:erb模塊配置文件存放路徑,其文件結束後綴爲.erb
        • lib:插件目錄
        • tests:當前模塊的使用幫助文件及示例文件
        • spec:相似於tests目錄,存儲lib目錄下定義的插件的使用幫助和示例文件

        模塊管理工具

        • puppet help module:獲取puppet module的幫助信息
        • USAGE: puppet module <action> [--environment production ]
        • install:到puppet forge中心去安裝
        • list:查看已安裝的模塊
        • search:到forge中心搜索模塊
        • uninstall:卸載模塊
        • upgrade:更新模塊

        注意:puppet3.8之後的版本中,資源清單文件名要與文件類名保持一致,例如某子類名爲「nginx::web」,其文件名應該爲web.pp。不在支持 import

        ~]# puppet apply -d -v -e 'include classes' --noop array
        此處的-e後得是模塊名,也就是在/etc/puppet/modules/下的模塊名
        

      18. Master/Agent模式
        1. master/agent工做原理:
        2. master/agent強依賴於DNS服務(證書籤署是對FQDN作證書頒發的),由master端定義好功能模塊,再到/etc/puppet/manifests/定義site.pp文件,定義站點所須要的資源。master端經過自建CA並簽發證書給各站點,使用證書驗證客戶端的身份,當站點發出請求時Master端將查找site.pp文件中定義的資源,編譯成catalog,發送給客戶端。 agent默認每隔30分鐘向Master發送node_name和facts,並請求catalog,在本地執行catalog代碼。master(監聽8140端口)與agent(監聽在8139)兩者之間基於https協議通訊,其遠程過程調用方式爲xmlrpc機制。

        3. 安裝軟件包:
          • master:yum install puppet puppet-server facter
          • agent:yum install puppet facter
        4. /etc/puppet/puppet.conf配置文件
          • [main]:應用於server端和agent端,都會生效
          • [agent]:應用於agent端生效
        5. puppet cert命令,證書管理工具
          • Usage: puppet cert <action> [-h | --help]
          • clean node_name:清除node_name節點的證書
          • list:查看未簽署的證書請求
          • list -all:查看全部證書
          • sign "node_name":對node_name簽署證書
          • sign -all:簽署全部請求
          • verify:檢驗

        6. 在puppet-sever主機查看初始化過程並瞭解工做過程
        7. 
          Info: Creating a new SSL key for ca   
          Info: Creating a new SSL certificate request for ca 
          ...
          Notice: Signed certificate request for ca
          Info: Creating a new certificate revocation list 
          Info: Creating a new SSL key for localhost
          Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
          Info: Creating a new SSL certificate request for localhost
          ...
          Notice: localhost has a waiting certificate request
          Notice: Signed certificate request for localhost
          ...CertificateRequest localhost at '/var/lib/puppet/ssl/ca/requests/localhost.pem'
          ...CertificateRequest localhost at '/var/lib/puppet/ssl/certificate_requests/localhost.pem'
          Notice: Starting Puppet master version 3.6.2
          ~]# puppet master --no-daemonize -v詳細的初始化過程生成一個私鑰生成一個證書請求自簽證書生成吊銷列表

        8. 在agent端也查看第一次啓動並向master端的工做動做(puppet agent --test):
        9. 
          Info: Creating a new SSL key for node6.iofunction.com
          Info: Caching certificate for ca
          Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
          Info: Creating a new SSL certificate request for node6.iofunction.com
          ...
          
          ~]# puppet agent --server master --no-daemonize -v 引處的server用的主機名稱,主機名不會變,ip地址會變,作實驗我就直接寫在/etc/hosts文件裏的建立一個證書籤署請求發往master端,等待簽署完成的證書

        10. master/agent配置實例
        11. 一、配置master端
          ~]# puppet master --no-daemonize -v #首次之前臺模式啓動,確認無誤再運行爲後端
          ~]# systemctl start puppetmaster.service
          ~]# systemctl enable puppetserver.service
          ~]# ss -tnlp : 8140/tcp
          
          二、定義站點配置文件
          # cd /etc/puppet/manifests/
          # vim site.pp  #必須先爲站點定義好站點文件,否則agent端啓動時會報錯
          node /^centos7.pc\d+/ {
              include nginx::webserver
          }
          
          三、配置agent端(發送證書籤署請求給Master)
          # puppet agent --server=master_hostname --no-daemonize --noop --test -v #建議首次啓動時之前臺模式運行,確認OK後,再將運行爲後端
          ~]# systemctl start puppetagent.service
          
          
          四、在master端爲客戶端簽署證書
          ~]# puppet cert list #首先查看未簽署的證書列表
          ~]# puppet cert sign node_name 
              或者
          ~]# puppet cert sign -all
          
          五、以守護進程方式啓動agent
          ~]# systemctl start puppet
          
          ####必要是清除客戶端請求
          ~]# puppet cert list -all : 查看已經簽署的客戶端證書
          ~]# puppet cert clean node_name : 清除一個Node的簽署證書
          
          rm -rf /var/lib/puppet/ssl : 移除ssl證書
          
          
        12. 推送消息:
        13. ~]# puppet help kick   雖然要被棄用了,但仍是有人在用
          puppet kick [-a|--all] [-c|--class <class>] [--host <host>]
          
          
          ~]# vim /etc/puppet/puppet.conf
          [main]
          ...
          listen = true
          [agent]
          server = master 
          
          
          ~]# tail -10 /etc/puppet/auth.conf
          path /run
          method save
          auth any
          allow master.iofunction.com
          
          # deny everything else; this ACL is not strictly necessary, but
          # illustrates the default policy.
          path /
          auth any
          
          agent端:master是誰容許主像agent推送消息
        14. 建立site.pp文件
        15. site.pp文件是puppet讀取全部模塊pp文件的開始

          ~]# vim /etc/puppet/manifests/site.pp
          node /^node\d+\.iofunction\.com/ {   主機名匹配
                  include chrony, jdk8
          
          }
          類名同module名相同,方可執行
相關文章
相關標籤/搜索