puppet官方网站:https://puppet.com/
puppet中文wiki:http://puppet.wikidot.com/
puppet中文论坛:http://www.puppetfans.com/
一、puppet概述
Puppet
是开源的基于Ruby的系统配置管理工具,基于C/S的部署架构。是一个为实现数据中心自动化管理而设计的配置管理软件,它使用跨平台语言规范,管理配置文件、用户、软件包、系统服务等。客户端默认每隔半小时会和服务器通信一次,确认是否有更新。当然也可以配置主动触发来强制客户端更新。这样就把日常的系统管理任务代码化了,代码化的好处是可以分享,保存,避免重复劳动,也可以快速恢复以及快速的大规模部署服务器。
扩展阅读:
Puppet Labs Documentation - https://docs.puppetlabs.com/
Puppet Forge - https://forge.puppetlabs.com/
二、puppet构架
puppet的服务器端保存着所有的对客户端服务器的配置代码,在puppet里面叫做manifest. 客户端下载manifest之后,可以根据manifest对服务器进行配置,例如软件包管理,用户管理和文件管理等等。Puppet架构如下:
三、工作模型
-
define
:使用puppet语言来定义资源状态 -
模拟
:根据资源关系图,puppet模拟部署(无损运行c)测试代码 -
强制
:比对客户端主机状态和定义的资源状态是否一致,自动强制执行 -
report
:通过puppet api将日志发送到第三方监控工具(dashboard,foreman)
四、工作原理
Puppet采用了非常简单的C/S架构,所有数据的交互都通过SSL进行,以保证安全
(1)客户端Puppetd向Master发起认证请求,或使用带签名的证书。
(2)Master告诉Client你是合法的。
(3)客户端Puppetd调用Facter,Facter探测出主机的一些变量,例如主机名、内存大小、IP地址等。Puppetd将这些信息通过SSL连接发送到服务器端。
(4)服务器端的Puppet Master检测客户端的主机名,然后找到manifest对应的node配置,并对该部分内容进行解析。Facter送过来的信息可以作为变量处 理,node牵涉到的代码才解析,其他没牵涉的代码不解析。解析分为几个阶段,首先是语法检查,如果语法错误就报错;如果语法没错,就继续解析,解析的结 果生成一个中间的“伪代码”(catelog),然后把伪代码发给客户端。
(5)客户端接收到“伪代码”,并且执行。
(6)客户端在执行时判断有没有File文件,如果有,则向fileserver发起请求。
(7)客户端判断有没有配置Report,如果已配置,则把执行结果发送给服务器。
(8)服务器端把客户端的执行结果写入日志,并发送给报告系统。
这就是puppet的工作流程,最重要的莫过于puppet-master来管理node的配置文件。
五、安装puppet
环境说明:
172.16.252.134 master.localdomain
//Puppet Server
172.16.252.131 agent1.localdomain
//Puppet Agent
这里的机器名称不要有下划线等特殊符合,否则后面会报“the scheme puppet does not accept registry part”这样的错误信息。
centos的官方软件库里面不包含puppet包,但是在epel项目里面有包含puppet包。epel 是一个对rhel软件仓库的扩展,把一些有用的,但是rhel库没包含的软件收集在一起做成的一个软件仓库。
1、安装Puppet Server
[root@centos7 ~]# hostnamectl set-hostname master.localdomain //设置机器名称
[root@centos7 ~]# systemctl reboot //重启
[root@master ~]#vim /etc/hosts
172.16.252.134 master.localdomain
172.16.252.131 agent1.localdomain
[root@master ~]#yum install puppet-server -y //安装Puppet Server
打开配置文件添加以下内容:
[root@master ~]#vim /etc/puppet/puppet.conf
[master]
certname=master.localdomain
[root@master ~]#systemctl start puppetmaster.service //启动服务
[root@master ~]#systemctl enable puppetmaster.service //设置开机自启
[root@master ~]#iptables -F //关闭防火墙
[root@master ~]#setenforce 0 //关闭Selinux
2、安装Puppet Agent
[root@centos7 ~]# hostnamectl set-hostname agent.localdomain //设置机器名称
[root@centos7 ~]# systemctl reboot //重启
[root@agent1 ~]#vim /etc/hosts
172.16.252.134 master.localdomain
[root@agent1 ~]#yum install puppet -y //安装Puppet Agent
[root@agent1 ~]#vim /etc/puppet/puppet.conf
[agent]
certname = agent1.localdomain
server = master.localdomain
repot = true
[root@agent1 ~]#systemctl start puppet.service //启动服务
[root@agent1 ~]#systemctl enable puppet.service //设置开机自启
六、证书申请
Puppet客户端与服务器端是通过SSL隧道通信的,客户端安装完成后,需要向服务器端申请证书:
首次连接服务器端会发起证书申请,在客户端执行命令如下:
(1)客户端执行
[root@agent1 ~]#puppet agent --server=master.localdomain --no-daemonize --onetime --verbose --debug
如果返回以下信息说明证书请求成功了
Debug: Finishing transaction 22955040
Debug: Using cached certificate for ca
Debug: Using cached certificate for ca
Debug: Using cached certificate_request for agent1.localdomain
Debug: Using cached certificate for ca
Debug: Using cached certificate_request for agent1.localdomain
Debug: Using cached certificate for ca
Debug: Using cached certificate for ca
(2)服务器端查看证书请求
在puppet服务器端查看到申请证书的客户端的主机名
[root@master ~]#puppet cert list --all
注:前面有+
号的说明已经授权签发了
(3)服务器端颁发证书
[root@master ~]#puppet cert --sign agent1.localdomain
Notice: Signed certificate request for agent1.localdomain
Notice: Removing file Puppet::SSL::CertificateRequest agent1.localdomain at '/var/lib/puppet/ssl/ca/requests/agent1.localdomain.pem'
查看是否颁发成功
[root@master ~]#puppet cert list -all
注意:
在证书申请过程中,如果有问题,可以删除证书重新申请,一般都能解决问题(删除Server和Agent的过期证书)。
Agent:
[root@agent1 ~]# rm -rf /var/lib/puppet #删除缓存文件
[root@agent1 ~]# systemctl restart puppetagent.service //重启服务
Server:
[root@master ~]# puppet cert clean agent1.localdomain
[root@master ~]# systemctl restart puppetmaster.service
(4)验证puppet配置
在服务器端写个例子测试一下。这个例子作用很简单。用来在客户端/tmp目录下新建一个woyoo.txt文件,内容为:hello,puppet!在服务器端/etc/puppet/mainifests下编写代码:【服务器端不需要创建这个文件】
[root@master manifests]#vim site.pp
node default{
file {"/tmp/woyoo.txt":
content => "hello,puppet";
}
}
在客户端上执行puppet,运行成功后会在/tmp看到新生成的woyoo.txt文件
[root@agent1 ~]#puppet agent --test --server=master.localdomain
Info: Retrieving pluginfacts
Info: Retrieving plugin
Error: NetworkManager is not running.
Info: Caching catalog for agent1.localdomain
Info: Applying configuration version '1506308907'
Notice: /Stage[main]/Main/Node[default]/File[/tmp/woyoo.txt]/ensure: defined content as '{md5}5b9e88dda7036e785544bc9fc9d60cd4'
Notice: Finished catalog run in 0.03 seconds
[root@agent1 ~]#cat /tmp/woyoo.txt
hello,puppet
示例
(1)文件同步
服务器端编写文件同步脚本
[root@master manifests]#vim site.pp
node default{
file {"/tmp/woyoo.txt":
content => "hello,puppet";
}
}
node "agent1.localdomain"{
host {"agent1.localdomain":
ip => "172.16.252.131",
target => "/data/ops/cut_nginx_logs.py",
ensure => present;
}
}
注意:目录:/data/ops/ 要事先再客户端(agent)存在
客户端同步策略
[root@agent1 ~]#puppet agent --test --server=master.localdomain
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for agent1.localdomain
Info: Applying configuration version '1506309924'
Notice: /Stage[main]/Main/Node[agent1.localdomain]/Host[agent1.localdomain]/ensure: created
Notice: Finished catalog run in 0.08 seconds
[root@agent1 ~]#cd /data/ops/
[root@agent1 ops]#ls
cut_nginx_logs.py