上次在1.0 中爲大家介紹瞭如何安裝最新的Puppet 3.7 以及使用最新的nginx 1.6 來替換默認的Webrick來實現高性能的HTTP服務...
本次繼續來介紹Puppet Agent和Master的詳細通訊和同步的執行流程...
1. 證書驗證過程...
ssl的證書都保存在..在Agent進行查看
[root@agent1 ~]# puppet config print ssldir /var/lib/puppet/ssl
a) 首先查看本地是否存在私鑰證書...
#如果存在刪除 rm -rf /var/lib/puppet/ssl [root@agent1 ~]# ls /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem ls: cannot access /var/lib/puppet/ssl/private_keys/agent1.dbsa.cn.pem: No such file or directory #如果證書不存在,通過下面命令創建一個... puppet cert generate $HOSTNAME #然後僅保留公鑰和私鑰,其他的刪掉. rm -rf /var/lib/puppet/ssl/ca/ rm -rf /var/lib/puppet/ssl/certs/$HOSTNAME.pem
b) 從Server下載ca..
curl -sk https://master.dbsa.cn:8140/production/certificate/ca > /var/lib/puppet/ssl/certs/ca.pem
c) 查看$ssldir/certs/<name>.pem 是否存在...
#如果是剛通過puppet cert generate 創建的證書,這個文件肯定存在. #但是通過上面的命令刪掉後,就不存在了.. [root@agent1 ssl]# ll /var/lib/puppet/ssl/certs/$HOSTNAME.pem ls: cannot access /var/lib/puppet/ssl/certs/agent1.dbsa.cn.pem: No such file or directory
d) 通過Server獲取$ssldir/certs/<name>.pem
#如果可以查詢到,說明證書已經被簽署過... curl -sk https://master.dbsa.cn:8140/production/certificate/$HOSTNAME #如果上面的命令能查詢到,執行下面的命令把簽署過的證書保存下來... curl -sk https://master.dbsa.cn:8140/production/certificate/$HOSTNAME > /var/lib/puppet/ssl/certs/$HOSTNAME.pem #如果通過上面的命令無法獲取證書...可能是在Puppet端沒有對證書進行過簽名.. #可以通過下面的命令查詢未簽名的證書...,如果查詢到證書,說明證書爲簽署,下次會在進行重試... curl -sk https://master.dbsa.cn:8140/production/certificate_request/$HOSTNAME #如果上面的命令也無法獲取證書,那就是Agent沒有向Master發起過證書籤名的請求 #通過下面的命令創建請求的csr文件,然後發送請求..... openssl req -new -key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem -subj "/CN=$HOSTNAME" -out /var/lib/puppet/ssl/certificate_requests/$HOSTNAME.pem -sha256 curl -k -H"Content-Type: text/plain" -X PUT https://master.dbsa.cn:8140/production/certificate_request/$HOSTNAME --data-binary @/var/lib/puppet/ssl/certificate_requests/$HOSTNAME.pem
e) 通過私鑰和ca簽署過的證書抓取crl.pem
#crl主要是驗證證書的有效性,撤銷的證書等.. curl -sk https://master.dbsa.cn:8140/production/certificate_revocation_list/ca --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem > /var/lib/puppet/ssl/crl.pem
2. 獲取主機信息...
在Puppet中Agent和Master都是通過RESTful的HTTPS API進行通信。
Agent通過私鑰將數據加密,發送給Server.
Server通過Agent簽署的csr證書,解密數據,並加密數據發回給Agent
Agent收到數據後用私鑰解開.
並且通過crl來驗證證書的有效性
a) 在證書驗證完畢後,開始獲取該Agent在Server中的對象信息..
curl -sk --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem https://master.dbsa.cn:8140/production/node/$HOSTNAME #返回的json數據結構爲 [root@agent1 ~]# ruby aa.rb {"data"=> {"environment"=>"production", "name"=>"agent1.dbsa.cn", "parameters"=> { key => value #facter的信息 }}, "document_type"=>"Node" }
b) 抓取plugin的元數據..
curl -sk --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem "https://master.dbsa.cn:8140/production/file_metadatas/plugins?recurse=true&links=manage" #返回的json數據結構爲一個列表,每個資源都是一個Puppet libs目錄中的一個文件.. [{"metadata"=>{"api_version"=>1}, "document_type"=>"FileMetadata", "data"=> {"mode"=>420, "links"=>"manage", "type"=>"file", "path"=>"/etc/puppet/modules/base/lib", "destination"=>nil, "relative_path"=>"facts/aa.rb", "group"=>0, "checksum"=> {"type"=>"md5", "value"=>"{md5}d41d8cd98f00b204e9800998ecf8427e"}, "owner"=>0}},{},{},{}] #在繼續對json進行迭代抓取所有的文件,保持到本地.. curl -k --key /var/lib/puppet/ssl/private_keys/agent1.dbsa.cn.pem --cert /var/lib/puppet/ssl/certs/agent1.dbsa.cn.pem https://master.dbsa.cn:8140/production/file_content/plugins/facts/aa.rb > /var/lib/puppet/lib/facts/aa.rb
c) 通過所有facter獲取數據,並提交Server。
#然後將本地facter獲取的數據以json的方式post到server的這個位置.. https://master.dbsa.cn:8140/production/catalog/$HOSTNAME #提交後會返回一個catalog。
3. 編譯catalog
#在base模塊中添加一個文件資源.. modules/base/manifests/init.pp file { "/tmp/test.txt": owner => root, group => root, mode => 644, source => "puppet:///base/test.txt"; } #在fileserver.conf中,給予文件掛載點訪問的權限 /etc/puppet/fileserver.conf [base] path /etc/puppet/modules/base/files allow *
a) 標準編譯
循環文件源數據,如果有變化抓回到本地...
curl -sk --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem "https://master.dbsa.cn:8140/production/file_metadata/base/test.txt?links=manage&source_permissions=use" #獲取文件的md5如果發生變化,抓回到本地.. curl -sk --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem "https://master.dbsa.cn:8140/production/file_content/base/test.txt"
b) 靜態編譯
配置Server啓用靜態編譯,所有文件的源數據會嵌入到catalog中...
#配置Server的puppet.conf catalog_terminus = static_compiler #配置/etc/puppet/manifests/site.pp filebucket { puppet: path => false, } #然後重啓server端的web進程
循環所有文件的源數據
#如果文件不一致~..直接通過md5抓取文件. curl -sk --key /var/lib/puppet/ssl/private_keys/$HOSTNAME.pem --cert /var/lib/puppet/ssl/certs/$HOSTNAME.pem "https://master.dbsa.cn:8140/production/file_bucket_file/md5/60b725f10c9c85c70d97880dfe8191b3"
4. Agent執行完成,發送報告
發送報告到Server..
通過PUT的方式將報告發送到 /report/<node>