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的安全认证
- Puppet Master 在启动后会向自己签发证书和key。可以在/var/puppet/ssl或/var/lib/puppet/ssl目录下看到它们。
- 等待客户端请求证书签署请求。
- 客户端启动服务,将自己的主机名和签署请求发送给master端,请求签署证书。如果Master一直不签发证书,客户端会每2分钟请求一次。
- master签署证书,根据证书名称就是agent的主机名。这样master和agent端都可以知道对方的证书公钥了。这样客户端就可以和master相互通信了
二、agent和master交互
- agent每隔30分钟把节点名与facts信息发送给master.因此如果在证书签署过后不会立即请求,重启agent服务即可。
- master通过site.pp中包含的node.pp判断agent要做什么,将所需要的class类信息编译后存入catalog并发送给agent。
- agent对catalog进行代码验证(检测语法及错误)并执行,执行信息、结果写入日志
- 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,并启动相应的端口。
- Puppet的agent/master原理与案例实现
- puppet master/agent
- puppet agent源码分析之agent启动和run_rest-api的实现
- Puppet Master 之 布娃娃的创建
- redhat实现puppet的安装
- Agent不能同步master的解决方法
- puppet与nagios的结合
- 搭建ubuntu puppet master & windows puppet client
- Non-Agent与Agent之间的通信
- puppet原理及配置
- 使用命令生成puppet.conf无法启动puppet master问题解决
- android开机自启动原理与实现案例
- Proxy 与 Agent 的区别
- Java Agent与Native Agent的利与弊
- JAVA Agent的原理和使用
- puppet学习与精通之-Exec资源详细介绍及案例分析
- puppet学习与精通之 file资源详细介绍及案例分析
- puppet学习与精通之Package资源详细介绍及案例分析
- 设计模式——观察者模式
- Unity Shader入门第一篇
- C语言实现通讯录管理系统
- 关于堆和栈
- Linux中常用操作命令
- Puppet的agent/master原理与案例实现
- 使用serialize()提交form表单数据后台为null问题解决
- C++学习17:函数模板
- python容器
- VirtualBox虚拟机网络环境解析和搭建-NAT、桥接、Host-Only、Internal、端口映射
- 1072. 开学寄语(20)
- Java IO流经典练习题
- 【ACM题】排序问题
- Flask-restful路由实现url后面跟多个参数