Puppet自动化运维

Puppet 自动化运维
Puppet 工作原理详解:
1)客户端Puppetd调用本地facter,facter会探测出该主机的常用变量,例如主机名、内存大小、IP地址等。然后Puppetd把这些信息发送到Puppet服务端;
2)Puppet服务端检测到客户端的主机名,然后会检测manifest中对应的node配置,并对这段内容进行解析,facter发送过来的信息可以作为变量进行处理;
3)Puppet 服务端匹配Puppet客户端相关联的代码才能进行解析,其他的代码不解析,解析分为几个过程,首先是语法检查,然后会生成一个中间的伪代码,之后再把伪代码发给Puppet 客户端;
4)Puppet客户端接收到伪代码之后就会执行,执行完后会将执行的结果发送给Puppet 服务端;
5)Puppet服务端再把客户端的执行结果写入日志。
 
一、Puppet 安装配置
Puppet工作为C/S模式,构建Puppet 平台需安装Puppet server 端和client端,安装之前准备好系统环境:
操作系统版本:CentOS 6.10 x64
服务端IP:192.168.28.134        hostname:134.tang.com
客户端IP:192.168.28.135        hostname:135.tang.com
1、Puppet 服务端安装:
首先在hosts文件添加主机名和本机IP的对应关系:
# vim /etc/hosts
192.168.28.134  134.tang.com
192.168.28.135  135.tang.com
Puppet 服务端除了需要安装Puppetserver外,还需要Ruby的支持,需要安装Ruby相关软件包,默认YUM安装Puppet server,会自动下载并安装Ruby 相关软件:
# wget http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
# yum installpuppetlabs-release-el-6.noarch.rpm
# yum install -y rubyfacter puppet-server
# service puppet start
# service puppetmasterstart
# chkconfig  puppet on
# chkconfig  puppetmaster on
sed -i'/SELINUX/S/enforce/disabled/' /etc/selinux/config
setenforce 0
配置/etc/puppet/puppet.conf,在[main]段增加certname属性。
[main]
    # The Puppet log directory.
    # The default value is '$vardir/log'.
    logdir = /var/log/puppet
    # Where Puppet PID files are kept.
    # The default value is '$vardir/run'.
    rundir = /var/run/puppet
    # Where SSL certificates are kept.
    # The default value is '$confdir/ssl'.
    ssldir = $vardir/ssl
    certname = 134.tang.com
---------------------
2、Puppet 客户端安装:
首先在hosts文件添加主机名和本机IP的对应关系:
# vim /etc/hosts
192.168.28.134  134.tang.com
192.168.28.135  135.tang.com
Puppet 服务端除了需要安装Puppetserver外,还需要Ruby的支持,需要安装Ruby相关软件包,默认YUM安装Puppet server,会自动下载并安装Ruby 相关软件:
# wget http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
# yum installpuppetlabs-release-el-6.noarch.rpm
# yum install -y rubyfacter puppet
# service puppet start
# chkconfig  puppet on
/etc/init.d/iptablesstop
sed -i'/SELINUX/S/enforce/disabled/' /etc/selinux/config
setenforce 0
配置/etc/puppet/puppet.conf,在agent段增加certname,server,report属性,如下所示:
[agent]
    # The file in which puppetd stores a listof the classes
    # associated with the retrievedconfiguratiion.  Can be loaded in
    # the separate ``puppet`` executable usingthe ``--loadclasses``
    # option.
    # The default value is'$confdir/classes.txt'.
    classfile = $vardir/classes.txt
    # Where puppetd caches the localconfiguration.  An
    # extension indicating the cache format isadded automatically.
    # The default value is'$confdir/localconfig'.
    localconfig = $vardir/localconfig
    certname = 135.tang.com
    server = 134.tang.com
    report = true
---------------------
3、Puppet 客户端申请证书
Puppet 客户端与Puppet服务端是通过SSL隧道通信的,客户端安装完成后,首次使用需向服务器端申请Puppet 通信证书,Puppet客户端第一次连接服务器会发起证书申请,在Puppet 客户端执行命令如下:
puppet agent --server134.tang.com --test
4、Puppet 服务端颁发证书
Puppet客户端向服务器发起证书申请,服务器端必须审核证书,如果不审核,客户端与服务器端无法进行后续正常通信,Puppet 服务端颁发证书命令:
puppet cert--list        查看申请证书的客户端主机名;
puppet cert -s135.tang.com        颁发证书给客户端;
puppet cert-s                为特定的主机颁发证书;
puppet  cert -s and-a        给所有的主机颁发证书;
puppet cert --list--all        查看已经颁发的所有证书。
puppet cert--clean  --all   清除所有证书
5、清除Master和客户端的SSl证书:
Master:puppet cert--clean  --all
Client:rm -rf/var/lib/puppet/ssl/
 
