IaC 原理

声明式配置与幂等性的设计理念。

基础设施即代码(Infrastructure as Code)是一种将基础设施管理代码化的实践,让您可以像管理应用代码一样管理基础设施。


声明式配置

什么是声明式

声明式配置关注"期望状态",而非"执行步骤"。

命令式(传统方式):

# 执行一系列命令
yum install postgresql
systemctl start postgresql
createdb mydb
createuser myuser

声明式(IaC 方式):

# 声明期望状态
pg_databases:
  - name: mydb
pg_users:
  - name: myuser

优势

  1. 可读性:配置即文档,一目了然
  2. 可重复:相同配置产生相同结果
  3. 可审计:配置变更可追踪
  4. 可版本控制:使用 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