Puppet的agent/master原理与案例实现

来源:互联网 发布:千千自动发卡源码 编辑:程序博客网 时间:2024/05/14 12:19

简介

puppet类似于ansible,但ansible是轻量化的自动化运维工具,管理20台左右的机器还是可以的,但是当机器数量多的情况下,ansible就应付不过来了,需要更高级的自动化运维工具puppet、saltstack等,不过puppet是由ruby语言开发的,ruby语言已经江河日下,对于目前来说由python开发的saltstack当然会成为主流,不过这需要以后去挖掘它吧,目前多数企业还是使用puppet来进行自动化部署。

注意:agent严重依赖于主机名,因此最好要配置一台DNS服务器。这里就简单的使用hosts文件来解析主机名吧。

agent与master交互流程


注:这是网上一位朋友的图片,发现画的比较好,就引用一下。
Puppet通信agent和master都采用SSL安全加密协议,以保障所有数据传输的安全性。

一、先是agent和master的安全认证

  1. Puppet Master 在启动后会向自己签发证书和key。可以在/var/puppet/ssl或/var/lib/puppet/ssl目录下看到它们。
  2. 等待客户端请求证书签署请求。
  3. 客户端启动服务,将自己的主机名和签署请求发送给master端,请求签署证书。如果Master一直不签发证书,客户端会每2分钟请求一次。
  4. master签署证书,根据证书名称就是agent的主机名。这样master和agent端都可以知道对方的证书公钥了。这样客户端就可以和master相互通信了

二、agent和master交互

  1. agent每隔30分钟把节点名与facts信息发送给master.因此如果在证书签署过后不会立即请求,重启agent服务即可。
  2. master通过site.pp中包含的node.pp判断agent要做什么,将所需要的class类信息编译后存入catalog并发送给agent。
  3. agent对catalog进行代码验证(检测语法及错误)并执行,执行信息、结果写入日志
  4. agent完成执行,系统达到预期状态,把结果及执行数据返回给master

实验

实验描述

我们来配置一个最简单的agent/master,来让agent安装redis,并同步时间。

实验环境

两台主机都安装centos7.3操作系统
node1:192.168.233.71,master端
node2:192.168.233.72,agent端
puppet-server3.6.2
puppet3.6.2

具体步骤

一、环境准备
1、两台主机配置主机名解析文件,这里没有配置DNS服务器,因此就使用/etc/hosts文件吧。
vi /etc/hosts
我们来看node1的hosts文件如下:node2的hosts文件和此文件一样

127.0.0.1   node1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.233.71 node1192.168.233.72 node2

2、设置主机名
因为这里是centos7,可直接通过命令hostnamectl set-name node1,这个命令是同时修改配置文件和内存中的主机名的,重新载入会话即可发现主机名已经改变
注意:如果是centos6的话,使用hostname设置内存中的主机名,使用编辑/etc/sysconfig/network,里面添加HOSTNAME=node1

3、master和agent端安装软件
master:
安装程序包:facter, puppet, puppet-server
agent端:
安装程序包puppet即可。

二、master端开发模块
puppet的任务是以模块形式进行的,模块又是一个一个“资源”组成的。
1、创建目录

mkdir -p   /etc/puppet/modules/{ntptime,redis}/{manifests,files,lib,templates,test,spec}

2、显示模块
puppet module list
3、在/usr/share/puppet/modules/ntptime/manifests这个目录下至少需要一个清单文件,叫init.pp 并且能有一个类,这个类还得与当前模块同名

vi  init.ppclass ntptime {        exec{'ntpdate':                command => "ntpdate 172.16.0.1",这里如果无法测试,我们可以给其替换成其他命令,比如mktemp  /tmp/test.XXXX来创建临时目录                path    => '/bin:/sbin:/usr/bin:/usr/sbin',        }}include ntptime

4、在/usr/share/puppet/modules/redis/manifests中编辑 init.pp

vi  init.ppclass redis {                package{'redis':                                ensure  => latest,                } ->                service{'redis':                                ensure  => running,                                enable  => true,                }}class redis::master inherits redis {        $redis_port = 6370        file{'redis.conf':                path    => '/etc/redis.conf',                ensure  => file,                content => template('redis/redis.conf.erb'),//在上面创建的templates中创建redis的配置文件模板,这里是将配置文件复制过来,将端口设置为变量port <%= @redis_port %>,可以在此文件中直接设置端口如上$redis_port = 6370。                owner   => redis,                group   => root,                require => Package['redis'],                notify  => Service['redis'],        }#       Service['redis']{#               subscribe => File['/etc/redis.conf'],#       }}include redis::master

5、可以在本地执行一次,测试是否正确执行。
puppet apply init.pp(这里是对应模块manifests目录中的init.pp文件,如果不是在manifests目录,需要使用绝对路径或绝对路径)

6、编辑master端的site.pp文件

vi  /etc/puppet/manifests/site.ppnode 'base' {        include ntptime}node 'node2' inherits base {   //这里继承上面的类,只是为了说明定义此文件可以“继承”,这样的话,将node2同时执行ntptime和redis        include redis}

7、启动服务器端
(1)puppet master --no-daemonize -v这种服务会使运行到前台,而不是以守护进程方式,进而我们可以看到一些信息
(2)systemclt start puppetmaster.service也可以。

此时将会开启一个监听在TCP的8140端口。

8、配置agent使能找到master
vi /etc/puppet/puppet.conf
在[agent]段加上master的主机名server = node1

9、启动客户端
(1)puppet agent --no-daemonize -v运行于前台,而不是以守护进程方式,进而我们可以看到一些信息
(2)也可以使用systemctl start puppet

10、在服务器端签署客户端证书
可以在master端检查签署的证书puppet cert list -a,前面带+号的代表已经签署

使用puppet cert sign node2签署证书

11、等待30分钟,客户端即可安装redis和ntptime同步时间了。如果我们等不及,可以重启客户端服务即可
systemctl restart puppet

12、过一段时间检查agent是否安装redis,并启动相应的端口。

原创粉丝点击