上次在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>