随着互联网企业的数据量和业务难度不断增长,从初期的几台服务器发展到庞大的数据中心和服务器集群,单靠人工的修改和部署已经无法满足业务的需求,所以我们需要对系统的部署和服务的搭建提供统一的部署和管理,应蕴而生了一匹自动化管理的开源软件,例如puppet和saltstack等,使用他们可以轻松的管理上千节点,让运维的工作变得更加优雅起来。
本篇文章我们将会介绍一款开源地自动化部署软件puppet。
在puppet官方声明中,介绍puppet是一个开源的集中化管理工具,它由自己声明的一套语法表达系统的配置(有些类似于json),采用c/s架构,通过客户端和服务端之间的连接,维护着关系库,它不仅可以管理丰富的资源(file、repo、server、package等),而且可以由使用者自己定义相关的模板,这些模板符合相同的编写规范,使用者可以轻松的借鉴别人成型的模板迅速完成系统的部署。
处理资源和资源之间的依赖关系是puppet的优势,puppet管理着主机的整个声明周期,从初始化安装,升级,维护,服务迁移及下载,它把所有的操作都可以抽象成“资源”的方式,系统的任务就是维护每个“资源”以及协调好该资源与其他资源之间的关系。
puppet的架构是c/s架构,及客户端和服务端之间的通信,那么我们需要了解两者之间的关系,如下图所示:
client即客户端,Master即服务端,上述的八个步骤描述了一个资源的部署步骤:
1.客户端puppet向Master发起认证请求,或使用带签名的证书。
2.Mster经过验证对客户端进行验证,客户端合法。
3.客户端 Puppetd 调用 Facter,Facter 探测出主机的一些变量,例如主机名、内存大小、IP 地址等。Puppetd 将这些信息通过 SSL 连接发送到服务器端。
4.puppet服务器Master将所需要的Class信息进行编译后存入Catalog并发送给puppet客户端Agent,到此完成第一次交互。
5.puppet客户端Agent对Catalog进行代码验证(语法检测及错误检查)并执行,主要是代码的验证,并将执行过程的信息及结果写入日志。
6.puppet客户端Agent最终达到最开始所定义的状态,并且将结果及任何执行数据通过开发的API形式发送给Puppet服务器Master。
puppet通信采用ssl安全加密协议,以保证所有数据传输的安全性(ssl和其继任者tls是为网络通信提供安全及数据完整性的一种安全协议,tls和ssl在传输层进行加密)。
1.puppet master在启动的时候会向自己签发证书和key,我们可以在/var/puppet/ssl目录看到他们。
2.puppet agent可以通过–test申请证书。
3.puppet master同样也可以使用puppet cert list查看证书的客户端列表。而且可以通过puppet cert signagent_name来签发证书。
4.如果服务端已经进行签发证书,puppet agent就可以收到notice:Finished等相关信息。如果master一直不签发证书,则客户端会每2分钟请求一次。
环境要求:
192.168.3.248 (master.example.com) Master
192.168.3.249 (agent1.example.com) agent1
192.168.3.239 (agent2.example.com) agent2
操作系统:
rhel6.5系统
系统配置:
iptables关闭 (防护墙)
selinux关闭 (内核防火墙)
处理相关解析:
在上述三个节点的/etc/hosts文件中添加解析内容:
192.168.3.248 master.example.com
192.168.3.249 agent1.example.com
192.168.3.239 agent2.example.com
获取puppet的安装包,内容如下:
facter-2.4.4-1.el6.x86_64.rpm
rubygem-json-1.5.5-3.el6.x86_64.rpm
hiera-1.3.4-1.el6.noarch.rpm
rubygem-rake-0.8.7-2.1.el6.noarch.rpm
puppet-3.8.1-1.el6.noarch.rpm
rubygems-1.3.7-5.el6.noarch.rpm
puppet-dashboard-1.2.23-1.el6.noarch.rpm
ruby-mysql-2.8.2-1.el6.x86_64.rpm
puppet-server-3.8.1-1.el6.noarch.rpm
ruby-shadow-1.4.1-13.el6.x86_64.rpm
ruby-augeas-0.4.1-3.el6.x86_64.rpm
ruby-shadow-2.2.0-2.el6.x86_64.rpm
1.首先我们解决各rpm包的依赖性问题,安装建立包依赖性关系的软件:
2.建立包依赖关系:
3.将puppet所需的包加入yum仓库:
[root@master puppet]# vim /etc/yum.repos.d/yum.repo
在服务端Master端安装puppet-server软件,如下所示:
进入到/etc/puppet目录,该目录是Master服务端的主配置目录,首先让我们查看其目录结构:
![这里写图片描述](http://img.blog.csdn.net/20151201153750250
puppet服务端的开启需要生成/etc/puppet/manifests/site.pp文件:
启动puppet服务:
在puppet的服务端只需要安装puppet的rpm包即可,分别在agent1和agent2上进行安装,命令如下:
使用客户端(agent)向服务端(master)申请证书,只有申请了证书之后,客户单才能和服务端建立通信连接:
1.客户端申请证书(192.168.3.249 和 192.168.3.239):
192.168.3.239(agent2):
2.在puppet服务端上查看证书申请列表:
可以看到agent1和agent2在申请证书,服务端需要对其进行证书下放。
4.配置主机配置文件,在/etc/puppet/manifests/site.pp增加输出文件配置,在这里我们定义一个file资源做测试:
5.在客户端分别进行同步更新:
我们以agent1.example.com为例,发现同步成功:
查看指定文件的内容和master的要求是否一致:
注意:
有可能会在客户端获得证书后同步失败,则有以下可能和处理方案:
1. 时间同步问题 检查master和client之前时间是否不一样
2. /etc/resolv.conf里面有search localdomain
3. 就是我碰到的问题
puppet前做了nginx代理! 因为之前测试puppet的时候nginx已经开启,nginx指定了puppet的key已经写到内存里面去了,所以当我删除puppet的key后,在新加服务器的时候 就会出现这个问题! 解决办法重启nginx 和puppetdmaster
上述内容我们介绍了puppet的工作原理以及搭建步骤,最后使用一个file资源做了一个简单的示例,在后续的章节中我们将会对资源进行分类,逐步去介绍puppet对资源的管理,后期还会讲解模板等高级技巧,敬请期待!