二、Puppet 企业案例演示
Puppet是基于C/S架构,服务器端保存着所有对客户端服务器的配置代码,在Puppet服务端该配置文件叫manifest,客户端下载manifest之后,可以根据manifest对客户端进行配置,例如软件包管理、用户管理、文件管理、命令管理、脚本管理等,Puppet主要基于各种资源或者模块来管理客户端。
默认Puppet服务器端manifest目录在/etc/puppet/manifests/下,只需要在该目录下创建一个site.pp文件,然后写入相应的配置代码,Puppet客户端跟Puppet 服务端同步时会检查客户端node配置文件,匹配之后会将该代码下载至客户端,对代码进行解析,然后在客户端执行。
以下在Puppet客户端创建test.txt文件,并在该文件中写入测试内容,操作方法如下:
1、Puppet服务端创建node代码,创建或者编辑 vim /etc/puppet/manifests/site.pp文件:
node default{
file{
"/tmp/test.txt":
content =>"Hello World,tang.com 2018";
}
}
manifest site.pp配置文件代码详解:
nodedefault        新建node节点,default表示所有主机,可以修改为特定主机名;
file                基于file资源模块管理客户端文件或者目录操作;
“/tmp/test.txt”        需要在客户端创建的文件名;
content                客户端服务器文件内容。
2、客户端执行同步命令,获取Puppet服务端node配置:
puppet agent--server=134.tang.com --test
Puppet客户端执行同步效果,会在/tmp/目录创建test.txt文件,内容为"Hello World,tang.com2018",即可证明Puppet 客户端成功获取服务端node配置。
 
三、Puppet 常见资源及模块
Puppet主要基于各种资源模块管理客户端,目前企业主流Puppet 管理客户端资源模块如下:
file                主要负责管理文件;
package        软件包的安装管理;
service                系统服务的管理;
cron                配置自动任务计划;
exec                远程执行运行命令。
通过命令puppet describe -l可以查看Puppet 支持的所有资源和模块。
通过命令puppet describe -sfile 可以查看Puppet file 资源所有的帮助信息。
 
四、Puppet file 资源案例
Puppet file资源主要用于管理客户端文件,包括文件的内容、所有权和权限,其可管理的文件类型包括普通文件、目录以及符号链接等。
类型应在“确保”属性中指定,如果是文件内容可以直接用content属性来管理,或者使且source属性从远程源下载,后者也可以用recurse服务目录(当recurse属性设置为true或local时),Puppetfile 资源支持参数详解:
ensure                默认为文件或目录
backup                通过filebucket备份文件
checksum        检查文件是否被修改的方法
ctime                只读属性,文件的修改时间
mtime                只读属性,文件的修改时间
content                文件的内容,与source和target互斥
force                强制执行删除文件、软件链接及目录的操作
owner                用户名或用户ID
group                指定文件名的用户组或组ID
link                软链接
mode                文件权限配置,通常采用数字符号
path                文件路径
Parameters
----------
    backup, checksum, content, ctime, ensure,force, group, ignore, links,
    mode, mtime, owner, path, purge, recurse,recurselimit, replace,
    selinux_ignore_defaults, selrange, selrole,seltype, seluser, show_diff,
    source, source_permissions, sourceselect,target, type, validate_cmd,
    validate_replacement
1、从Puppet服务器下载nginx.conf文件至客户端/tmp目录,首先需要将nginx.conf文件cp至/etc/pupet/files目录,然后在/etc/puppet/fileserver.conf中添加以下三行代码,并重启Puppetmaster即可。
# mkdir/etc/puppet/files
[files]
path /etc/puppet/files/
allow *
创建 site.pp 文件,代码如下:
node default{
file{
'/tmp/nginx.conf':
mode=> '644',
owner=> 'root',
group=> 'root',
source=> 'puppet://134.tang.com/files/nginx.conf'
}
}
2、从Puppet服务器下载sysctl.conf,如果客户端该文件存在则备份为sysctl.conf.bak,然后理覆盖原文件:
node default{
file {
"/etc/sysctl.conf":
source=> "puppet://134.tang.com/files/sysctl.conf",
backup=> ".bak_$uptime_seconds",
}
}
3、在agent上创建/export/docker的软链接为/var/lib/docker:
node default {
file {
"/var/lib/docker":
ensure=> link,
target=> "/export/docker",
}
}
4、在agent创建目录/tmp/20181212:
node default {
file {
“/tmp/20181212”:
ensure=> directory,
}
}
 
