推薦-運維學習筆記-Puppet應用配置的工作原理

背景知識


Puppet的核心功能是配置管理。一般來說,用戶在master上集中做配置,同時,被管理節點上的agent會定期從master上下載配置數據,再應用(apply)到本地,從而使管理節點的狀態(用戶,組,文件,安裝包,服務等的設置和運行狀態)與masters上定義的保持一致。

有時,出于測試的目的,并不希望真的應用配置,那么就需要執行puppet agent –test –noop讓agent運行在dry-run狀態

觸發條件


在無master模式下(masterless),可以運行puppet agent apply <manifest文件路徑> 命令直接加載本地manifest,并應用到本地。這種方式一般只用于測試,生產環境大都使用agent/master模式。

在agent/master模式下,agent默認每30分鐘自動觸發一次。也就是說在master上做的任何更改可能要過30分鐘才能在agent端生效。如果你想改變這個時間間隔,可以通過在agent上修改puppet.conf的runinterval屬性

    [agent]  
   runinterval=10         #修改為每10分鐘運行一次

 或者使用splay屬性

    [agent]  
   splay=true              #默認是false。設置為true之后,運行間間隔變為隨機數。當agent很多時,可以一定程度降低master的負載
   splaylimit = 20m     #間隔最長是20分鐘,也可以設置成秒,分,小時,天,年

在agent/master模式下,還可以從master上運行puppet kick命令主動觸發。為了使用這個功能,需要做以下配置。

1  在agent的puppet.conf中打開listen屬性或者運行puppet agent –listen,然后agent就會在8139端口監聽master發過來的指令。

    [agent]  
   listen = true         #agent會監聽本地8139端口,需重啟服務

注意:如果agent節點有防火墻,打開8139端口

2  然后在master上運行puppet agent <agent節點FQDN>觸發一次新的配置應用。


工作流程


flow.jpg

1. agent向master發起連接,并使用SSL證書相互認證身份。如果agent是第一次連接master,agent會生成私鑰,下載CA證書的副本,提交證書申請,然后等待一個超時(waitforcert)。如果master在這個時間內簽發了agent的證書,agent會下載證書,繼續后面步驟。

2. 如果pluginsync是true,agent從master下載plugin

3. agent向master請求catalog,同時向master發送fact(軟件及硬件信息,比如hostname, ip).然后等待catalog生成。

4. master使用site.pp(4的左側部分)或者ENC(4的右側部分)進行節點分類,獲取agent節點所需的配置。然后使用一些agent/master提供的變量,比如facts,environement還有內部變量,編譯相關manifest生成catalog

5. agent從master下載catalog,然后應用到本地。

6. 如果catalog中使用了mount point,比如"source=>"puppet:///abc",agent會在應用過程中訪問master的相關URI(/file_metadata/和/file_content/)下載文件內容并應用到本地

7. agent將應用結果生成report,發送給master

8. 結束本次應用,agent等待下一次。

注意:在以上agent/master的通訊過程中,都是agent主動調用master上暴露出來的RESTful API并將數據“拉”到本地,master并不主動向agent發送任信息。

下面我們來看看上邊步驟中涉及到的各種功能和配置

SSL證書及認證


證書相關的屬性可以在agent/master的puppet.conf里配置

[main]  
ssldir=/var/lib/puppet/ssl                    #設置存儲所有SSL證書及相關文件的目錄
[agent]              
#以下為可選配置。不設置會使用默認值
certname=mycert.example.com         #agent節點的證書名稱,默認是節點FQDN.等同于puppet agent --certname mycert.example.com。master會用這個值來做節點分類
waitforcert=300s                               #默認值120秒。這個例子中,如果master沒有為當前節點簽發的證書,agent等待300秒再檢查。等同于puppet agent --waitforcert 300.

注意:agent需要對master URI(/certificate/,/certificate/ca和/certificate_request)有相應權限,以讀取CA證書,提交證書申請和下載簽發的證書。權限設置在auth.conf中。 默認是所有agent對這些URI都有權限。

