Puppet是目前互联网主流三大自动化运维工具(Puppet、Ansible、Saltstack)之一,puppet是一种Linux、Unix平台的集中配置管理系统,所谓配置管理系统,就是管理及其里面诸如文件、用户、进程、软件包等资源
puppet可以运行在一台服务器端,每个客户端通过SSL证书连接到服务端,得到本机器的配置列表,然后根据列表来完成配置工作,所以如果硬件性能比较高,维护管理上千上万台机器是非常轻松的,前提是客户端的配置、服务器路径、软件需要保持一致
Puppet是开源的基于Ruby的系统配置管理工具,Puppet工作流程为Puppet是一个C/S架构,所有的Puppet客户端同一个服务器端的Puppet通信,每个Puppet客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置服务器,配置完成以后Puppet客户端可以反馈给服务器端一个消息,如果报错会给服务器端反馈一个消息
Puppet master与agent完整工作流程图。
Puppet工作为C/S模式,构建Puppet平台需安装Puppet Server端和client端,安装之前准备好系统环境。需要联网
版本 | IP | 主机名 | 描述 |
---|---|---|---|
Centos7.5-1804 | 192.168.100.100 | puppet-server | Puppet服务端,已关闭防火墙与selinux |
Centos7.5-1804 | 192.168.100.101 | puppet-client | Puppet客户端,已关闭防火墙与slinux |
#更改主机名
[root@linuxli ~]# hostnamectl set-hostname puppet-server
#设置hosts映射
[root@puppet-server ~]# echo -e "192.168.100.100 puppet-server\n192.168.100.101 puppet-client" >>/etc/hosts
#配置yum源
[root@puppet-server ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@puppet-server ~]# yum -y install epel-release
#安装puppet-server
[root@puppet-server ~]# yum -y install puppet-server
#启动puppet-server服务
[root@puppet-server ~]# systemctl enable puppetmaster.service
[root@puppet-server ~]# systemctl start puppetmaster.service
#更改主机名
[root@linuxli ~]# hostnamectl set-hostname puppet-client
#设置hosts映射
[root@puppet-client ~]# echo -e "192.168.100.100 puppet-server" >>/etc/hosts
#配置yum源
[root@puppet-client ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@puppet-client ~]# yum -y install epel-release
#安装puppet客户端
[root@puppet-client ~]# yum -y install puppet
#启动puppet服务
[root@puppet-client ~]# systemctl enable puppetagent.service
[root@puppet-client ~]# systemctl start puppetagent.service
Puppet客户端与Puppet服务端是通过SSL隧道通信的,客户端安装完成后,首次使用需向服务器端申请Puppet通信证书,Puppet客户端第一次连接服务器端会发起证书申请。
[root@puppet-client ~]# puppet agent --server puppet-server --test
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppet-client
Info: Certificate Request fingerprint (SHA256): 09:D3:71:C8:64:5B:C2:92:70:48:16:E2:97:4E:4E:AD:CD:4D:03:81:57:41:FD:C1:55:A8:1E:C9:95:D3:F4:42
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled
Puppet客户端向服务器发起证书申请,服务器必须审核证书,如果不审核,客户端与服务器端无法进行后续正常通信。
[root@puppet-server ~]# puppet cert --list
"puppet-client" (SHA256) 09:D3:71:C8:64:5B:C2:92:70:48:16:E2:97:4E:4E:AD:CD:4D:03:81:57:41:FD:C1:55:A8:1E:C9:95:D3:F4:42
[root@puppet-server ~]# puppet cert -s puppet-client
Notice: Signed certificate request for puppet-client
Notice: Removing file Puppet::SSL::CertificateRequest puppet-client at '/var/lib/puppet/ssl/ca/requests/puppet-client.pem'
[root@puppet-server ~]# puppet cert --list --all
+ "puppet-client" (SHA256) 3B:EC:D3:3D:98:5C:40:8E:AF:89:BE:05:AF:F3:C5:26:03:67:36:AC:80:11:C5:B9:8C:3A:0E:E5:78:10:E0:ED
+ "puppet-server" (SHA256) F2:37:44:C5:01:A6:F1:6D:F1:42:0A:C4:72:2B:5C:92:FA:27:F6:68:03:30:0B:0B:28:A2:CD:A3:42:9F:38:C5
Puppet 是基于C/S架构,服务器端保存着所有客户端服务器的配置代码,在Puppet服务端该配置文件叫manifest,客户端下载manifest之后,可以根据manifest对客户端进行配置,例如软件包管理、用户管理、文件管理、命令管理、脚本管理等,Puppet主要基于各种资源或者模块来管理客户端。 默认puppet服务器端manifest目录在/etc/puppet/manifests/下,只需要在该目录下创建一个site.pp文件,然后写入相应的配置代码,Puppet客户端跟Puppet服务端同步时,会检查客户端node配置文件,匹配之后会将该代码下载至客户端,对代码进行解析,然后再客户端执行
以下为在puppet客户端创建test.txt文件,并在该文件中写入测试内容,操作方法如下。
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/tmp/test.txt":
content => "Hello World! linuxli.com 2019";
}
}
manifests site.pp配置文件详解
[root@puppet-client ~]# puppet agent --server puppet-server --test
Info: Caching certificate for puppet-client
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for puppet-client
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-client
Info: Applying configuration version '1561535594'
Notice: /Stage[main]/Main/Node[default]/File[/tmp/test.txt]/ensure: defined content as '{md5}25db3e279675fb8f75fcf87282938e98'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.02 seconds
Puppet主要基于各种资源模块管理客户端,目前企业主流Puppet管理客户端资源模块如下:
通过命令puppet describe -l 可以查看puppet支持的所有资源和模块
Puppet资源主要用于管理客户端文件,包括文件的内容,所有权和权限,其可管理的文件类型包括普通文件、目录以及符号链接等
providers:posix,windows.
首先需要将nginx.conf文件cp至/etc/puppet/files目录,然后在/etc/puppet/fileserver.conf中添加以下三行代码,并重启Puppet master即可
#创建存放文件的目录
[root@puppet-server ~]# mkdir /etc/puppet/files
#模拟拷贝nginx.conf文件
[root@puppet-server ~]# touch /etc/puppet/files/nginx.conf
#编辑fileserver配置文件
[root@puppet-server ~]# vim /etc/puppet/fileserver.conf
...
[files]
path /etc/puppet/files/
allow *
...
#创建site.pp文件
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/tmp/nginx.conf":
mode => 644,
owner => 'root',
group => 'root',
source => 'puppet://puppet-server/files/nginx.conf';
}
}
#客户端同步配置
[root@puppet-client ~]# puppet agent --server puppet-server --test
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-client
Info: Applying configuration version '1561536955'
Notice: /Stage[main]/Main/Node[default]/File[/tmp/nginx.conf]/ensure: defined content as '{md5}d41d8cd98f00b204e9800998ecf8427e'
Notice: Finished catalog run in 0.09 seconds
[root@puppet-client ~]# ls -l /tmp/nginx.conf
-rw-r--r-- 1 root root 0 6月 26 16:15 /tmp/nginx.conf
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/var/lib/docker/":
ensure => link,
target => "/export/docker";
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/tmp/20501212":
ensure => directory;
}
}
Puppet package 资源主要用于管理客户端服务器的软件包,YUM源为/etc/yum.repos.d/安装和升级操作,通过Puppet基于YUM自动安装软件包,所以需要先配置好YUM源。 常见的操作可以对软件进行安装、卸载以及升级操作。
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
package {
["screen","ntp"]:
ensure => "installed";
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
package {
["screen","ntp"]:
ensure => "absent";
}
}
#八、Puppet service 资源案例
Puppet service 资源主要用于启动、重启和关闭客户端的守护进程,同时可以监控进程的状态,还可以将守护进程加入到自启动中。
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
service {
"httpd":
ensure => running;
"nfs":
ensure => stopped;
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
service {
"httpd":
ensure => running,
enable => true;
"nfs":
ensure => stopped,
enable => false;
}
}
Puppet exec 资源主要用于客户端远程执行命令或者软件安装等,相当于shell的调用,exec是一次性执行资源,在不同类里面exec命令可以相同
parameters:command,creates,cwd,environment,group,logoutput,onlyif,path,refresh,refreshonly,returns,timeout,tries,try_sleep,umask,unless,user.
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
exec {
'Agent tar xvf nginx-1.12.0.tar.gz':
path => ["/usr/bin","bin"],
user => 'root',
group => 'root',
timeout => '10',
command => 'tar -xvf /tmp/nginx-1.12.0.tar.gz';
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/tmp/auto_install_nginx.sh":
source => 'puppet://puppet-server/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/sh"];
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
file {
"/etc/sysctl.conf":
source =>"puppet://puppet-server/files/sysctl.conf",
owner => 'root',
group => 'root',
mode => 644;
}
exec {
"systctl refresh kernel config":
path => ["/usr/bin","/usr/sbin","/bin","/sbin"],
command => "/usr/sbin/sysctl -p",
subscribe => File["/etc/sysctl.conf"],
refreshonly => true;
}
}
Puppet cron 资源主要用于安装和管理crontab计划任务,每一个cron资源需要一个command属性和user属性以及至少一个周期属性(hour、minute、month、monthday、weekday)。 crontab计划任务的名称不是计划任务的一部分,它是Puppet用来存储和检索该资源,假如用户指定了一个除了名称其他的都和一个已经存在的计划任务相同,那么这俩个计划任务被认为是等效的,并且新名称将会永久地与该计划任务相关联。
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
cron {
"ntpdate":
command => "/usr/sbin/ntpdate pool.ntp.org",
user => root,
hour => 0,
minute => 0;
}
}
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
node default {
cron {
"ntpdate":
command => "/usr/sbin/ntpdate pool.ntp.org",
user => root,
hour => 0,
minut => 0,
ensure => absent;
}
}
Puppet平台构建完毕,能够使用Puppet去管理客户端,对文件、服务、脚本、各种配置的变更,如果要管理批量服务器,还需要进行一些步骤的配置。
企业新服务器通过kickstart自动安装Linux操作系统,安装完毕,可以自动安装Puppet相关软件包,Puppet客户端安装完毕,需向Puppet服务端请求证书,然后Puppet服务端颁发证书给客户端,默认需要手动颁发,可以通过配置让Puppet服务端自动颁发证书。
自动颁发前提是服务器与客户端能ping通彼此的主机名,配置自动颁发证书需在Puppet服务端的puppet.conf配置文件main段加入以下代码
[root@puppet-server ~]# vim /etc/puppet/puppet.conf
[main]
autosign = true
#重启puppet服务
[root@puppet-server ~]# systemctl restart puppetmaster.service
#删除客户端证书
[root@puppet-server ~]# puppet cert --clean puppet-client
Notice: Revoked certificate with serial 3
Notice: Removing file Puppet::SSL::Certificate puppet-client at '/var/lib/puppet/ssl/ca/signed/puppet-client.pem'
Notice: Removing file Puppet::SSL::Certificate puppet-client at '/var/lib/puppet/ssl/certs/puppet-client.pem'
#删除客户端ssl文件。重新生成ssl文件
[root@puppet-client ~]# rm -rf /var/lib/puppet/ssl/
#重新申请证书
[root@puppet-client ~]# puppet agent --server=puppet-server --test
puppet服务端会自动认证,不必手动颁发证书,减轻人工的干预和操作
Puppet 客户端安装完,并且认证完之后,如果在puppet服务端配置了node信息,客户端启动服务,默认30min自动与服务端同步信息,如果要修改同步的时间频率,修改puppet配置文件信息即可
[root@puppet-client ~]# vim /etc/puppet/puppet.conf
[agent]
server = server.cbcv.net
listen = true
report = true
runinterval = 60
重启Puppet客户端服务,客户端会半个小时跟服务器同步一次配置信息
[root@puppet-client ~]# systemctl restart puppet
#修改为60s同步一次配置信息
[root@puppet-client ~]# vim /etc/puppet/puppet.conf
[agent]
runinterval = 60
[root@puppet-client ~]# systemctl restart puppet
[root@puppet-client ~]# systemctl restart puppetagent.service
#验证同步时间
[root@puppet-client ~]# puppet agent --configprint runinterval
[root@puppet-client ~]# puppet agent --test --noop
Puppet服务器端使用puppet run命令可以给客户端发送一段信号,告诉客户端立刻跟服务器同步配置信息
#修改客户端配置文件
[root@puppet-client ~]# vim /etc/puppet/puppet.conf
[agent]
listen = true
#修改puppet客户端配置文件,指定puppet master主机名
[root@puppet-client ~]# vim /etc/puppet/puppet.conf
[agent]
server = server.cbcv.net
#创建puppet客户端配置文件
[root@puppet-client ~]# vim /etc/puppet/namespaceauth.conf
[puppetrunner]
allow *
#修改客户端配置文件auth.conf,在path/前添加如下代码
[root@puppet-client ~]# vim /etc/puppet/auth.conf
path /run
method save
allow *
#重启puppet客户端
[root@puppet-client ~]# systemctl restart puppet
#Puppet服务端执行如下命令,通知客户端来同步配置,也可批量通知其他客户端,只需将客户端的主机名写入hosts.txt文件
[root@puppet-server ~]# puppet kick -d puppet-client
[root@puppet-server ~]# puppet kick -d 'cat hosts.txt'
某互联网公司新到100台硬件服务器,要求统一安装Linux系统,并部署上线以及后期的管理配置。对于Linux系统安装,需采用批量安装,批量安装系统主流工具为kickstart和Cobbler,任选其一即可。
如果采用自动安装的话,可以自动初始化系统,内核优化及常见服务、软件客户端等安装。Puppet客户端可以放在Kickstart中安装并配置完毕。
当Linux操作系统安装完成后,需要对服务器进行相应的配置,应对高并发网站,例如修改动态IP为静态IP、安装及创建crontab任务计划、同步操作系统时间、安装Zabbix客户端软件、优化内核参数等,可以基于Puppet统一调整
现需要修改100台Linux服务器原DHCP动态获取的IP为staticIP地址,首先需要修改IP脚本,将脚本推送到客户端,然后执行脚本并重启网卡即可,步骤如下。
#修改IP为静态IP的shell脚本代码
#!/bin/bash
#Auto change ip netmask gateway scripts
#by linuxli.com 2019
#Define Path variables
ETHCONF=/etc/sysconfig/network-scripts/ifcfg-eth0
DIR=/data/backup/'date +%y%m%d'
IPADDR=`ifconfig|grep inet|grep 192|head -1|awk '{print $2}'`
NETMASK=255.255.255.0
grep dhcp $ETHCONF
if [ $? -eq 0 ];then
sed -i 's/dhcp/static/g' $ETHCONF
echo -e "IPADDR=$IPADDR\nNETMASK=$NETMASK\nGATEWAY=`echo $IPADDR|awk -F. '{print $1"."$2"."$3"."1}'`\nDNS1=8.8.8.8" >>$ETHCONF
echo "The IP configuration success.!"
service network restart
fi
#Puppet master执行kick推送配置至agent服务器远程。Puppet客户端修改IP脚本
node default {
file {
"/tmp/auto_cange_ip.sh":
source =>"puppet://puppet-server/files/auto_change_ip.sh",
owner =>"root",
group => "root",
mode => 755;
}
exec {
"/tmp/auto_change_ip.sh":
cwd =>"/tmp",
user => 'root',
path => ["/usr/bin","/usr/sbin","/bin","/bin/sh"];
}
}
在100台Linux服务器上配置crontab任务,修改ntpdate与ntp服务端同步时间,操作步骤如下。
(1)Puppet master上创建客户端node配置,可以编写NTP模块,使用class可以定义模块分组,对不同业务进行分组管理,/etc/puppet/modules/ntp/manifests/init.pp配置文件代码如下,将原ntpdate同步时间从0点0分改成5min同步一次时间,并且修改原pool.ntp.org服务器为本地局域网NTP时间服务器的IP地址。
[root@puppet-server ~]# mkdir -p /etc/puppet/modules/ntp/manifests
[root@puppet-server ~]# vim /etc/puppet/modules/ntp/manifests/init.pp
class ntp {
exec { path => "/bin:/sbin/:/bin/sh:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"},
exec {
"auto change crontab ntp config":
command => "sed -i -e '/ntpdate/s/0/*\/5/2' -e 's/pool.ntp.org/10.1.1.21/' /var/spool/cron/root",
}
}
(2)在/etc/puppet/manifests目录创建俩个文件,分别是modules.pp和node.pp,模块入口文件以及node配置段。
[root@puppet-server ~]# vim /etc/puppet/manifests/modules.pp
import "ntp"
[root@puppet-server ~]# vim /etc/puppet/manifests/nodes.pp
node default {
inclide ntp
}
(3)在site.pp中加载导入modules.pp和nodes.pp名称,site.pp配置如下
[root@puppet-server ~]# vim /etc/puppet/manifests/site.pp
import "modules.pp"
import "nodes.pp"
Puppet master执行kick推送配置至agent服务器远程