五、Puppet package资源案例
Puppetpackage资源主要用于管理客户端服务器的软件包,YUM源为/etc/yum.repos.d/安装和升级操作,通过Puppet基于YUM自动安装软件包,所以需要先配置好YUM源。
常见的操作可以对软件包进行安装、卸载以及升级操作。Puppetpackage资源支持参数详解如下:
Parameters:
    adminfile, allow_virtual,allowcdrom,category,configfiles,description,ensure,
   flavor,install_options,instance,name,package_settings,platform,responsefile,
   root,source,status,uninstall_options,vendor.
Providers:
    aix, appdmg, apple, apt, aptitude, aptrpm,blastwave, dpkg, fink,
    freebsd, gem, hpux, macports, msi, nim,openbsd, opkg, pacman, pip, pkg,
    pkgdmg, pkgin, pkgutil, portage, ports,portupgrade, rpm, rug, sun,
    sunfreeware, up2date, urpmi, windows, yum,zypper
present                检查软件是否存在,不存在则安装
installed        表示安装软件
absent        删除(无依赖),当别的软件包依赖时,不可删除
pureged        删除所有配置文件和依赖包,有潜在风险,慎用
latest                升级到最新版本
version        指定安装具体的某个版本号
1、客户端安装ntpdate及screen软件:
node default {
package {
["screen","ntp"]:
ensure=> "installed";
}
}
2、客户端卸载ntpdate及screen软件:
node default {
package {
["screen","ntp"]:
ensure=> "absent",
}
}
 
六、Puppet service资源案例
Puppet service资源主要用于启动、重启和关闭客户端的守护进程,同时可以监控进程的状态,还可以将守护进程加入到自启动中。
Puppet service资源支持参数详解:
parameters:
     binary,control,enable,ensure,flags,hasrestart,hasstatus,manifest
     name,path,pattern,restart,start,status,stop.
providers:
     base,bsd,daemontools,debian,freebsd,gentoo,init,launchd,openbad,
     openrc,openwrt,redhat,runit,service,smf,src,systemd,upstart,windows.
enable                指定服务在开机的时候是否启动,可以设置true和false
ensure                是否运行服务,running表示运行,stopped表示停止服务
name                守护进程的名字
path                启动脚本搜索路径
provider        默认为init
hasrestart        管理脚本是否支持restart参数,如果不支持,就用stop和start实现restart效果
hasstatus        管理脚本是否支持status参数,Puppet用status参数来判断服务是否已经运行了,如果不支持status参数,Puppet利用查找运行进程列表里面是否有服务名称来判断服务是否运行
1、启动agenthttpd服务,停止nfs服务:
node default {
service {
"httpd":
ensure=> running,
"nfs":
ensure=> stopped,
}
}
2、启动agenthttpd服务并且开机启动,停止nfs服务,开机不启动:
node default {
service {
"httpd":
ensure=> running,
enable=> true,
"nfs":
ensure=> stopped,
enable=> false,
}
}
 
七、Puppet exec 资源案例
Puppetexec资源主要用于安户端远程执行命令或者软件安装等,相当于shell的调用,exec是一次性执行资源,在不同类里面exec名字可以相同。
Puppet exec 资源支持参数:
parameters:
    command,creates,cwd,environment,group,logoutput,onlyif,path,
    refresh,refreshonly,returns,timeout,tries,try_sleep,umask,unless,user.
providers:posix,shell,vindows.
command        指定要执行的系统命令
creates                指定命令所生成的文件
cwd                指定命令执行目录,如果目录不存在,则命令执行失败
group                执行命令运行的账户组
logoutput        是否记录输出
onlyif                exec只会在onlyif 设定的命令返回0时才执行
path                命令执行的搜索路径
refresh =>true|false        刷新命令执行状态
refreshonly =>true|false        该属性可以使命令变成仅刷新触发
returns                指定返回的代码
timeout                命令运行的最长时间
tries                命令执行重试次数,默认为1
try_sheep        设置命令重试的间隔时间,单位为s
user                指定执行命令的账户
provider        shell和windows
environment        为命令设定额外的环境变量,要注意的是如果设定path,path的属性会被覆盖
1、agent服务器执行tar解压Nginx软件包:
node default {
exec {
'Agenttar xzf nginx-1.12.0.tar.gz':
path=> ["/usr/bin","/bin"],
user= > 'root',
group=> 'root',
timeout=> '10',
command=> 'tar -xzf /tmp/nginx-1.12.0.tar.gz',
}
}
2、agent服务器远程执行auto_install_nginx.sh脚本:
node default {
file {
"/tmp/auto_install_nginx.sh":
source=> "puppet://134.tang.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/sh","/bin"],
}
}
3、agent服务器更新sysctl.conf,如果该文件发生改变,则执行命令sysctl -p :
node default {
file {
"/etc/sysctl.conf":
source=> "puppet://134.tang.com/files/sysctl.conf",
owner=> "root",
group=> "root",
mode=> "644",
}
exec {
"sysctlrefresh kernel config":
path=>["/usr/bin","/usr/sbin","/bin","/sbin"],
command=> "/sbin/sysctl -p",
subscribe=> File["/etc/sysctl.conf"],
refreshonly=> true
}
}
 
