通过前面的大型网站架构了解,一个网站系统会有很多节点及资源,如何对如此大规模资源进行监控?如果有节点出现故障,如何快速恢复?
这需要运维工具,运维工具也分类:
- OS Provisioning(PXE,Cobbler):操作系统自动安装配置;
- OS Configuration(ansible,puppet,saltstack,chef,cfengine):操作系统配置,安装应用软件包,配置软件等;
- Command and Control(func,ansible,fabric):命令与控制,对系统及软件的调试、控制、监控、报告等;
从个人角度理解,就是一台机器从操作系统到应用软件到最终运行的全套自动化恢复、配置、运行、监控的过程工具。OS Provisioning就是操作系统的自动安装恢复,一个系统中一个节点出现故障,要能够自动安装恢复其上的操作系统,或是新增一个硬件裸节点,要能在其上按要求自动安装操作系统;OS Configuration就是在操作系统自动安装/恢复完毕后,要自动安装/恢复其上的应用软件;Command and Control就是对应用软件等的配置与监控,确保运行正常,并处于监控中;
puppet:IT基础设施自动化管理工具
可管理IT整个生命周期:
Provisioning :供应
Configuration :配置
orchestration : 联动
reporting :报告
puppet有agent,其工作模式为:master/agent
master:puppet server
agent:真正执行相应管理操作的核心部件;周期性的去master请求与自己相关的配置;
puppet工作模式:
声明性、基于模型:
定义(Define):使用puppet配置语言定义基础配置信息,配置语言是一种编程语言(puppetDSL);
模拟(Simulation):即正式生效前进行模拟性应用,测试正确性;
强制(Enforce):正式部署配置,强制当前系统与定义的目标状态保持一致;
报告(Report):部署执行后的状态反馈,通过puppet api将执行结果发送给接收者;
puppet的三个层次:三层模型

配置语言:专用的声明性的配置语言,而且是基于模型(抽象资源)来进行构建的配置机制;
事务层:资源之间可能有依赖关系,事务层保证操作的完整性;如httpd配置改变后,一般需要重新启动或重新加载配置等;
资源抽象层:把主机上每一个可被管理的对象进行抽象,即不同的被管理对象被分类归属为不同的资源,一般按如下进行抽象:
资源类型:如用户、组、文件、服务、cron任务等:File、User、Group、Host、Package、Service、Cron、Exec等;
属性及状态与其实现方式分离;
期望状态;
通过抽象资源的方式,使得每台机器能够"清楚"其本身"应该"是什么"状态",而客户端根据当前是否达到这个状态,即期望状态与现实状态的差异,决定采取指定的动作。
puppet的核心组件:资源
资源清单:manifest,定义了资源的一个文件,叫做manifest。
模块:module,资源清单及清单中的资源定义的所依赖文件、模版等数据按特定结构组织起即为"模块",相当于ansible中的角色role,可以理解为更大尺度上的一个资源清单包。其主要是实现代码的重用,即资源清单的重用。

一个资源清单中定义了一堆的资源,包括了资源的类型、属性、期望状态等,因为清单本身就是一种编程语言,所以要经过编译过程,形成伪代码,就叫catalog,类似java编译后的字节码,然后在agent节点上应用,即apply这个catalog,也就相当于运行程序,执行状态查询,根据查询的状态,执行目标状态,最后报告结果。(在ruby虚拟机上运行catalog)。

