puppet的master-agent模型原理
agent需要发送node name 以及各facts 到master端,所以需要占据不小的带宽
master端在收到agent请求后首先判断是哪个节点,判断完成之后去找匹配当前node的定义,找到后对比客户端发送的时候生成的catalog,然后将catalog发送给agent
master一定要去判定获取应该执行哪些内容,假如从site.pp中获取include定义大概需要三个类的话,因此master必须到它的对应的模块中,(只要类是存在的),master一定会获取这些类并将它们整合在一起进行编译成catalog,而后将编译的结果(catalog)发送至agent端
agent拿到catalog之后,就可以在本地运行
但是master端发送过来的时候,内容可能已应用过了;或者是已经发来了三个类,这些类中除了一个类,其他类全都应用过了,因此将其再次应用即可
因此在应用的时候,要先查询当前节点所关联的每一个资源的状态信息,而后强制那些没有跟对应的资源定义不一样的内容强制改变为在资源中所定义的状态并应用
应用完后则报告至master端
最终则实现我们所定义的目标状态
证书的签发
签证的时候如果存在agent向master进行申请,而master却不在线,那么则无法签署了,因此我们可以让其实现自动签署,那么自动签署则会很不安全,一般情况下,自动签署是不应该使用的,不能自动签署那就意味着我们需要现场签署,偶尔我们可能迟到签署的,但是比自动签署要安全很多
如果要想实现自动签的话
可以设置master自动签发所有的证书,我们只需要在/etc/puppet 目录下创建 autosign.conf 文件。(不需要修改 /etc/puppet/puppet.conf文件,因为我默认的autosign.conf文件的位置没有修改)
cat > /etc/puppet/autosign.conf<<EOF
*.test.com
EOF
这样就会对所有来自 test.com 的机器的请求,都自动签名。
还可以使用预签证书
在服务器端为每一个客户端生成秘钥并签署证书,然后让agent自己去复制证书
因此最好还是使用第一种方法
一般我们做一个证书的时候对方有一个主机名,因为在网络内地址会随时发生改变的,但主机名一般是固定的,这样一来带来一个问题,既然每个节点都是靠FQDN来定义,于是意味着在当前网络内每个被管理的节点都必须有FQDN 而且必须通过网络内DNS服务器解析通过才可以
大规模的网络环境中DNS服务器必不可少
agent端在master验证了来源之后,接下来一定知道agent的定义,每个agent的需求各不相同的
因此agent只会读取site.pp文件,那么我们要分门别类的去做,可以实现为每一类服务器定义一个pp文件,而后在site.pp里执行impor 即可
比如在site.pp里定义包含web.pp proxy.pp等
只要包含进来的都会被读取,而这每个文件里面的都应该是节点的定义,每个节点中无非就要声明执行哪一类的,从而master端根据客户端的请求者的名称得到认证之后,将FQDN去对比puppet的manifests下的site.pp中的node定义,当匹配了之后则将node pp中的内容进行获取
节点也可以继承,我们可以定义基本配置,让特殊节点各自在额外添加对类的支持即可
因此site.pp中可以定义一个基本类,而后在其他pp文件里去继承基本类,并且在site.pp中奖其他pp文件import即可,或者自己定义一个基本node
接下来就可以获取到各class文件了,class可能在不同的路径或者依赖不同的file文件或模板文件;那么我们如何获取这些文件:class默认都在各个模块目录中,不管当前节点有多少个模块master一定会根据需要将模块定义的各个类自动装载的,所以我们声明一个类就需要在自动装载器所装载的类中进行加载,如果某一node包含了事先并不存在的类,那么则无法执行
实现多节点管理
规划如下:
服务器角色 |
服务器IP |
Master : node3.test.com |
10.12.33.57 |
Agent : node1.test.com |
10.12.33.58 |
测试hostname无误
[root@node3 manifests]# ping node1.test.com
PING node2.test.com (10.12.33.59) 56(84) bytes of data.
64 bytes from node2.test.com (10.12.33.59): icmp_seq=1ttl=64 time=1.60 ms
将站点清单移动至其他目录
[root@node3 manifests]# pwd
/etc/puppet/manifests
[root@node3 manifests]# mv site.pp /tmp/
启动为master/agent模式
在master/agent的模式下,我们必须将其服务启动起来,安装上服务后才可以后续操作
[root@node3 manifests]# ls /etc/init.d/puppet*
/etc/init.d/puppet /etc/init.d/puppetmaster /etc/init.d/puppetqueue
我们所用到的无非就是标红的字体的脚本了
启动master
/etc/puppet/puppet.conf 默认只适用agent端,需要将其覆盖掉,因此我们需自己生成配置文件
[root@node3 puppet]# pwd
/etc/puppet
[root@node3 puppet]# puppet master --genconfig >puppet.conf
覆盖完成之后,某些内容需要更改不然无法正常工作
更改pid,一般pid都放在/var/run 目录下,因此更改参数如下
[root@node3 puppet]# vim puppet.conf
rundir = /var/run/puppet
pidfile = $rundir/master.pid
启动服务
第一次启动的时候不建议使用service启动,首先要使用手动启动并观察其是否会报出error信息
[root@node3 puppet]# puppet master --no-daemonize--verbose --debug
过程中,我们可以看到以下信息
Info:Creating a new SSL key for ca #为CA创建key
Info: Creating a new SSL certificate request for ca #为CA创建字签
Info: Certificate Request fingerprint (SHA256): 1A:55:58:42:32:C6:6:98:AF:02
Notice: Signed certificate request for ca
Debug: Using cached certificate for ca
Info: Creating a new certificate revocation list #为当前节点创建证书颁发申请
Info: Creating a new SSL key for node3
Debug: Using cached certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.y
Info: Creating a new SSL certificate request for node3
Info: Certificate Request fingerprint (SHA256): F5:2B:6C:86:29:81:7:DD:B9:B1 #为当前节点创建证书
Notice: node3 has a waiting certificate request
Debug: Using cached certificate for ca
Debug: Using cached certificate_request for node3
Notice: Signed certificate request for node3
Notice: Removing file Puppet::SSL::CertificateRequest node3 at'/etc/puppet/ssl/ca/requests/node3.pem' #当前节点为CA服务器而后为每个agent颁发证书
Notice: Removing file Puppet::SSL::CertificateRequest node3 at'/etc/puppet/ssl/certificate_requests/node3.pem'
Debug: Using settings: adding file resource 'config':'File[/etc/pu:loglevel=>:debug,:path=>"/etc/puppet/puppet.conf"}'
Debug: Finishing transaction 69861255471540
如果确保没有问题,我们取消进程而后使用service启动服务
[root@node3 puppet]# /etc/init.d/puppetmaster start
查看服务是否被监听
[root@node3 puppet]# ss -tanlp | grep 8140
LISTEN 0 5 *:8140 *:* users:(("puppet",8233,5))
配置agent端
安装puppet
[root@node1~]# rpm -ql puppet
[root@node1 ~]#wgethttp://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
[root@node1 ~]# rpm -ivhpuppetlabs-release-el-6.noarch.rpm
[root@node1 ~]# yum install puppet
[root@node1 ~]# cd /etc/puppet/
编辑配置文件在[main]加入参数
[main]
server =node3.test.com
保存退出 并手动启动agent,查看是否存在error信息
puppet agent --server=node3 --no-daemonize --verbose--debug
如果出现以下信息
Debug: /File[/var/lib/puppet/ssl/private_keys/node1.localhost.pem]:Autorequiring File[/var/lib/puppet/ssl/private_keys]
则需要将本地puppet生成的key删除
[root@node1 puppet]# cd /var/lib/puppet/ssl
[root@node1 ssl]# ll
total 24
drwxr-xr-x 2 puppet puppet 4096 Aug 21 14:42certificate_requests
drwxr-xr-x 2 puppet puppet 4096 Aug 21 14:44 certs
-rw-r--r-- 1 puppet puppet 1141 Aug 21 14:44 crl.pem
drwxr-x--- 2 puppet puppet 4096 Aug 21 14:41 private
drwxr-x--- 2 puppet puppet 4096 Aug 21 14:42 private_keys
drwxr-xr-x 2 puppet puppet 4096 Aug 21 14:42 public_keys
[root@node1 ssl]# rm -fr *
再次运行,如果显示以下信息则为正确
Info: Creating a new SSL key for node1.test.com
Info: Caching certificate for ca
返回master端
查看列表,说明node2等待签名
[root@node3~]# puppet cert list
"node1"(SHA256) A6:22:67:2B:6E:A6:8B:DD:BD:26:DC:0B:0A:3C:42:07:8F:66:65:3A:43:79:02:89:EE:92:AD:7A:1C:99:B0:3F
鉴定证书
[root@node3 ~]# puppet cert sign node1
Notice: Signed certificate request for node1
Notice: Removing file Puppet::SSL::CertificateRequestnode1 at '/etc/puppet/ssl/ca/requests/node1.pem'
如果有很多主机都需要进行签名可以使用--all参数进行签名
稍等片刻,在执行过程中我们可以在agent信息中提示以下信息:
Info: Creating a new SSL key for node1.test.com
Info: Caching certificate for ca
Info: csr_attributes file loading from/etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request fornode1.test.com
Info: Certificate Request fingerprint (SHA256):C9:85:85:85:52:1D:13:88:46:E9:F7:DE:29:77:42:A8:6A:21:4D:67:89:6A:25:3C:B7:A2:09:59:07:9C:DF:50
没有问题则可以启动服务了
[root@node1puppet]# /etc/init.d/puppet start
使agent自动安装服务
[root@node3 puppet]# cd /etc/puppet/manifests
[root@node3 manifests]# ls
[root@node3 manifests]# vim site.pp
写入以下信息
node 'node1.test.com' {
includenginx::nginx_web
}
node 'node2.test.com' {
includenginx::nginx_proxy
}
这样 我们使node1使用nginx_web的模块 使其只提供web服务,而node2使用nginx_proxy模块,使其只提供proxy的服务
修改完成后需要重新加载配置文件
[root@node3 manifests]# /etc/init.d/puppetmaster reload
Stoppingpuppetmaster: [ OK ]
Startingpuppetmaster: [ OK ]
首先查看是否安装nginx
[root@node2 puppet]# rpm -q nginx
package nginx is not installed
稍等片刻在agent上观察
[root@node2 puppet]# rpm -q nginx
nginx-1.6.1-1.el6.ngx.x86_64
以上,为master/agent的使用,感谢各位
本文转自zuzhou 51CTO博客,原文链接:http://blog.51cto.com/yijiu/1545972