八、Puppet cron 资源案例
Puppet cron资源主要用于安装和字管理crontab计划任务,每一个cron资源需要一个command属性和user属性以及至少一个周期属性(hour、minute、month、monthday、weekday)。
crontab计划任务的名称不是计划任务的一部分,它是Puppet用来存储和检索该资源。假如用户指定了一个除了名称其他的都和一个已经存在的计划任务相同,那么这两个计划任务被认为是等效的,并且新名称将会永久地与该计划任务相关联。
Puppet cron 资源支持参数详解:
parameters:
     command,ensure,environment,hour,minute,month,monthday,name,special,target,user,weekday.
providers:crontab
user                加某个用户的crontab任务,默认是运行Puppet的用户。
command        要执的命令或脚本路径,可不写,默认是title名称
ensure                表示该资源是否启用,可设置成true或false
environment        crontab环境里面指定的环境变量
hour                设置crontab的小时,可设置成0~23
minute                指定crontab的分钟,可设置成0~59
month                设置crontab运行的月份,可设置成1~12
monthday        指定月的天数可设置成1~31
name                crontab的名字,区分不同的crontab
provider        可用的provider有crontab默认的crontab程序
target                crontab作业存放的位置
weekday        设置crontab的星期数,可设置成0~7,其中周日为0
1、agent服务器添加ntpdate时间同步任务:
node default {
cron {
"ntpdate":
command=> "/usr/sbin/netdate pool.ntp.org",
user=> "root",
hour=> 0,
minute=> 0,
}
}
2、agent服务器删除ntpdate时间同步任务:
node default {
cron {
"ntpdate":
command=> "/usr/sbin/ntpdate pool.ntp.org",
user=> root,
hour=> 0,
minute=> 0,
ensure=> absent,
}
}
 
九、Puppet 自动认证
配置自动颁发证书需在Puppet服务器端的puppet.conf配置文件main 段加入如下代码:
[main]
autosign = true
重启Puppetmaster服务,并且删除已有的证书:
/etc/init.d/puppetmasterrestart
puppet cert --clean135.tang.com
删除Puppet客户端SSL文件,重新生成SSL文件:
rm -rf/var/lib/puppet/ssl/
puppet agent--server=134.tang.com --test
Puppet服务端会自动认证,即服务器端不必手动颁发证书,减轻人工的干预和操作。
 
十、Puppet 客户端自动同步
Puppet客户端安装完,并且认证完之后,如果在Puppet 服务端配置了node信息,客户端启动服务,默认30min自动与服务端同步信息,如果要修改同步的时间频率,修改Puppet 客户端配置信息即可。
Puppet 客户端配置Puppet相关参数和同步时间,修改/etc/sysconfig/puppet配置文件:
# The puppetmasterserver
PUPPET_SERVER=134.tang.com
#If you wish to Specifysyslog to send log message to the system log.
PUPPET_LOG=/var/log/puppet/puppet.log
#You may specify otherparameters to the puppet client here
PUPPET_EXTRA_OPTS=--waitforcert=500
/etc/sysconfig/puppet配置文件参数详解:、
PUPPET_SERVER=134.tang.com                        指定Puppetmaster主机名
PUPPET_PORT=8140                                指定Puppetmaster端口
PUPPET_LOG=/var/log/puppet/puppet.log        Puppet客户端日志路径
PUPPET_EXTRA_OPTS=--waitforcert=500                获取Puppetmaster证书返回等待时间
重启Puppet客户端服务,客户端会半小时跟服务器同步一次配置信息:
/etc/init.d/puppetrestart
可以修改与服务器同步配置信息的时间,修改vim/etc/puppet/puppet.conf文件,在[agent]段加入如下语句,表示60s与Puppet master同步一次配置信息,重启Puppet:
[agent]
runinterval = 60
 
