这是本节的多页打印视图。 .
声明式配置 —— 基础设施即代码(IaC)
Pigsty 遵循 IaC 与 GitOPS 的理念:使用声明式的 配置清单 描述整个环境,并通过 幂等剧本 来实现。
用户用声明的方式通过 参数 来描述自己期望的状态,而剧本则以幂等的方式调整目标节点以达到这个状态。 这类似于 Kubernetes 的 CRD & Operator,然而 Pigsty 在裸机和虚拟机上,通过 Ansible 实现了这样的功能。
Pigsty 诞生之初是为了解决超大规模 PostgreSQL 集群的运维管理问题,背后的想法很简单 —— 我们需要有在十分钟内在就绪的服务器上复刻整套基础设施(100+数据库集群 + PG/Redis + 可观测性)的能力。 任何 GUI + ClickOps 都无法在如此短的时间内完成如此复杂的任务,这让 CLI + IaC 成为唯一的选择 —— 它提供了精确,高效的控制能力。
配置清单 pigsty.yml 文件描述了整个部署的状态,无论是 生产环境(prod),预发环境(staging), 测试环境(test),还是 开发环境(devbox),
基础设施的区别仅在于配置清单的不同,而部署交付的逻辑则是完全相同的。
您可以使用 git 对这份部署的 “种子/基因” 进行版本控制与审计,而且,Pigsty 甚至支持将配置清单以数据库表的形式存储在 PostgreSQL CMDB 中, 更进一步从 Infra as Code 升级为 Infra as Data,无缝与您现有的工作流程集成与对接。
IaC 面向专业用户与企业场景而设计,但也针对个人开发者,SMB 进行了深度优化。 即使您并非专业 DBA,也无需了解这几百个调节开关与旋钮,所有参数都带有表现良好的默认值, 您完全可以在 零配置 的情况下,获得一个开箱即用的单机数据库节点; 简单地再添加两行 IP 地址,就能获得一套企业级的高可用的 PostgreSQL 集群。
声明模块
以下面的默认配置片段为例,这段配置描述了一个节点 10.10.10.10,其上安装了 INFRA、NODE、ETCD 和 PGSQL 模块。
要真正安装这些模块,执行以下剧本:
声明集群
您可以声明 PostgreSQL 数据库集群,在多个节点上安装 PGSQL 模块,并使其成为一个服务单元:
例如,要在以下三个已被 Pigsty 纳管的节点上,部署一个使用流复制组建的三节点高可用 PostgreSQL 集群,
您可以在配置文件 pigsty.yml 的 all.children 中添加以下定义:
定义完后,可以使用 剧本 将集群创建:

你可以使用不同的实例角色,例如 主库(primary),从库(replica),离线从库(offline),延迟从库(delayed),同步备库(sync standby); 以及不同的集群:例如 备份集群(Standby Cluster),Citus 集群,甚至是 Redis / MINIO(Silo) / Etcd 集群
定制集群内容
您不仅可以使用声明式的方式定义集群,还可以定义集群中的数据库、用户、服务、HBA 规则 等内容,例如,下面的配置文件对默认的 pg-meta 单节点数据库集群的内容进行了深度定制:
包括:声明了六个业务数据库与七个业务用户,添加了一个额外的 standby 服务(同步备库,提供无复制延迟的读取能力),定义了一些额外的 pg_hba 规则,一个指向集群主库的 L2 VIP 地址,与自定义的备份策略。
声明访问控制
您还可以通过声明式的配置,深度定制 Pigsty 的 访问控制 能力。例如下面的配置文件对 pg-meta 集群进行了深度安全定制:
使用三节点核心集群模板:crit.yml,确保数据一致性有限,故障切换数据零丢失。
启用了 L2 VIP,并将数据库与连接池的监听地址限制在了本地环回 IP + 内网 IP + VIP 三个特定地址。
模板强制启用了 Patroni API 与 Pgbouncer 的 SSL,并在 HBA 规则中强制要求使用 SSL 访问数据库集群。
同时还在 pg_libs 中启用了 $libdir/passwordcheck 扩展,来强制执行 密码强度策略。
最后,还单独声明了一个 pg-meta-delay 集群,作为 pg-meta 在一个小时前的延迟镜像从库,用于紧急数据误删恢复。
Citus 分布式集群
下面是一个四节点的 Citus 分布式集群的声明式配置:
Redis 集群
下面给出了 Redis 主从集群、哨兵集群、以及 Redis Cluster 的声明配置样例
ETCD 集群
下面给出了一个三节点的 Etcd 集群声明式配置样例:
MINIO(Silo)集群
下面给出了一个三节点 Silo 集群的声明式配置样例。清单分组与参数继续沿用 MINIO 模块的兼容命名:
1 - 配置清单
每一套 Pigsty 部署都对应着一份 配置清单 (Inventory),描述了基础设施与数据库集群的关键属性。
配置文件
Pigsty 默认使用 Ansible YAML 配置格式,
使用一个单一 YAML 配置文件 pigsty.yml 作为配置清单。
您可以直接修改该配置文件来定制您的部署,或者使用 Pigsty 提供的 配置向导 configure 脚本自动生成合适的配置文件。
配置结构
配置清单使用标准的 Ansible YAML 配置格式,由两部分组成:全局参数 (all.vars)和多个 组(all.children)。
您可以在 all.children 中定义新集群,并使用全局变量描述基础设施:all.vars,它看起来像这样:
集群定义
每个 Ansible 组可能代表一个集群,可以是节点集群、PostgreSQL 集群、Redis 集群、Etcd 集群或 Silo 集群等…
集群定义由两部分组成:集群成员 (hosts)与 集群参数(vars)。
您可以在 <cls>.hosts 中定义集群成员,并在 <cls>.vars 中使用 配置参数 描述集群。
下面是一个 3 节点高可用 PostgreSQL 集群的定义示例:
集群级别的 vars (集群参数)将覆盖全局参数,实例级别的 vars 将覆盖集群参数和全局参数。
拆分配置
如果您的部署规模较大,或者希望更好地组织配置文件, 可以将配置清单 拆分为多个文件,便于管理与维护。
您可以将集群成员定义放在 hosts.yml 文件中,将集群层面的 配置参数 放在 group_vars 目录下的对应文件中。
切换配置
您可以在执行剧本的时候,通过 -i 参数,临时指定另外的配置清单文件。
此外,Ansible 支持多种配置方式,您可以使用本地 yaml|ini 配置文件,或者是 CMDB 与任意的动态配置脚本作为配置源。
在 Pigsty 中,我们通过 Pigsty 主目录中的 ansible.cfg
指定同目录下的 pigsty.yml 作为默认的 配置清单,您可按需修改。
此外,Pigsty 还支持使用 CMDB 元数据库 来存储配置清单,便于与现有系统对接整合。
2 - 配置向导
Pigsty 提供了一个 configure 脚本作为 配置向导,它能根据当前环境,自动生成合适的 pigsty.yml 配置文件。
这是一个 可选 的脚本:如果您已经了解了如何配置 Pigsty,大可以直接编辑 pigsty.yml 配置文件,跳过向导。
快速开始
进入 pigsty 源码家目录中,执行 ./configure 即可自动运行配置向导。不带任何参数时,默认使用 meta 单节点配置模板:
该命令会以选定的模板为基础,检测当前节点的 IP 地址与区域,并生成适合当前环境的 pigsty.yml 配置文件。
功能说明
configure 脚本会根据环境与输入执行以下调整,并默认在 Pigsty 目录下生成 pigsty.yml 配置文件。
- 检测当前节点 IP 地址,如果有多个 IP,则要求用户输入一个 首要的 IP 地址 作为当前节点的身份标识
- 使用 IP 地址替换配置模板中的占位符
10.10.10.10,并将其配置为admin_ip参数的值。 - 检测当前区域,将
region设置为default(全球默认仓库)或china(使用中国镜像仓库) - 针对小微实例(vCPU < 4),为
node_tune和pg_conf参数使用tiny参数模板,优化资源使用。 - 如果指定了
-vPG 大版本,将pg_version与模板中的pg18-*包组别名切换到对应大版本;mssql、polar、pg19是固定内核模板,不执行该替换。 - 如果指定了
-g参数,将配置向导识别的默认密码替换为随机生成的强密码;仍需按 默认凭证清单 检查未覆盖的凭据。(强烈推荐) - 当 PG 大版本 ≥ 17 时优先使用内置的
C.UTF-8Locale,次选由操作系统支持的C.UTF-8。 - 检测当前环境中,用于执行部署的核心依赖
ansible是否可用 - 同时检测部署目标节点是否 ssh 可达,并可以使用 sudo 执行命令。(
-s跳过)
使用示例
命令参数
参数详解
| 参数 | 说明 |
|---|---|
-c, --conf | 从 conf/<template>.yml 生成配置文件,支持子目录如 ha/full |
-i, --ip | 用指定 IP 替换配置模板中的占位符 10.10.10.10 |
-v, --version | 指定 PostgreSQL 大版本号(14-19);PG19 为 Beta,建议直接使用 pg19 模板 |
-r, --region | 设置软件仓库镜像区域:default(默认)、china(中国镜像)、europe(欧洲镜像) |
-o, --output | 指定输出文件路径,默认为 pigsty.yml;相对路径基于 Pigsty 目录,绝对路径原样使用 |
-s, --skip | 跳过 IP 探测、目标节点 SSH/Sudo 检查与实质 IP 替换,保留 10.10.10.10 占位符 |
-x, --proxy | 将当前环境的代理变量(HTTP_PROXY、HTTPS_PROXY、ALL_PROXY、NO_PROXY)写入配置 |
-n, --non-interactive | 非交互模式;单 IP 或演示 IP 可自动选择,多 IP 歧义时需配合 -i |
-p, --port | 指定环境检查所用 SSH 端口;不会自动把 ansible_port 写入输出配置 |
-g, --generate | 为配置文件中的密码生成随机值,提高安全性(强烈推荐) |
执行流程
configure 脚本按照以下顺序执行检测与配置:
自动化行为
区域检测
脚本会自动检测网络环境,判断是否在中国大陆(GFW 内):
- 如果可以访问 Google,使用
region: default默认镜像 - 如果 Google 不可达但
https://pigsty.cc可达,设置region: china使用国内镜像 - 如果两者都不可达,回退到
region: default并给出网络不可达警告 - 可通过
-r参数手动指定区域
IP 地址处理
脚本按以下优先级确定主 IP 地址:
- 命令行参数:如果通过
-i指定了 IP,直接使用 - 单 IP 探测:如果当前节点只有一个 IP,自动使用
- 演示 IP 检测:如果检测到
10.10.10.10,自动选择(用于沙箱环境) - 交互式输入:多个 IP 时,提示用户选择或输入
低端硬件优化
当检测到 CPU 核心数小于 4(即 1~3 核)时,脚本会自动调整配置:
这样可以确保在低配虚拟机上也能顺利运行。
Locale 设置
脚本会在以下情况自动启用 C.UTF-8 作为默认 Locale:
- PostgreSQL 版本 ≥ 17(内置 Locale Provider 支持)
- 或者 当前系统支持
C.UTF-8/C.utf8Locale
中国区特殊处理
当区域设置为 china 时,脚本会自动:
- 启用
docker_registry_mirrorsDocker 镜像加速 - 启用
PIP_MIRROR_URLPython 镜像加速
密码生成
使用 -g 参数时,脚本会为以下密码生成 24 位随机字符串:
| 密码参数 | 说明 |
|---|---|
grafana_admin_password | Grafana 管理员密码 |
pg_admin_password | PostgreSQL 管理员密码 |
pg_monitor_password | PostgreSQL 监控用户密码 |
pg_replication_password | PostgreSQL 复制用户密码 |
patroni_password | Patroni API 密码 |
haproxy_admin_password | HAProxy 管理密码 |
minio_secret_key | Silo Root Secret |
etcd_root_password | ETCD Root 密码 |
同时还会替换以下占位符密码:
DBUser.Meta→ 随机密码DBUser.Viewer→ 随机密码S3User.Backup→ 随机密码S3User.Meta→ 随机密码S3User.Data→ 随机密码DBUser.Supa→ 随机密码Vibe.Coding→ 随机密码
配置模板
脚本从 conf/ 目录读取配置模板。-c 的值是相对于 conf/、不带 .yml 后缀的路径,例如 ha/full、app/immich。
核心模板
| 模板 | 说明 |
|---|---|
meta | 默认模板:单节点安装,包含 INFRA + NODE + ETCD + PGSQL |
rich | 功能丰富版:包含几乎所有扩展、Silo、本地仓库 |
slim | 精简版:仅 PostgreSQL + ETCD,无监控基础设施 |
fat | 完整版:rich 基础上安装更多扩展 |
pgsql | 纯 PostgreSQL 模板 |
pg19 | PostgreSQL 19 Beta 单节点试用模板 |
infra | 纯基础设施模板 |
高可用模板 (ha/)
| 模板 | 说明 |
|---|---|
ha/dual | 2 节点高可用集群 |
ha/trio | 3 节点高可用集群 |
ha/full | 4 节点完整沙箱环境 |
ha/safe | 安全加固版高可用配置 |
ha/octo | 8 节点紧凑高可用仿真 |
ha/simu | 20 节点生产仿真环境 |
ha/citus | 13 节点 Citus 分布式集群 |
应用模板
| 模板 | 说明 |
|---|---|
supabase | Supabase 自托管配置 |
app/dify | Dify AI 平台配置 |
app/odoo | Odoo ERP 配置 |
app/electric | Electric 同步引擎配置 |
app/insforge | Insforge 后端平台配置 |
app/hindsight | Hindsight 应用配置 |
app/teable | Teable 表格数据库配置 |
app/mattermost | Mattermost 协作平台配置 |
app/maybe | Maybe 财务应用配置 |
app/registry | Docker Registry 配置 |
app/immich | Immich 相册与视频管理配置 |
app/jumpserver | JumpServer 堡垒机配置 |
特殊内核模板/模式
| 模板 | 说明 |
|---|---|
ivory | IvorySQL:Oracle 兼容 PostgreSQL |
mssql | Babelfish:SQL Server 兼容 PostgreSQL |
polar | PolarDB:阿里云开源分布式 PostgreSQL |
ha/citus | Citus:分布式 PostgreSQL 高可用集群 |
mysql | OpenHalo:MySQL 协议兼容 PostgreSQL |
pgtde | Percona PostgreSQL Server:透明加密 |
oriole | OrioleDB:新一代存储引擎 |
agens | AgensGraph:图数据库内核 |
pgedge | pgEdge:分布式 PostgreSQL 内核 |
mongo | MongoDB 兼容栈模板 |
演示与构建模板
| 模板 | 说明 |
|---|---|
vibe | Vibe Coding 开发环境模板 |
docker | Docker 容器内运行模板 |
demo/bare | 最小可读单节点配置示例 |
demo/el | EL 系发行版完整参数示例 |
demo/debian | Debian/Ubuntu 完整参数示例 |
demo/demo | 多模块演示环境配置 |
demo/kernel | 十节点数据库内核矩阵 |
demo/redis | Redis 主从、哨兵与原生集群演示 |
demo/minio | Silo(源码默认)多节点多盘集群演示 |
demo/kafka | Kafka KRaft 开发与安全集群演示 |
demo/mysql | 原生 MySQL 8.4 试点演示 |
demo/remote | 远程 PostgreSQL/RDS 监控示例 |
demo/saas | 传统单节点 SaaS 组件组合示例 |
demo/wool | 中国区低配云主机示例 |
build/oss | 跨发行版开源软件包构建环境 |
build/dev | 三节点开发与构建环境 |
输出示例
环境变量
脚本支持以下环境变量:
| 环境变量 | 说明 | 默认值 |
|---|---|---|
PIGSTY_HOME | Pigsty 安装目录 | ~/pigsty |
METADB_URL | 元数据库连接 URL | service=meta |
HTTP_PROXY | HTTP 代理 | - |
HTTPS_PROXY | HTTPS 代理 | - |
ALL_PROXY | 通用代理 | - |
NO_PROXY | 代理白名单 | 内置默认值 |
注意事项
免密访问:运行
configure前,确保当前用户具有免密 sudo 权限和免密 SSH 到本机的能力。可以通过bootstrap脚本自动配置。IP 地址选择:请选择 内网 IP 作为主 IP 地址,不要使用公网 IP 或
127.0.0.1。密码安全:生产环境 务必 修改配置文件中的默认密码。可以使用
-g参数随机化向导识别的凭据,并按 默认凭证清单 检查其余值。配置检查:脚本执行完成后,建议检查生成的
pigsty.yml文件,确认配置符合预期。多次执行:可以多次运行
configure重新生成配置,每次会覆盖现有的pigsty.yml。macOS 限制:在 macOS 上运行时,脚本会跳过部分 Linux 特有的检测,并使用占位符 IP
10.10.10.10。macOS 只能作为管理节点使用。
常见问题
如何使用自定义配置模板?
将您的配置文件放到 conf/ 目录下,然后使用 -c 参数指定:
如何为多集群生成不同配置?
使用 -o 参数指定不同的输出文件:
然后在执行剧本时指定配置文件:
非交互模式下如何处理多 IP?
必须使用 -i 参数明确指定 IP 地址:
如何保留模板中的占位符 IP?
使用 -s 参数跳过 IP 替换:
相关文档
3 - 配置参数
在 配置清单 中,您可以使用各种参数对 Pigsty 进行精细化定制。这些参数涵盖了从基础设施设置到数据库配置的各个方面。
参数列表
按照当前源码与参数参考页对账,Pigsty 的 10 个正式模块共有 373 个公开参数,用于精细控制系统的各个方面;完整列表见 参考-参数列表。原生 MySQL 8.4 试点模块的 13 个公开参数单列,不计入该合计。
| 模块 | 参数组 | 参数数 | 说明 |
|---|---|---|---|
| PGSQL | 9 | 124 | PostgreSQL 高可用集群配置 |
| INFRA | 10 | 73 | 软件仓库与 Victoria 可观测基础设施 |
| NODE | 11 | 73 | 节点初始化、系统调优与运维基线 |
| ETCD | 2 | 13 | ETCD 集群与移除保护参数 |
| MINIO | 2 | 22 | Silo 部署、观测与移除参数 |
| REDIS | 2 | 22 | Redis/Valkey 部署与移除参数 |
| DOCKER | 1 | 8 | Docker 引擎参数 |
| JUICE | 1 | 2 | JuiceFS 实例与缓存参数 |
| VIBE | 1 | 18 | Code/Jupyter/Node.js/Claude/Codex 配置 |
| KAFKA | 2 | 18 | Kafka 部署参数与移除保护参数 |
参数形式
参数 是用于描述实体的 键值对。键(Key)是字符串,值(Value)可以是五种类型之一:布尔值、字符串、数字、数组或对象。
参数优先级
参数可以在不同级别设置,具有以下优先级:
| 级别 | 位置 | 描述 | 优先级 |
|---|---|---|---|
| 命令行 | -e 命令行参数 | 通过命令行传入 | 最高 (5) |
| 主机/实例 | <group>.hosts.<host> | 特定于单个主机的参数 | 较高 (4) |
| 分组/集群 | <group>.vars | 组/集群中主机共享的参数 | 中等 (3) |
| 全局 | all.vars | 所有主机共享的参数 | 较低 (2) |
| 默认 | <roles>/default/main.yml | 角色实现默认值 | 最低 (1) |
以下是关于参数优先级的一些示例:
- 执行剧本时,使用命令行参数
-e grafana_clean=true来抹除 Grafana 数据 - 使用主机变量上的实例级别参数
pg_role覆盖 pg 实例角色 - 使用组变量上的集群级别参数
pg_cluster覆盖 pg 集群名称。 - 使用全局变量上的全局参数
node_ntp_servers指定全局 NTP 服务器 - 如果没有设置
pg_version,Pigsty 将使用pgsql角色实现的默认值(默认为18)
除了 身份参数 外,每个参数都有适当的默认值,因此无需显式设置。
身份参数
身份参数是特殊的参数,它们会作为实体的 ID 标识符,因此 没有默认值,必须 显式设置。
| 模块 | 身份参数 |
|---|---|
PGSQL | pg_cluster, pg_seq, pg_role, … |
NODE | nodename, node_cluster |
ETCD | etcd_cluster, etcd_seq |
MINIO | minio_cluster, minio_seq |
REDIS | redis_cluster, redis_node, redis_instances |
INFRA | infra_seq |
例外是 etcd_cluster 仍有默认值 etcd。
对象存储的 minio_cluster 已不再提供默认值,必须在每个对象存储集群的变量中显式定义;
不要放在 all.vars 中,否则会把所有主机标记为 MINIO 模块成员。
4 - 配置模板
在 Pigsty 中,部署的蓝图细节由 配置清单 所定义,也就是 pigsty.yml 配置文件,您可以通过声明式配置进行定制。
然而,直接编写配置文件可能会让新用户望而生畏。为此,我们提供了一些开箱即用的配置模板,涵盖了常见的使用场景。
每一个模板都是一个预定义的 pigsty.yml 配置文件,包含了适用于特定场景的合理默认值。
您可以根据自己的需要,选择一个模板作为定制起点,然后根据需要进行修改,以满足您的具体需求。
使用模板
Pigsty 提供了 configure 脚本作为可选的配置向导,它将根据您的环境和输入,生成具有良好默认值的 配置清单。
使用 ./configure -c <conf> 指定配置模板,其中 <conf> 是相对于 conf 目录的路径(可省略 .yml 后缀)。
如果不指定模板,Pigsty 默认使用 meta.yml 单节点配置模板。
模板列表
主要模板
以下是单节点配置模板,可用于在单台服务器上安装 Pigsty:
| 模板 | 说明 |
|---|---|
meta.yml | 默认模板,单节点 PostgreSQL 在线安装 |
rich.yml | 富功能模板,包含本地软件源、Silo 及更多示例 |
slim.yml | 精简模板,仅安装 PostgreSQL,不含监控与基础设施 |
数据库内核模板
适用于各类数据库管理系统与内核的模板:
| 模板 | 说明 |
|---|---|
pgsql.yml | 原生 PostgreSQL 内核,基础功能 (14~18) |
pg19.yml | PostgreSQL 19 Beta 专用试用模板 |
mssql.yml | Babelfish 内核,兼容 SQL Server 协议 (17/18) |
polar.yml | PolarDB PG 内核,Aurora/RAC 风格 (17) |
ivory.yml | IvorySQL 内核,兼容 Oracle 语法 (18) |
mysql.yml | OpenHalo 内核,兼容 MySQL (14) |
pgtde.yml | Percona PostgreSQL Server 透明加密 (18) |
oriole.yml | OrioleDB 内核,OLTP 增强 (16~18) |
agens.yml | AgensGraph 图数据库内核 (17) |
pgedge.yml | pgEdge 分布式数据库内核 (15~18,默认 18) |
supabase.yml | Supabase 自托管配置 (15~18) |
您可以后续添加更多节点,或使用 高可用模板 在一开始就规划好集群。
高可用模板
您可以配置 Pigsty 在多节点上运行,组成高可用(HA)集群:
| 模板 | 说明 |
|---|---|
dual.yml | 2 节点半高可用部署 |
trio.yml | 3 节点标准高可用部署 |
full.yml | 4 节点标准部署 |
safe.yml | 4 节点安全增强部署,含延迟从库 |
octo.yml | 8 节点紧凑高可用仿真 |
simu.yml | 20 节点生产环境模拟 |
ha/citus.yml | Citus 分布式高可用 PostgreSQL (14~18) |
应用模板
您可以使用以下模板运行 Docker 应用/软件:
| 模板 | 说明 |
|---|---|
supabase.yml | 启动单节点 Supabase |
odoo.yml | 启动 Odoo ERP 系统 |
dify.yml | 启动 Dify AI 工作流系统 |
electric.yml | 启动 Electric 同步引擎 |
insforge.yml | 启动 Insforge 后端平台 |
hindsight.yml | 启动 Hindsight 应用 |
mattermost.yml | 启动 Mattermost 协作平台 |
teable.yml | 启动 Teable 表格数据库 |
maybe.yml | 启动 Maybe 财务应用 |
registry.yml | 启动 Docker Registry |
演示模板
除主要模板外,Pigsty 还提供了一组面向不同场景的演示模板:
| 模板 | 说明 |
|---|---|
el.yml | EL 8/9 系统的全参数配置文件 |
debian.yml | Debian/Ubuntu 系统的全参数配置文件 |
remote.yml | 监控远程 PostgreSQL 集群或 RDS 的示例配置 |
redis.yml | Redis 集群示例配置 |
minio.yml | 4 节点 Silo(源码默认)多盘集群示例 |
kafka.yml | 单节点开发集群 + 三节点安全集群的 Kafka dynamic KRaft 示例 |
mysql.yml | 原生 MySQL 8.4 单节点/三节点试点示例;不同于 OpenHalo conf/mysql.yml |
demo.yml | Pigsty 公开演示站 的配置文件 |
fat.yml | 含本地软件源与完整功能的单节点配置文件 |
infra.yml | 仅部署基础设施模块 |
vibe.yml | Vibe Coding / AI 应用开发模板 |
mongo.yml | FerretDB / MongoDB 兼容示例 |
docker.yml | Docker 应用宿主模板 |
构建模板
以下配置模板用于开发和测试目的:
| 模板 | 说明 |
|---|---|
build/oss.yml | EL 9/10、Debian 12/13、Ubuntu 22.04/24.04/26.04 开源构建配置 |
build/dev.yml | 开发测试构建配置 |
5 - 元数据库
Pigsty 允许您使用 PostgreSQL 元数据库 作为动态配置源,取代静态的 YAML 配置文件,实现更强大的配置管理能力。
概览
CMDB(Configuration Management Database,配置管理数据库)是一种将配置信息存储在数据库中进行管理的方式。
在 Pigsty 中,默认的配置源是一个静态 YAML 文件 pigsty.yml,
它作为 Ansible 的 配置清单 使用。
这种方式简单直接,但当基础设施规模扩大、需要复杂精细的管理与外部集成时,单一的静态文件难以满足需求。
| 特性 | 静态 YAML 文件 | CMDB 元数据库 |
|---|---|---|
| 查询能力 | 手工搜索/grep | SQL 任意条件查询,聚合分析 |
| 版本控制 | 依赖 Git 或手工备份 | 数据库事务,审计日志,时间旅行快照 |
| 权限控制 | 文件系统权限,粗粒度 | PostgreSQL 数据库 精细访问控制 |
| 并发编辑 | 需要锁文件或合并冲突 | 数据库事务天然支持并发 |
| 外部集成 | 需要解析 YAML | 标准 SQL 接口,任意语言轻松对接 |
| 规模扩展 | 文件过大时难以维护 | 管理规模伸缩至物理极限 |
| 动态生成 | 静态文件,修改后需手动应用 | 即时生效,实时反映配置变更 |
Pigsty 在样板数据库 pg-meta.meta 的模式基线定义中,提供了 Pigsty CMDB 的数据库模式。
工作原理
CMDB 的核心思想是用一个 动态脚本 替换静态配置文件。
Ansible 支持使用可执行脚本作为配置清单,只要脚本输出符合 JSON 格式的清单数据即可。
当您启用 CMDB 后,Pigsty 会创建一个名为 inventory.sh 的动态清单脚本:
这个脚本的作用很简单:每次 Ansible 需要读取配置清单时,它会从 PostgreSQL 数据库的 pigsty.inventory 视图中查询配置数据,并以 JSON 格式返回。
整体架构如下:
flowchart LR
conf["bin/inventory_conf"]
tocmdb["bin/inventory_cmdb"]
load["bin/inventory_load"]
ansible["🚀 Ansible"]
subgraph static["📄 静态配置模式"]
yml[("pigsty.yml")]
end
subgraph dynamic["🗄️ CMDB 动态模式"]
sh["inventory.sh"]
cmdb[("PostgreSQL CMDB")]
end
conf -->|"切换"| yml
yml -->|"加载配置"| load
load -->|"写入"| cmdb
tocmdb -->|"切换"| sh
sh --> cmdb
yml --> ansible
cmdb --> ansible数据模型
CMDB 的数据库模式定义在 files/cmdb.sql 文件中,所有对象都位于 pigsty 模式下。
核心数据表
| 表名 | 说明 | 主键 |
|---|---|---|
pigsty.group | 集群/分组定义,对应 Ansible 的 group | cls |
pigsty.host | 主机定义,属于某个分组 | (cls, ip) |
pigsty.global_var | 全局变量,对应 all.vars | key |
pigsty.group_var | 分组变量,对应 all.children.<cls>.vars | (cls, key) |
pigsty.host_var | 主机变量,对应主机级别的变量 | (cls, ip, key) |
pigsty.default_var | 默认变量定义,存储参数的元信息 | key |
pigsty.job | 作业记录表,记录执行的任务 | id |
表结构详解
集群表 pigsty.group
主机表 pigsty.host
全局变量表 pigsty.global_var
分组变量表 pigsty.group_var
主机变量表 pigsty.host_var
核心视图
CMDB 提供了一系列视图,用于查询和展示配置数据:
| 视图名 | 说明 |
|---|---|
pigsty.inventory | 核心视图:生成 Ansible 动态清单 JSON |
pigsty.raw_config | 原始配置的 JSON 格式展示 |
pigsty.global_config | 全局配置视图,合并默认值和全局变量 |
pigsty.group_config | 分组配置视图,包含主机列表和分组变量 |
pigsty.host_config | 主机配置视图,合并分组和主机级别变量 |
pigsty.pg_cluster | PostgreSQL 集群视图 |
pigsty.pg_instance | PostgreSQL 实例视图 |
pigsty.pg_database | PostgreSQL 数据库定义视图 |
pigsty.pg_users | PostgreSQL 用户定义视图 |
pigsty.pg_service | PostgreSQL 服务定义视图 |
pigsty.pg_hba | PostgreSQL HBA 规则视图 |
pigsty.pg_remote | 远程 PostgreSQL 实例视图 |
pigsty.inventory 是最核心的视图,它将数据库中的配置数据转换为 Ansible 所需的 JSON 格式:
工具脚本
Pigsty 提供了三个便利脚本来管理 CMDB:
| 脚本 | 功能 |
|---|---|
bin/inventory_load | 将 YAML 配置文件加载到 PostgreSQL 数据库中 |
bin/inventory_cmdb | 切换配置源为 CMDB(动态清单脚本) |
bin/inventory_conf | 切换配置源为静态配置文件 pigsty.yml |
inventory_load
将 YAML 配置文件解析并导入到 CMDB 中:
脚本会执行以下操作:
- 清空
pigsty模式中的现有数据 - 解析 YAML 配置文件
- 将全局变量写入
global_var表 - 将集群定义写入
group表 - 将集群变量写入
group_var表 - 将主机定义写入
host表 - 将主机变量写入
host_var表
环境变量
PIGSTY_HOME:Pigsty 安装目录,默认为~/pigstyMETADB_URL:数据库连接 URL,默认为service=meta
inventory_cmdb
切换 Ansible 使用 CMDB 作为配置源:
脚本会执行以下操作:
- 创建动态清单脚本
${PIGSTY_HOME}/inventory.sh - 修改
ansible.cfg将inventory设置为inventory.sh
生成的 inventory.sh 内容如下:
inventory_conf
切换回使用静态 YAML 配置文件:
脚本会修改 ansible.cfg 将 inventory 设置回 pigsty.yml。
使用流程
首次启用 CMDB
- 初始化 CMDB 模式(通常在安装 Pigsty 时已自动完成):
- 加载配置到数据库:
- 切换到 CMDB 模式:
- 验证配置:
查询配置
启用 CMDB 后,您可以使用 SQL 灵活查询配置:
修改配置
您可以直接通过 SQL 修改配置:
修改后立即生效,无需重新加载或重启任何服务。
切换回静态配置
如需切换回静态配置文件模式:
高级用法
配置导出
将 CMDB 中的配置导出为 YAML 格式:
或者使用 ansible-inventory 命令:
配置审计
利用 mtime 字段追踪配置变更:
与外部系统集成
CMDB 使用标准 PostgreSQL,可以轻松与其他系统集成:
- Web 管理界面:通过 REST API(如 PostgREST)暴露配置数据
- CI/CD 流水线:在部署脚本中直接读写数据库
- 监控告警:基于配置数据生成监控规则
- ITSM 系统:与企业 CMDB 系统同步
注意事项
数据一致性:修改配置后,需要重新执行相应的 Ansible 剧本才能将变更应用到实际环境
备份:CMDB 中的配置数据非常重要,请确保定期备份
权限:建议为 CMDB 配置适当的数据库访问权限,避免误操作
事务:批量修改配置时,建议在事务中进行,以便出错时回滚
连接池:
inventory.sh脚本每次执行都会建立新连接,如果 Ansible 执行频繁,建议考虑使用连接池
小结
CMDB 是 Pigsty 配置管理的高级方案,适用于需要管理大量集群、复杂查询、外部集成或精细权限控制的场景。通过将配置数据存储在 PostgreSQL 中,您可以充分利用数据库的强大能力来管理基础设施配置。
| 功能 | 说明 |
|---|---|
| 数据存储 | PostgreSQL pigsty 模式 |
| 动态清单 | inventory.sh 脚本 |
| 配置加载 | bin/inventory_load |
| 切换到 CMDB | bin/inventory_cmdb |
| 切换到 YAML | bin/inventory_conf |
| 核心视图 | pigsty.inventory |