IaC 原理
声明式配置与幂等性的设计理念。
基础设施即代码(Infrastructure as Code)是一种将基础设施管理代码化的实践,让您可以像管理应用代码一样管理基础设施。
声明式配置
什么是声明式
声明式配置关注"期望状态",而非"执行步骤"。
命令式(传统方式):
# 执行一系列命令
yum install postgresql
systemctl start postgresql
createdb mydb
createuser myuser
声明式(IaC 方式):
# 声明期望状态
pg_databases:
- name: mydb
pg_users:
- name: myuser
优势
- 可读性:配置即文档,一目了然
- 可重复:相同配置产生相同结果
- 可审计:配置变更可追踪
- 可版本控制:使用 Git 管理配置历史
幂等性
什么是幂等性
幂等性意味着:多次执行相同操作,结果与执行一次相同。
# 第一次执行:创建集群
./pgsql.yml -l pg-test
# 第二次执行:检查并调整到期望状态(无变化则不操作)
./pgsql.yml -l pg-test
# 结果相同:pg-test 集群处于期望状态
为什么重要
- 安全重试:失败后可以安全地重新执行
- 配置漂移修复:自动将系统调整回期望状态
- 增量变更:只修改需要变更的部分
配置层次
Pigsty 采用三层配置覆盖机制:
┌─────────────────────────────────────────────────┐
│ 全局配置 (all.vars) │
│ 适用于所有集群的默认值 │
└─────────────────────┬───────────────────────────┘
│ 覆盖
┌─────────────────────▼───────────────────────────┐
│ 集群配置 (cluster.vars) │
│ 特定集群的定制配置 │
└─────────────────────┬───────────────────────────┘
│ 覆盖
┌─────────────────────▼───────────────────────────┐
│ 实例配置 (host.vars) │
│ 特定实例的精细配置 │
└─────────────────────────────────────────────────┘
示例
all:
vars:
pg_version: 16 # 全局默认:PG 16
children:
pg-oltp:
vars:
pg_conf: oltp.yml # 集群级别:OLTP 模板
hosts:
10.10.10.11:
pg_seq: 1
pg_role: primary
10.10.10.12:
pg_seq: 2
pg_role: replica
pg_conf: tiny.yml # 实例级别:覆盖为 tiny 模板
剧本机制
Ansible 剧本
Pigsty 使用 Ansible 剧本实现声明式配置:
./pgsql.yml # PostgreSQL 模块剧本
./infra.yml # 基础设施模块剧本
./node.yml # 节点模块剧本
./etcd.yml # ETCD 模块剧本
执行流程
1. 读取配置清单(pigsty.yml)
↓
2. 解析变量和主机分组
↓
3. 按任务顺序执行
↓
4. 检查当前状态 vs 期望状态
↓
5. 仅执行必要的变更
↓
6. 报告执行结果
最佳实践
版本控制
# 初始化 Git 仓库
cd ~/pigsty
git init
git add pigsty.yml
git commit -m "Initial configuration"
# 记录每次变更
git add pigsty.yml
git commit -m "Add pg-test cluster"
环境分离
pigsty/
├── pigsty.yml # 当前环境配置
├── conf/
│ ├── prod.yml # 生产环境
│ ├── staging.yml # 预发环境
│ └── dev.yml # 开发环境
配置验证
# 语法检查
ansible-playbook pgsql.yml --syntax-check
# 干运行(不实际执行)
ansible-playbook pgsql.yml --check
# 差异对比
ansible-playbook pgsql.yml --diff