十一、Puppet 服务端主动推送
服务器端如果更新了配置信息,想立即同步给客户端,可以使用Puppetmaster主动推送的方式,让客户端即时更新服务器端最新的配置信息。
Puppet服务器端使用puppet run命令可以给客户端发送一段信号,告诉客户端立刻跟服务器同步配置信息:
1、修改Puppet客户端配置文件/etc/puppet/puppet.conf,在agent段加入如下代码:
[agent]
listen = true
2、修改Puppet客户端配置文件/etc/sysconfig/puppet,指定Puppet master端主机名:
PUPPET_SERVER =134.tang.com
3、创建Puppet客户端配置文件namespaceauth.conf:
[puppetrunner]
allow *
4、修改Puppet客户端配置文件auth.conf,在path /前添加如下代码:
path /run
method save
allow *
5、重启Puppet 客户端:
/etc/init.d/puppetrestart
6、Puppet服务端执行如下命令,通知客户端来同步配置,也可以批量通知其他客户端,只需将客户端的主机名写入host.txt文件:
puppet kick -d135.tang.com
#puppet kick -d `cathost.txt`
 
Puppet 批量部署案例
十二、Puppet 批量修改静态IP案例
现需要修改100台服务器原DHCP动态获取的IP为staticIP地址,首先需要修改IP脚本,将该脚本推送到客户端,然后执行脚本并重启网卡即可。
1、修改IP为静态IP的shell脚本:
#!/bin/bash
#auto Change ip netmaskgateway scripts
#Define Path variables
ETHCONF=/etc/sysconfig/network-scripts/ifcfg-eth0
DIR=/data/backup/`date+ %Y%m%d`
IPADDR=`ifconfig |grepinet|grep 192|head -1|cut -d: -f2|awk '{print $1}'`
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}'`.2">>$EHTCONF
echo"The IP configuration success.!"
sevicenetwork restart
fi
2、Puppet master 执行kick推送配置至agent服务器远程,Puppet 客户端修改IP脚本代码:
node default {
file {
"/tmp/auto_change_ip.sh":
source=> "puppet://134.tang.com/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"],
}
}
 
十三、Puppet 批量配置NTP同步服务器
在100台服务器上配置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地址。
class ntp {
Exec  { path =>"/bin:/sbin:/bin/sh:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"}
exec{
"autochange 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和nodes.pp,横块入口文件以及node配置段。
modules.pp配置文件内容如下:
import "ntp"
nodes.pp配置文件内容如下:
node default {
includentp
}
3、在site.pp中加载导入modules.pp和nodes.pp名称,site.pp代码如下:
import"modules.pp"
import"nodes.pp"
4、Puppet master执行kick推送配置至agent服务器远程。
puppet kick -d --host`cat hosts.txt`
 
十四、Puppet 自动部署及同步网站
企业生产环境100台服务器,所有服务器要求数据一致,可以采用rsync同步,配置rsync服务器端,客户端执行脚本命令即可,同样可以使用Puppet+ shell脚本来同步,这样比较快捷,也可以使用Puppet rsync模块。
1、Puppet服务器端配置,/etc/puppet/modules/www/manifests/init.pp代码如下:
class www {
Exec {path =>"/bin:/sbin:/bin/sh:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"}
file {
"/data/sh/rsync_www_client.sh":
source =>"puppet://134.tang.com/files/www/rsync_www_client.sh",
owner =>"root",
group =>"root",
mode =>"755",
}
file {
"/etc/rsync.pas":
source =>"puppet://134.tang.com/files/www/rsync.pas",
owner =>"root",
group =>"root",
mode =>"600",
}
exec {
"auto backup wwwdata":
command =>"mkdir -p /data/backup/`date + %Y%m%d`;mv /data/index/data/backup/www/`date + %Y%m%d`;/bin/sh /data/sh/rsync_www_client.sh",
ueer =>"root",
subscribe =>File["/data/sh/rsync_www_client.sh"],
refreshonly =>"true",
  }
}
2、在/etc/puppet/manifests目录创建两个文件,分别为modules.pp和nodes.pp,模块入口文件以及node配置段。
modules.pp配置文件内容如下:
import "www"
nodes.pp配置文件内容如下:
node /^tang\d+ {
include www
}
3、在site.pp中加载导入modules.pp和nodes.pp名称,site.pp代码如下:
import"modules.pp"
import"nodes.pp"
Puppet master端批量执行通知客户端来同步配置:
puppet kick -d --host`cat hosts.txt`
4、cathosts.txt内容为需要同步的客户端主机名:
tang3
tang4
tang5
... ...