背景知識
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>觸發一次新的配置應用。
工作流程
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發送任信息。
下面我們來看看上邊步驟中涉及到的各種功能和配置
證書相關的屬性可以在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使用
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
生成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)。這種方式提供一個外部的數據源來存儲節點定義,例如PuppetDashBoard, The Foreman and PuppetEnterprise。同時,它會提供一個程序。master可以調用這個程序并輸入節點FQDN名作為參數,然后這個程序會返回一個YAML格式的文件,其中包含節點需要使用的class和resource。這個程序可以是由任何語言編寫。
使用這個功能,需要在master的puppet.conf里進行配置
[master]
node_terminus = exec #使用ENC
external_nodes = /etc/puppet/node.rb #外部程序路徑。
每個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文檔
在使用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
寫的非常不錯。贊
呵呵,puppet kick有個地方寫錯了,再第2步里面,不是“puppet agent ”,而應該是“ puppet kick ”,細節請大家看”puppet help kick”或者是在線文檔吧,請多包涵