證書及相關文件存在下面的目錄中(在線文檔

/var/lib/puppet/ssl                    #存儲所有SSL證書相關文件,在puppet.conf中定義為$ssldir 
├── ca                                    #CA證書目錄,只存在于master上  
│   ├── ca_crl.pem                 #被CA取消(revoke)的證書
│   ├── ca_crt.pem                 #CA證書
│   ├── ca_key.pem                #CA證書私鑰
│   ├── inventory.txt                #所有CA證書簽過的證書的列表
│   ├── private
│   │   └── ca.pass                 #保護CA證書私鑰的密碼
│   ├── requests                     #存儲所有master收到的但還未簽署的agent的證書
│   ├── serial                          #下一個被簽證書的序列號
│   └── signed                        #存儲所有的已簽證書,包含master和所有agent的證書
│       ├── agent.pem        
│       └── master.pem
├── certificate_requests          #當前節點所生成的證書申請,包括已提交和簽發的
├── certs                                 #當前節點所有可見的已經簽發的證書
│   ├── ca.pem                       #CA證書的拷貝  
│   └── master.pem                 #當前節點的已經被簽證書
├── private                        
├── private_keys                    #當前節點的私鑰
│   └── master.pem
└── public_keys                     #當前節點公鑰
   └── master.pem

也可以通過下面的命令查看/簽發/撤銷/清除證書,細節請看在線文檔

puppet cert list                                         #顯示等待簽署的證書
puppet cert list -a                                     #顯示所有的證書, 結果中+開始的行表示已經簽發(sign)的證書,-的行表示已經撤銷(revoke)的證書,沒有+/-的行是已經提交申請,等待被簽發的證書
puppet cert sign -a|<hostname>              #簽署所有的或者特定節點的證書
puppet cert clean -a|<hostname>            #物理上刪除該證書所有文件。沒有證書,agent會連接master失敗
puppet cert revoke -a|<hostname>         #撤銷證書。Pupet將證數加入ca_crl.pem,但是不刪除物理文件。效果與clean相同,導致agent連接master失敗  
puppet config print ssldir --section agent        #顯示ssldir的值

如果證書被意外清除或者撤銷,可以重新生成,細節請看在線文檔

1 在master上清除證書記錄和相關物理文件

puppet cert clean <certname>

2 停止agent進程,例如

puppet resource service puppet ensure=stopped

3 在agent節點上找到證書目錄(默認是/var/lib/puppet/ssl)

puppet config print ssldir --section agent

4 在agent節點上手工刪除$ssldir目錄

5 在agent節點重新啟動agent,這一過程會自動提交證書申請

puppet resource service pe-puppet ensure=running

6 在master上簽署證書

puppet cert list 
puppet cert sign <certname>

如果有很多管理節點,也可以使用autosign來自動簽發證書,細節請看在線文檔

1 在master上修改puppet.conf

[main] 
autosign=true  #允許autosign

2 在master上修改/etc/puppet/autosign.conf,創建白名單

*.scratch.example.com   #master自動簽發名字(certname)以scratch.example.com結束的證書

Plugin(在線文檔


plugin可以讓用戶擴展或者自定義的一些功能,比如fact,resource type,provider。plugin用Ruby編寫,隨module保存和發布,可供同一module中其他代碼調用。

在agent端的puppet.conf中,當pluginsync=true 的時候,agent會在每次檢查時自動下載master上的所有plugin。

[agent] 
pluginsync=true       #從3.0,默認打開

注意:agent需要對master URI(/file_metadata和/file_content)有讀權限,以下載plugin文件。權限設置在auth.conf中。默認是所有agent對這些URI都有所需權限。

plugin的目錄結構如下

{modulepath}
└── {module}
   └── lib                                               #plugin目錄
        |── augeas
        │   └── lenses        
       ├── facter                                     #plugin提供的額外fact
       └── puppet                                        
           ├── parser                                #plugin指定parser的行為
           │   └── functions
           ├── provider                              #plugin指定provider的對各resource type的行為          
            |   ├── exec                
            |   ├── package
            |   └── etc... (any resource type)
           └── type                                     #plugin提供的額外類型

Facts在線文檔


facts是指節點上的一系列系統信息,比如hostname, IP。這些信息可以被manifest或者template使用,用來做系統相關的判斷或配置。

使用facts一個途徑是安裝facter包,可以通過系統的包管理器軟件安裝,比如在Redhat Linux上, 運行"yum install facter"。此外,也可以通過plugin創建定制的facts

如果想了解facter可以返回哪些facts,運行"facter -p" 或者參考在線文檔

在Puppet語言中,facts是處于top-scope,可以被所有manifest使用

內置變量(在線文檔


agent提供的變量

$clientcert - agent                 #節點證書名。默認是節點FQDN(等于變量$::fqdn)。與puppet.conf中的certname一致
$clientversion                       #agent 版本
$environment                       #environment值

master提供的變量

$servername,                      #master的FQDN
$serverip                             #master的IP
$serverversion                    #master 版本
$settings::<name>              #master的puppet.conf中的所有設置
$environment                      #environment值

在Puppet語言中,這些變量都是是處于top-scope,可以被所有manifest使用

Environment


Puppet可以同時管理多個相互隔離的環境,比如production, testing, development,并為它們提供不同的配置。這個功能可以通過定義environment來實現。

注意:Puppet默認運行在production environment中,不需要特別設置。

最新的Puppet版本中使用directory environment,也就是為每個environment設置不同的目錄將他們的manifest文件隔離開。

1  在master的puppet.conf里進行以下設置,細節請看在線文檔

[main]
environmentpath = /etc/puppet/environments            #所有environment在master上的父目錄
#以下為可選配置。不設置會使用默認值
basemodulepath = /etc/puppet/modules                  #所有environment都可以訪問的module,用于放置所有environment共享的module
default_manifest = ./manifests                                 #定義manifest路徑,默認值./manifests 是指使用當前environment下的manifests目錄。如果設置為絕對路徑,就意味著所有environment都使用同一個manifests目錄
disable_per_environment_manifest=false                #每個enviornment是否使用自己的的manifest子目錄。默認是false,如果設置為true, 所有environment是共享同一個manifest目錄,同時default_manifest必須是絕對路徑

2  在master上為每個environment創建目錄,細節請看在線文檔

$environmentpath
   |── {environment name}                                  #環境名,比如testing或者其他名字
     |── manifests                                                 #當前環境中的所有manifest的父目錄
     |    |── site.pp                                                 #當前環境中的site.pp
     |── modules                                                   #當前環境中的所有module的父目錄
     |    |── {module name}                                   #當前環境中的module
     |── environment.conf                                     #environment配置文件,默認不創建。如果當前environment需要使用與puppet.conf中不同的設置,可以在environment.conf中進行設置??稍O置項包括modulepath, manifest, config_version,environment_timeout

3  在agent的puppet.conf里設置

[agent]
environment=<environment name>                        #說明agent要獲取哪個environment的中的配置。等同于puppet agent --environment <environment name>。 如果這個environment在master上不存在,agent將無法獲取catalog。

4 重新啟動agent

節點分類(node classification)


生成catalog的第一步是必須找到agent節點的配置里使用了哪些class和resource。這個過程稱為節點分類(node classification)。

默認的方式使用site.pp中的靜態配置,其默認路徑是/etc/puppet/manifests/. 如果environment被設置了,請查看enviornment相關設置來確定site.pp位置

node 'web01' , 'web02' , 'web03' {   #節點名稱,可以是一個或者多個名字,也可以是表達式,比如 node /^www\d+$/ { ... }
 include apache                             #節點中聲明的class
}

另一種方式是使用ENC(External Node classifier)。這種方式提供一個外部的數據源來存儲節點定義,例如PuppetDashBoardThe Foreman and PuppetEnterprise。同時,它會提供一個程序。master可以調用這個程序并輸入節點FQDN名作為參數,然后這個程序會返回一個YAML格式的文件,其中包含節點需要使用的class和resource。這個程序可以是由任何語言編寫。

使用這個功能,需要在master的puppet.conf里進行配置

[master]
node_terminus = exec                                        #使用ENC
external_nodes = /etc/puppet/node.rb               #外部程序路徑。

Catalog


每個catalog就是一個節點的所有配置信息的集合,包含這個節點所分配的所有class, resource,file等等。catalog由master編譯manifest而成,并由agent在目標節點上應用。

catalog本身是一個JSON格式的文件,在agent上保存在/var/lib/puppet/client_data/catalog/$certname.json

在master上,manifest以module的方式組織保存,其目錄結構如下。詳情請見在線文檔

$modulepath                                    #module總目錄,可以由puppet.conf中的modulepath指定
    ├── {module name}                   #某個module的目錄,以module名命名
          ├── manifests                      #manifests目錄
          │       └── init.pass              #module自加載的起始文件,包含一個與module同名的class
          ├── files                              #靜態文件。source => "puppet:///modules/<module name>/<file name>" 就是指向這個目錄
          ├── templates                     #template文件。content=>template ("<module name>/<template file name>" ) 就是指向這個目錄
          ├── lib                                 #plugin目錄
          ├── spec                             #plugin文檔
          ├── tests                            #manifest文檔

Mount Point


在使用file resource的source屬性時,需要指定源文件的路徑。這個源文件所在目錄就是mount point。

如果源文件不在module的files子目錄下,就需要手工配置

1 在master的fileserver.conf設置mount point,具體設置請看在線文檔

[mydir]                                    #mount point名稱
path /tmp/mydir                      #對應的master上的物理目錄
allow *                                    #節點級ACL。這個例子中,允許任何節點訪問,也可以使用allow_ip/deny/deny_ip進行其他設置

2  如果想進行更小粒度的ACL控制,需要在master上設置auth.conf。具體設置請看在線文檔

path ~ ^/file_(metadata|content)/mydir/                          #mount point的URI, agent通過這個URI將文件“拉”到本地
auth yes                                                                        #必須進行證書認證
method find                                                                   #允許讀
allow mynode.example.com                                           #允許mynode.example.com訪問

3  因為master一般是以puppet用戶運行,所以puppet用戶對/tmp/mydir必須至少有讀權限,可以用Linux命令chmod或者chown來設置。


原創文章,作者:MVP,如若轉載,請注明出處:http://www.www58058.com/17052

(1)
MVPMVP
上一篇 2016-06-01
下一篇 2016-06-01

相關推薦

  • N22-第六周作業

    請詳細總結vim編輯器的使用并完成以下練習題 單詞間跳轉 w:下一個單詞的詞首 e:當前或后一個單詞的詞尾 b:當前或前一個單詞的詞首 行首行尾跳轉: ^:跳轉至行首的第一個非空白字符 0:跳轉至行首 $: 跳轉至行尾 句間跳轉: ) ( 段落跳轉: } { 字符編輯 x:刪除光標所在處的字符 #x:刪除光標所在處起始的#個字符 xp:交換光標所在處的字符與…

    Linux干貨 2016-09-26
  • CentOS軟RAID實現配置

     實現軟raid1、fdisk t fd //修改磁盤分區類型fd2、創建raid設備     創建一個RAID5,5塊兒硬盤4塊做RAID,1塊兒做空閑硬盤(頂替硬盤使用)    mdadm -C /dev/md0 -a yes -l 5  -n …

    Linux干貨 2016-08-30
  • awk應用和systemd

    一:練習 1、求每班總成績和平均成績 name class score wang   1    100 zhang  2    90 li     1    80 2、為編譯安裝的httpd服務,實現service unit文件 3、破解centos7 口令 …

    Linux干貨 2016-09-22
  • OpenSSH的應用和利用OpenSSL創建私有CA簽證給httpd服務器開起https

    一、OpenSSH     OpenSSH與SSH協議是遠程登錄的首選連接工具。它加密所有流量,以消除竊聽,連接劫持和其它攻擊。OpenSSH常常被誤認以為與OpenSSL有關系,但實際上這兩個項目的有不同的目的,不同的發展團隊,名稱相近只是因為兩者有同樣的軟件發展目標──提供開放源代碼的加密通訊軟件。  &…

    Linux干貨 2016-04-24
  • 系統管理之系統啟動及內核編譯

    CentOS 5和6的啟動流程服務管理Grub管理自制Linux啟動排錯編譯安裝內核 系統啟動流程:  POST –> 讀取BootSequence (BIOS),決定引導次序 –>讀取引導設備的Bootloader(MBR grubstage1–>stage1.5/boot…

    Linux干貨 2016-09-13
  • 探究PHP底層

    1、PHP是什么? PHP 指的是我們從外面看到的一套完整的系統。這聽起來有點糊涂,但其實并不復雜(PHP4 內部結構圖)。從功能上來分:我們可以分為三部分: 1、 解釋器部分(Zend 以引擎),負責對輸入代碼的分析、翻譯和執行;2、 功能性部分(PHP功能函數以及擴展),負責具體實現語言的各種功能(比如它的函數等等);3、 接口部分(SAPI),負責同 …

    Linux干貨 2015-04-10

評論列表(2條)

  • stanley
    stanley 2016-06-01 15:38

    寫的非常不錯。贊

  • MVP
    MVP 2016-06-01 17:06

    呵呵,puppet kick有個地方寫錯了,再第2步里面,不是“puppet agent ”,而應該是“ puppet kick ”,細節請大家看”puppet help kick”或者是在線文檔吧,請多包涵

欧美性久久久久