agent请求catalog时,会同时发送主机名和facts,所谓facts,就是agent节点的一些属性信息,这可以与http请求,即request进行类比,浏览器发送请求时,在请求头中携带的信息,如客户端的IP、浏览器类型等,实际上就是这里的facts,只不过二者的信息内容不同罢了。
前面讲的puppet中属性及状态与其实现方式分离是什么意思呢?其实就是说,agent节点可能是多种不同的主机,如windows、redhat、Ubuntu等,如果资源清单中定义了一个package资源,就是要安装这个包,那么,不同的系统其实现是不同的,这就是属性及状态与实现分离。实现由agent根据不同的系统,进行不同处理实现。
在master/agent架构中,master与agent之间是基于HTTPS协议,以XMLRPC远程过程调用实现通信的,基于证书进行认证、通信。master会作为CA中心,agent向其申请证书。
puppet安装与使用:
因为puppet可以只运行于agent,单节点运行,这可以让我们专注于manifest资源清单的理解与编写,在理解了资源清单、资源、属性、状态、类、模块等概念后,再将其运行于master/agent架构中,会有更好的学习效果。
puppet安装:
在阿里云上有puppet镜像下载,提供的最低版本是puppet5:
https://mirrors.aliyun.com/puppet/yum/puppet5/el/7/x86_64/
包括如下软件包:可通过yum info xxx 查看相关包的功用。
pkd-1.xx :Puppet Development Kit,是puppet开发工具
puppet-agent-5.xx :The Puppet Agent package contains all of the elements needed to run puppet, including ruby, facter,hiera and mcollective。puppet的agent,单节点安装这个包应该就可以。
puppet-bolt-0.xx :Stand alone task runner。网上资料:bolt 是 Puppet 公司推出的开源自动化工具,用于在远程系统上执行一次性任务或编排多步骤操作。它采用无代理架构,通过 SSH(Linux/Unix)或 WinRM(Windows)连接目标节点,支持使用任意语言(如 Bash、PowerShell、Python 等)编写任务脚本。我的理解,就是一个类ansible。
puppet-client-tools-1.xx :PuppetDB CLI for querying Puppet data。是Puppet 5+ 版本中的一个独立软件包,用于分离客户端工具与完整 Puppet Agent 安装。
puppet5-release-5.xx :Release packages for the Puppet5 repository。
puppetdb-5.xx :Puppet Labs puppetdb.存储节点信息的数据库。
*PuppetDB作为基础设施自动化平台的核心数据存储组件,通过高效的数据处理机制与灵活的扩展能力,为大规模节点管理提供可靠支撑。
一、PuppetDB的技术定位与核心价值
在基础设施即代码(IaC)的实践场景中,自动化平台需要处理数以万计节点的配置数据、运行时状态及关联关系。传统关系型数据库在应对这种高频写入、复杂查询的混合负载时,常面临性能瓶颈与扩展性挑战。PuppetDB通过针对性设计解决了这一难题:
数据模型适配性:支持目录数据(Catalog)、事实数据(Facts)及自定义扩展类型,覆盖节点配置、软件包状态、硬件属性等全维度信息
异步处理机制:采用最终一致性模型,通过命令队列缓冲写入压力,确保系统在高并发场景下的稳定性
多存储引擎支持:提供嵌入式HSQLDB(适合开发测试)与生产级PostgreSQL双引擎选择,满足不同规模场景需求
二、系统架构深度解析
- 三层组件模型
命令处理层:接收来自Puppet Master的replace catalog、store report等命令,通过消息队列实现FIFO顺序处理
存储子系统:采用CQRS(命令查询职责分离)模式,写模型聚焦数据变更效率,读模型优化查询性能
REST接口层:提供标准化的CRUD接口,支持/pdb/query/v4等端点下的资源检索与聚合操作 - 数据处理流程示例
sequenceDiagram
Puppet Master->>Command Processor: POST /commands (replace catalog)
Command Processor->>Message Queue: 持久化命令
Message Queue->>Storage Writer: 触发CQRS写操作
Storage Writer->>PostgreSQL: 更新catalogs表
User->>REST API: GET /pdb/query/v4/nodes
REST API->>Storage Reader: 执行预编译查询
Storage Reader-->>User: 返回JSON格式节点列表 - 性能优化关键技术
索引策略:对certname、environment等高频查询字段建立复合索引
分区设计:按时间维度对报告数据(reports)进行表分区,提升历史数据查询效率
缓存机制:在REST接口层实现查询结果缓存,TTL可配置为5-30分钟
三、核心功能实现指南 - 多维度数据查询
- 布尔运算与嵌套查询
- 扩展数据类型支持*
puppetdb-termini-5.xx :Termini for puppetdb.
用于实现 Puppet Master 与 PuppetDB 集成的关键组件,其主要功能如下:
核心功能:
提供 Puppet 术语(terminus)实现:
替代旧版 ActiveRecord 后端:
在 Puppet 5 之前,Puppet 使用 ActiveRecord 库将配置数据存储在关系型数据库中;puppetdb-termini-5 作为现代替代方案,提供更高效、可扩展的数据存储机制 。
支持导出资源(Exported Resources)和库存服务(Inventory Service):
使节点能够查询其他节点的事实信息,并通过 <<| |>> 语法收集跨节点的资源,实现动态配置编排 。
与 Puppet Master 无缝集成:
安装后,Puppet Master 可通过配置文件(如 /etc/puppet/puppetdb.conf 和 /etc/puppet/routes.yaml)自动将运行时数据推送到 PuppetDB 。
puppetserver-5.xx :Puppet Labs puppetserver.
razor-server-1.xx :Razor is an advanced provisioning application。
agent单节点安装puppet-agent-5.0.0:其包含了以下组件

