Puppet自动化运维
- Puppet是目前互联网主流三大自动化运维工具(Puppet、Ansible、Saltstack)之一,Puppet是一种Linux、UNIX平台的集中配置管理系统,所谓配置管理系统,就是管理机器里面诸如文件、用户、进程、软件包等资源,其设计目标是简化对这些资源的管理以及妥善处理资源间的依赖关系
Puppet入门简介
- Puppet是一种描述性语言来定义配置项,配置项中被称为'资源',描述性语言可以声明用户的配置状态,比如声明一个软件包应该被安装或一个服务应该被启动等
- Puppet可以运行在任何一台服务器端,每个客户端通过SSL证书连接到服务器端,得到本机器的配置列表,然后根据列表来完成配置工作,所以如果硬件性能比较高,维护管理上千上万台机器是非常轻松的,前提是客户端的配置、服务器路径、软件需要保持一致
- 在大规模的生产环境中,如果只有一台Puppet master,压力会非常大,因为 Puppet使用Ruby语言编写的,Ruby是解析 型语言,每个客户端来访问都要解析一次,当客户端服务器很多,会造成服务器端压力很大,所以需要扩展成一个服务器集群
- Puppet master可以看做一个Web服务器,实际也是由Ruby提供的Web服务器模块来做的.因此可以利用Web代理软件来配合 uppet master做集群设置,一般使用Nginx+Puppet master整合构建大型企业自动化运维工具,
- Puppet是开源的基于Ruby的系统配置管理工具, Puppet工作流程为 Puppet是一个C/S结构,所有的 Puppet客户端同一个服务器端的 Puppet通信,每个 Puppet客户端每半小时(可以设置)连接一次服务器端,下载最新的配置文件,并且严格按照配置文件来配置服务器,配置完成后 Puppet客户端可以反馈给服务器端一个消息,如果报错也会给服务器端反馈一个消息
Puppet工作原理
- 客户端 Puppetd调用本地facter,facter会探测出该主机的常用变量,例如主机名、内存大小、IP地址等.然后Puppetd把这些信息发送到Puppet服务端
- Puppet服务器检测到客户端的主机名,然后会检测mainfest中对应的node配置,并对这段内容进行解析,facter发送过来的信息可以作为变量进行处理
- Puppet服务端匹配Puppet客户端相关联的代码才能进行解析,其他的代码不解析,解析分为几个过程,首先是语法检查,然后会生成一个中间的伪代码,之后再把伪代码发给Puppet客户端
- Puppet客户端收到伪代码之后就会执行,执行完后会将执行的结果发送给Puppet服务端
- Puppet服务端再把客户端的执行结果写入日志
① 客户端puppet agent请求catalog,catalog其实就是被管理服务器对应的配置文件(经过处理过的配置文件),服务端master收到agent的请求,然后找到对应被管理服务器的"站点清单",或者被称为"主机清单",因为一台"被管理服务器"可能同时担任多个"角色",每个角色可能都会对应一个"manifest"(也就是清单),所以,我们可以为每一台被管理服务器配置一个"站点清单",站点清单也可以理解成为一种"清单",只是它是针对一台服务器而存在的一种清单。
② 服务端master找到被管理服务器的站点清单后,根据站点清单,找到对应服务器需要哪些"清单",因为一台服务器可能会需要多张"清单",上图中为了示例,只画出了一个清单,但是这不代表必定只有一个。
③ master将找到的所有"清单"进行处理,处理为catalog。
④ master将处理过的catalog发送到agent端。
⑤ agent收到master发送过来的catalog,然后,agent会查询"被管理服务器的当前状态",看看服务器的当前状态是否符合catalog中定义的目标状态。
⑥ 如果"被管理服务器的当前状态"与"catalog中定义的目标状态"一致,那么资源对应的操作将不会执行,如果"被管理服务器的当前状态"与"catalog中定义的目标状态"不一致,那么资源对应的操作将会执行,以便让"被管理服务器"达到管理员指定的"目标状态"。
⑦ 经过上一步的"状态判断",执行对应操作,不管执行是否成功,都会生成对应的报告信息。
⑧ agent将生成的报告信息发送给master端。
上述过程,就是puppet在master/agent模式下的工作流程,默认情况下,客户端每隔30分钟向服务端请求一次配置信息,然后根据服务端返回的配置信息,判断当前服务器是否处于管理员定义的目标状态,如果被管理的服务器不处于管理员定义的目标状态,则需要执行对应的操作,使得被管理主机最终处于管理员定义的目标状态,我们也可以不必每次都等待30分钟,可以从master端推送catalog到agent端,主动告诉agent端,配置已经发生了改变,请执行对应的操作
Puppet安装配置
- Puppet工作为C/S模式,构建Puppet平台需安装Puppet server端和client端,安装之前准备好系统环境
- 操作系统版本:CentOS 7.6
- 服务器ip:10.0.0.203 hostname:10-0-0-203
- 客户端ip:10.0.0.204 hostname:10-0-0-204
-
Puppet服务端安装
- Puppet服务器端需修改主机名称为10-0-0-203,并且在hosts文件添加主机名和本机IP的对应关系,如果本地局域网有DNS服务器,可以无需修改hosts文件
hostnamectl set-hostname 10-0-0-203
vim /etc/hosts # 添加如下内容
10.0.0.203 10-0-0-203
10.0.0.204 10-0-0-204
- Puppet服务端除了需要安装Puppet server外,还需要Ruby的支持,需要安装Ruby相关软件包,默认YUM安装Puppet server,会自动下载Ruby相关软件
rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm
yum install puppet-server -y # 此处有坑,在/etc/yum.repos.d/puppetlabs.repo文件中gpgcheck的值为1,需改为0
puppet master
/etc/init.d/iptables stop
setenforce 0
-
Puppet客户端安装
- Puppet客户端也需要修改主机名为10-0-0-204,并且在hosts文件添加主机名和本机IP的对应关系,如果本地局域网有DNS服务器,可以无需修改hosts文件
hostnamectl set-hostname 10-0-0-204 vim /etc/hosts # 添加如下内容 10.0.0.203 10-0-0-203 10.0.0.204 10-0-0-204
- Puppet服务端除了需要安装Puppet server外,还需要Ruby的支持,需要安装Ruby相关软件包,默认YUM安装Puppet server,会自动下载Ruby相关软件
rpm -ivh http://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-12.noarch.rpm yum install puppet -y puppet agent /etc/init.d/iptables stop setenforce 0
-
Puppet客户端申请证书
- Puppet客户端与Puppet服务端是通过SSL隧道通信的,客户端安装完成后,首次使用需向服务端申请Puppet通信证书,Puppet客户端第一次连接服务器端会发起证书申请,在Puppet客户端执行命令
puppet agent --server 10-0-0-203 --test
-
Puppet服务端颁发证书
- Puppet客户端向服务器发起证书申请,服务器端必须审核证书,如果不审核,客户端与服务端无法进行后续正常通信,Puppet服务器端颁发证书命令
puppet cert --list puppet cert -s 10-0-0-204 puppet cert --list --all
- puppet cert --list:查看证书申请的客户端主机名
- puppet cert -s 10-0-0-204:颁发证书给客户端
- puppet cert -s:为特定的主机颁发证书
- puppet cert -s and -a:给所有的主机颁发证书
- puppet cert --list --all:查看已经颁发的所有证书
Puppet案例
Puppet是基于C/S构架,服务端保存着所有对客户端服务器的配置代码,在Puppet服务端该配置文件叫manifest,客户端下载manifest后,可以根据manifest对客户端进行配置,例如软件包管理、用户管理、文件管理、命令管理、脚本管理等,Puppet主要基于各种资源或者模块来管理客户端
默认Puppet服务器端manifest在/etc/puppet/manifests下,只需在该目录下创建一个site.pp文件,然后写入相应的配置代码,Puppet客户端跟Puppet服务端同步时,会检查客户端node配置文件,配置之后会将该代码下载至客户端,对代码进行解析,然后在客户端执行
-
在Puppet客户端创建test.txt文件,并在该文件中写入测试内容
- Puppet服务端创建node代码,创建并编辑/etc/puppet/manifests/site.pp文件,文件中加入代码
vim /etc/puppet/manifests/site.pp node default { file { "/tmp/test.txt": content=>"Hello,world"; } }
- manifest site.pp配置详情
- node default:新建node节点,default表示所有主机,可修改为特定主机名
- file:基于file资源模块管理客户端文件或者目录操作
- "/tmp/test.txt":需在客户端文件创建的文件名
- content:客户端服务器文件内容
- 客户端执行同步命令,获取Puppet服务端node配置
puppet agent --server 10-0-0-203 --test
- 可能会报错,报错原因为服务器端与客户端时间不同步导致,需要同步时间
ntpdate ntp1.aliyun.com # 同步到阿里云时间 puppet agent --server 10-0-0-203 --test
- 客户端执行同步效果,执行日志如下,会在/tmp目录创建test.txt文件,内容为Hello,world,即证明Puppet客户端成功获取服务端node配置
Puppet常见资源与模块
- Puppet主要基于各种资源模块管理客户端,主流Puppet管理客户端资源模块如下
- file:主要负责管理文件
- package:软件包的安装管理
- service:系统服务的管理
- cron:配置自动任务计划
- exec:远程执行运行命令
- 通过命令puppet describe -l可以查看Puppet支持的所有资源和模块
- 通过命令puppet describe -s file可以查看Puppet file资源所有的帮助信息
Puppet file
Puppet file资源主要用于管理客户端文件,包括其内容、所有权和权限。“文件”类型可以管理普通文件、目录和符号链接; 类型应该在“ensure”属性中指定
-
文件内容可以直接用' content '属性来管理,或者使用“source”属性从远程源下载;后者也可以用来递归地为目录提供服务(当“recurse”属性设置为“true”或“local”)
- 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
- ensure:默认为文件或目录
- backup:通过filebucket备份文件
- checksum:检查文件是否被修改的方法
- ctime:只读属性,文件的更新时间
- mtime:只读属性,文件的修改时间
- content:文件的内容,与source和target互斥
- force:强制执行删除文件、软链接及目录的操作
- owner:用户名或用户ID
- group:指定文件名的用户组或组ID
- link:软链接
- mode:文件配置权限,通常采用数字符号
- path:文件路径
- before:表示需要依赖于某个资源
- require:表示应该先执行本资源,在执行别的资源
- notify:A notify B:B依赖于A,且A发生改变后会通知B
- subscribe:B subscribe A:B依赖于A,且B监控A资源的变化产生的事件;
-
案例
- 从Puppet服务器下载nginx.conf文件至客户端/tmp目录,首先需要将nginx.conf文件cp至/etc/puppet/files目录,然后在/etc/puppet/fileserver.conf中添加代码,并重启puppet master
[files] path /etc/puppet/files allow * # 创建site.pp文件 node default{ file{ "/tmp/nginx.conf": mode=>"644", owner=>"root", group=>"root", source=>"puppet://10-0-0-203/files/nginx.conf", } }
- 客户端同步配置
puppet agent --server 10-0-0-203 --test
- 从Puppet服务器下载sysctl.conf,如果客户端该文件存在则备份为sysctl.conf.bak,然后再覆盖原文件
# 创建site.pp文件
node default{
file{
"/etc/sysctl.conf":
source=>"puppet://10-0-0-203/files/sysctl.conf",
backup=>".bak_$uptime_seconds",
}
}
- 在agent上创建/tmp/file.txt的软链接为/opt/file_soft.txt
node default{
file{
"/tmp/file.txt":
ensure=>link,
target=>"/opt/file_soft.txt",
}
}
- 在agent上创建/tmp/20200329目录
node default{
file{
"/tmp/20200329":
ensure=>directory,
}
}
Puppet package资源
Puppet package资源主要用于管理客户端服务器的软件包,YUM源为//yum.repos.d/安装和升级操作,通过Puppet基于YUM自动安装软件包,所以需先配置好YUM源
-
常见的操作可以对软件包进行安装、卸载以及升级操作.Puppet package资源支持参数为:
- 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:指定安装具体的某个版本号
-
案例
- 客户端安装ntpdate及screen软件
node default{ package{ ["screen","ntp"]: ensure=>"installed", } }
- 客户端卸载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, openbsd,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利用查找运行进程列表里面是否有服务名来判断服务是否在运行
-
案例
- 启动agent httpd服务,停止nfs服务
node default{ service{ "httpd": ensure=>"running"; "nfs": ensure=>"stopped"; } }
- 启动httpd服务并且开机启动,停止nfs服务,开机不启动
node default{ service{ "httpd": ensure=>"running", enable=>true; "nfs": ensure=>"stopped", enable=>false; } }
Puppet exec资源
Puppet exec资源主要用于客户端远程执行命令或者软件安装等,相当于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, windows
- command:指定要执行的系统命令
- creates:指定命令所生成的文件
- cwd:指定命令执行目录,如果目录不存在,则命令执行失败
- group:执行命令运行的账户组
- logoutput:是否记录输出
- onlyif:exec只会在onlyif设定命令返回0时才执行
- path:命令执行的搜索路径
- refresh=>true|false:刷新命令执行状态
- refreshonly=>true|false:该属性可以使命令变成仅刷新触发
- returns:指定返回的代码
- timeout:命令运行的最长时间
- tries:命令重试次数,默认为1
- try_sleep:设置命令重试的间隔时间,单位为s
- user:指定执行命令的用户
- provider:shell和windows
- environment为命令设定额外的环境变量,要注意的是如果设定path,path 的属性会被覆盖
-
案例
- agent服务器执行tar解压Nginx软件包
node default{ exec{ "agent tar xf nginx-1.12.0.tar.gz": path=>["/usr/bin","/bin"], user=>"root", group=>"root", timeout=>"10", command=>"tar xf /tmp/nginx-1.12.0.tar.gz", } }
- agent服务器远程执行aotu_install_nginx.sh脚本
node default{
file{
"/tmp/aotu_install_nginx.sh":
source=>"puppet://10-0-0-203/files/aotu_install_nginx.sh",
owner=>"root",
group=>"root",
mode=>755,
}
exec{
"/tmp/aotu_install_nginx.sh":
cwd=>"/tmp",
user=>"root",
path=>["/usr/bin","/bin","/usr/sbin","/bin/sh"],
}
}
- 服务器更新sysctl.conf,如果该文件发送变化,则执行命令sysctl -p(使得修改信息生效)
node default{
file{
"/etc/sysctl.conf":
source=>"puppet://10-0-0-203/files/sysctl.conf",
owner=>"root",
group=>"root",
mode=>644,
}
exec{
"sysctl refresh kernel config":
path=>["/usr/bin","/bin","/usr/sbin","/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
-
案例
- agent服务器添加ntpdate时间同步任务
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,
}
}