puppet类似于ansible,但ansible是轻量化的自动化运维工具,管理20台左右的机器还是可以的,但是当机器数量多的情况下,ansible就应付不过来了,需要更高级的自动化运维工具puppet、saltstack等,不过puppet是由ruby语言开发的,ruby语言已经江河日下,对于目前来说由python开发的saltstack当然会成为主流,不过这需要以后去挖掘它吧,目前多数企业还是使用puppet来进行自动化部署。
注意:agent严重依赖于主机名,因此最好要配置一台DNS服务器。这里就简单的使用hosts文件来解析主机名吧。
注:这是网上一位朋友的图片,发现画的比较好,就引用一下。
Puppet通信agent和master都采用SSL安全加密协议,以保障所有数据传输的安全性。
我们来配置一个最简单的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.localdomain6
192.168.233.71 node1
192.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.pp
class 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.pp
class 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.pp
node '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,并启动相应的端口。