yum install puppet-agent-5.0.0


安装后的可执行文件在/opt/puppetlabs下,需在PATH环境变量中增加。如在~/.bash_profile中,设置:PATH=PATH:HOME/bin:/opt/puppetlabs/bin:
保存后执行source .bash_profile
puppet命令用法:

puppet有众多子命令,其中describe用于显示资源类型:
puppet describe [-h|--help] [-s|--short] [-p|--providers] [-l|--list] [-m|--meta]
列出所有的资源类型:
puppet describe -l

查看具体资源:
puppet describe resource_name
如puppet describe package
puppet资源定义:
定义资源:
type {'title':
attribute => value,
........
}
type只能是小写字符;title是一个字符串,在同一类型中必须惟一;每一个属性之间需要用","隔开,最后一个","可省略。
puppet 从以下三个维度来对资源完成抽象:
- 相似的资源被抽象成同一种资源"类型",如程序包资源、用户资源及服务资源等;
- 将资源属性或状态的描述与其实现方式剥离开来,如仅说明安装一个程序包而不用关心其具体是通过yum、pkgadd、ports或是其它方式实现;
- 仅描述资源的目标状态,也即期望其实现的结果,而不是其具体过程,如"确定nginx 运行起来" 而不是具体描述为"运行nginx命令将其启动起来";
这三个也被称作puppet 的资源抽象层(RAL)
RAL 由type( 类型) 和provider( 提供者,即不同OS 上的特定实现)组成。
资源属性中的三个特殊属性:
Name/Namevar:可简称为name;
ensure:资源的目标状态;
Metaparameters:元参数或元属性;
puppet资源清单:
创建清单文件:后缀一般为.pp
test1.pp:

应用资源清单,使用puppet apply命令,帮助:puppet help apply
puppet apply [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose]
-e\|--execute\] \[--detailed-exitcodes\] \[-L\|--loadclasses
-l\|--logdest syslog\|eventlog\|\
--catalog \
ACTIONS:
build Build a module release package.
changes Show modified files of an installed module.
generate Generate boilerplate for a new module.
install Install a module from the Puppet Forge or a release archive.
list List installed modules
search Search the Puppet Forge for a module.
uninstall Uninstall a puppet module.
upgrade Upgrade a puppet module.

通过上述命令结果,默认的模块路径有三个。
创建一个自己的模块,如叫做nginx:
mkdir -pv /etc/puppetlabs/code/modules/nginx/{manifest,files,templates,tests,lib,spec}

只是创建了一堆目录,就有了一个模块。在其中添加内容:在manifests中创建init.pp,files中增加静态文件,templates增加模版文件等。
使用模块中的类:
puppet apply --modulepath=/root/dev/modules -e "include ntpd::server"