一、概念
puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppet的设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系。
数据流说明:
1.首先所有的节点(Node)Node节点将Facts和本机信息发送给Master
2.Master告诉Node节点应该如何配置,将这些信息写入Catalog后传给Node。
3.Node节点在本机进行代码解析验证并执行,将结果反馈给Master。
4.Master通过API将数据发给分析工具。报告完全可以通过开放API或与其他系统集成。
具体的工作流程:
- 客户端puppet调用facter(facter是通过SSL加密收集及检测分析客户端配置信息的一个工具)。facter探测出主机的一些变量,如主机名,内存大小,IP地址等。Puppet将这些信息通过SSL连接发送到服务端
- 服务端的puppetmaster通过facter工具分析检测客户端的主机名,然后找到项目主配置文件manifest里面对应的node配置,并对该部分内容进行解析。facter发送过来的信息可以作为变量处理,node牵涉到的代码才进行解析,其他没牵涉的代码不解析。解析分几个阶段,首先进行语法检测,如果语法没有错,就继续解析,解析的结果生成一个中间的“伪代码”,然后将“伪代码”发送给客户端。
- 客户端接受到“伪代码”并执行,然后将执行结果发送给服务端。
- 服务端把客户端的执行结果写入到日志中去。
Puppet工作中以下两点值得注意:
为了保证安全,client和master之间是基于SSL和证书通信的,只有经过master证书认证的client才可以和master通信。
puppet会让系统保持在人们期望的某种状态并之一持续下去,如检测某个文件并一直保证其一致存在,保证ssh服务始终开启,如果文件被删除或者ssh服务被关闭,puppet下次执行时(默认30分钟),会重新创建该文件或者启动ssh服务。
二、安装配置
1、安装准备(已关闭防火墙和selinux)
setenforce 0 systemctl stop firewalld
名称 | 系统 | ip | 主机名 |
master | CentOS 7 | 192.168.207.137 | master.domain.com |
slave | centos 7 | 192.168.207.133 | slave.domain.com |
2、master服务器配置
[root@master ~]# rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm
[root@master ~]# yum install puppet-server
[root@master ~]# systemctl enable puppetmaster.service
[root@master ~]# vi /etc/hosts
添加如下两行
192.168.207.137 master.domain.com
192.168.207.133 slave.domain.com
[root@master ~]# vi /etc/puppet/puppet.conf
添加如下内容:
[main]
certname=master.domain.com//服务端的名字
systemctl start puppetmaster.service
systemctl enbale puppetmaster.service
3、配置客户端
[root@slave ~]# rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm [root@slave ~]# yum install puppet [root@slave ~]#vi /etc/puppet/puppet.conf 添加如下内容: [agent] certname = slave.domain.com server = master.domain.com report = true [root@slave ~]# systemctl start puppet.service [root@slave ~]# systemctl enable puppet.service
4、在Puppet客户端创建test.txt文件,并在该文件中写入测试内容,Puppet服务端创建node,创建或者编辑vim /etc/puppet/manifests/site.pp文件,在文件中加入如下代码:
node default{ file{ "/tmp/test.txt": content => "Hello World,Welcome to Slave"; } }
三、Puppet常见资源及模块
file:主要负责管理文件;
package:软件包的安装管理;
service:系统服务的管理;
cron:配置自动任务计划;
exec:远程执行运行命令。
puppet describle -l 查看puppet支持的所有资源和模块
puppet describle -s file 查看puppet file资源所有的帮助信息
1、Puppet file 资源案例
从Puppet服务器下载nginx.conf 文件至客户端/tmp目录,首先需要将nginx.conf文件cp至/etc/puppet/files目录,然后在/etc/puppet/filesserver.conf中添加以下三行代码,并重启Puppet master。
vim /etc/puppet/fileserver.conf [files] path /etc/puppet/files allow *
在manifests中创建site.pp文件
node default{ file{ "/tmp/nginx.conf": mode => '644', owner => 'root', group => 'root', source => 'puppet://master.domain.com/files/nginx.conf', } }
客户端执行:
puppet agent --server=master.domain.com --test
2、Puppet package资源案例
Puppet package资源主要用于管理客户端服务器的软件包,YUM源为/etc/yum.repo.d/安装和升级操作,通过Puppet基于YUM自动安装软件包,所以需要先配置好YUM源。
客户端安装ntpdate及screen软件,服务端先编写site.pp
node default{ package { ["screen","ntp"]: ensure => "installed"; } }
客户端执行:
puppet agent --server=master.domain.com --test
卸载:
node default{ package { ["screen","ntp"]: ensure => "absent"; } }
3、Puppet service资源案例
Puppet service 资源主要用于启动、重启和关闭客户端的守护进程,同时可以监控进程的状态,还可以将守护进程加入到自启动中。
启动agent ntpd服务,停止httpd服务,先编写site.pp文件。
node default{ service { "httpd": ensure => "stopped"; "ntpd": ensure => "running"; } }
客户端执行:
puppet agent --server=master.domain.com --test
启动并加入自启代码如下:
node default{ service { "httpd": ensure => "running", enable => true; "ntpd": ensure => "stopped"; enable => false; } }
4、Puppet exec 资源案例
Puppet exec 资源主要用于客户端远程执行命令或者软件安装等,相当于shell的调用,exec是一次性执行资源,在不同类里面exec名字可以相同。
agent服务器执行解压Nginx软件包,先编写site.pp文件:
node default{ exec { "Agent tar xzf nginx-1.18.0.tar.gz": path => ["/usr/bin","/bin"], user => 'root', group => 'root', timeout => '10', command => 'tar -zxf /tmp/nginx-1.18.0.tar.gz'; } }
客户端执行:
puppet agent --server=master.domain.com --test
编写自动安装nginx:
node default { file { "/tmp/auto_install_nginx.sh": source => "puppet://master.domain.com/files/auto_install_nginx.sh", owner => "root", group => "root", mode => 755, } exec{ "/tmp/auto_install_nginx.sh": cwd => "/tmp", user => root, path => ["/usr/bin","/usr/sbin","/bin","/bin/sh"], } }
agent服务器更新sysctl.conf,如果该文件发生改变,则执行命令sysctl -p,先把服务器端的sysctl.conf文件拷贝至/etc/puppet/files文件夹下面,编写site.pp
node default { file { "/etc/sysctl.conf": source => "puppet://master.domain.com/files/sysctl.conf", owner => "root", group => "root", mode => 644, } exec{ "sysctl refresh kernel config": path => ["/usr/bin","/usr/sbin","/bin","/bin/sh"], command => "/sbin/sysctl -p", subscribe => File["/etc/sysctl.conf"], refreshonly =>true } }
5、Puppet cron资源案例
Puppet cron 资源主要用于安装管理crontab计划任务,每一个cron资源需要一个command属性和user属性以及至少一个周期属性(hour、minute、month、monthday、weekday)。
agent服务器添加ntpdate时间同步任务,编写site.pp文件
node default { cron{ "ntpdate": command => "/usr/sbin/ntpdate pool.ntp.org", user => root, hour => 0, minute => 0; } }
agent服务器删除ntpdate时间同步任务。
node default { cron{ "ntpdate": command => "/usr/sbin/ntpdate pool.ntp.org", user => root, hour => 0, minute => 0, ensure => absent; } }
客户端执行:
puppet agent --server=master.domain.com --test
四、Puppet 日常管理和维护
1、配置自动颁发证书:前提是服务端与客户端能ping通彼此的主机名,配置自动颁发证书需在Puppet服务器端的puppet.conf配置文件main端加入如下代码
[main] autosign = true
服务器端:重启Puppet master服务,并且删除客户端证书
systemctl restart puppetmaster
puppet cert --clean slave.domain.com
客户端:删除Puppet客户端SSL文件,重新生成SSL文件,执行如下命令自动申请证书:
rm -rf /var/lib/puppet/ssl/ puppet agent --server=master.domain.com --test
Puppet客户端安装完,并且认证完之后,如果在Puppet服务端配置了node信息,客户端启动服务,默认30min自动与服务端同步信息,如果要修改同步的时间频率,修改Puppet
客户端配置信息。
2、Puppet服务器端主动推送
Puppet客户端配置每60s与服务端同步配置信息,如果服务器端更新了配置信息,想立刻让客户端同步,可以使用Puppet master主动推送的方式,让客户端更新服务端最新的配置信息。
Puppet服务器端使用puppet run命令可以给客户端发送一段信号,告诉客户端立刻跟服务器同步配置信息。
配置方法:
(1)、修改Puppet客户端配置文件/etc/puppet/puppet.conf,在agent端加入如下代码:
[agent] listen=true
(2)、修改Puppet客户端配置文件/etc/sysconfig/puppet,指定Puppet master端主机名
PUPPET_SERVER=master.domain.com
(3)、创建Puppet客户端配置文件namespaceauth.conf
[puppetrunner]
allow *
(4)、修改Puppet客户端配置文件auth.conf,在path /前添加如下代码:
path /run
method save
allow *
(5)、重启客户端puppet服务,puppet服务端执行如下命令,通知客户端来同步配置,也可以批量通知其他客户端,只需要将客户端的主机名写入host.txt,代码如下
puppet kick -d slave.domain.com #puppet kick -d 'cat host.txt'