# 声明配置

> 使用声明式的配置来描述数据库集群与基础设施
---

> **Pigsty将基础设施和数据库视为代码**：Database as Code & Infra as Code

你可以通过声明式的接口/配置文件来描述基础设施和数据库集群，你只需在 [配置清单](#配置清单) （Inventory） 中描述你的需求，然后用简单的幂等剧本使其生效即可。


----------------

## 配置概览

Pigsty 使用



----------------

## 配置清单

每一套 Pigsty 部署都有一个相应的 **配置清单**（Inventory）。它可以以 [YAML](https://docs.ansible.com/ansible/2.9/user_guide/playbooks_variables.html) 的形式存储在本地，并使用 `git` 管理；或从 [CMDB](https://docs.ansible.com/ansible/2.9/user_guide/intro_dynamic_inventory.html) 或任何 ansible 兼容的方式动态生成。

Pigsty 默认使用一个名为 [`pigsty.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/pigsty.yml) 的单体 YAML 配置文件作为默认的配置清单，它[**位于**](https://github.com/Vonng/pigsty/blob/v2.7.0/ansible.cfg#L3) Pigsty 源码主目录下，但你也可以通过命令行参数 `-i` 指定路径以使用别的配置清单。

清单由两部分组成：**全局变量** 和多个 **组定义** 。 前者 `all.vars` 通常用于描述基础设施，并为集群设置全局默认参数。后者 `all.children` 则负责定义新的集群（PGSQL/Redis/MinIO/ETCD等等）。一个配置清单文件从最顶层来看大概如下所示：

```yaml
all:                  # 顶层对象：all
  vars: {...}         # 全局参数
  children:           # 组定义
    infra:            # 组定义：'infra'
      hosts: {...}        # 组成员：'infra'
      vars:  {...}        # 组参数：'infra'
    etcd:    {...}    # 组定义：'etcd'
    pg-meta: {...}    # 组定义：'pg-meta'
    pg-test: {...}    # 组定义：'pg-test'
    redis-test: {...} # 组定义：'redis-test'
    # ...
```




----------------

## 集群

每个组定义通常代表一个集群，可以是节点集群、PostgreSQL 集群、Redis 集群、Etcd 集群或 Minio 集群等。它们都使用相同的格式：`hosts` 和 `vars`。
你可以用 `all.children.<cls>.hosts` 定义集群成员，并使用 `all.children.<cls>.vars` 中的集群参数描述集群。以下是名为 `pg-test` 的三节点 PostgreSQL 高可用集群的定义示例：

```yaml
pg-test:   # 集群名称
  vars:    # 集群参数
    pg_cluster: pg-test
  hosts:   # 集群成员
    10.10.10.11: { pg_seq: 1, pg_role: primary } # 实例1，在 10.10.10.11 上，主库
    10.10.10.12: { pg_seq: 2, pg_role: replica } # 实例2，在 10.10.10.12 上，从库
    10.10.10.13: { pg_seq: 3, pg_role: offline } # 实例3，在 10.10.10.13 上，从库
```

你也可以为特定的主机/实例定义参数，也称为实例参数。它将覆盖集群参数和全局参数，实例参数通常用于为节点和数据库实例分配身份（实例号，角色）。



----------------

## 参数

全局变量、组变量和主机变量都是由一系列 **键值对** 组成的字典对象。每一对都是一个命名的参数，由一个字符串名作为键，和一个值组成。值是五种类型之一：布尔值、字符串、数字、数组或对象。查看[配置参数](/zh/docs/reference/param)以了解详细的参数语法语义。

绝大多数参数都有着合适的默认值，**身份参数** 除外；它们被用作标识符，并必须显式配置，例如 [`pg_cluster`](/zh/docs/reference/param#pg_cluster)， [`pg_role`](/zh/docs/reference/param#pg_role)，以及 [`pg_seq`](/zh/docs/reference/param#pg_seq)。

参数可以被更高优先级的同名参数定义覆盖，优先级如下所示：

```bash
命令行参数 > 剧本变量  >  主机变量（实例参数）  >  组变量（集群参数）  >  全局变量（全局参数） >  默认值
```

例如：

- 使用命令行参数 `-e pg_clean=true` 强制删除现有数据库
- 使用实例参数 `pg_role` 和 `pg_seq` 来为一个数据库实例分配角色与标号。
- 使用集群变量来为集群设置默认值，如集群名称 `pg_cluster` 和数据库版本 `pg_version`
- 使用全局变量为所有 PGSQL 集群设置默认值，如使用的默认参数和插件列表
- 如果没有显式配置 `pg_version` ，默认值 `16` 版本号会作为最后兜底的缺省值。



----------------

## 模板

在 Pigsty 的 [`files/pigsty`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/README.md) 目录中，有许多不同场景的预置配置模板可供参考选用。

在 [`configure`](/zh/docs/setup/install#配置) 过程中，您可以通过 `-m` 参数指定模板。否则会根据您的操作系统发行版环境自动选用对应的单节点安装配置模板。

- EL 8 / 9：[`el8.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/el8.yml) / [`el9.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/el9.yml)
- Debian 12：[`debian12.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/debian12.yml)
- Ubuntu 22.04 jammy：[`ubuntu22.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/ubuntu22.yml)

虽然 Pigsty 开源版本已经不再提供过时操作系统的官方支持，但对于老操作系统大版本，您依然可以使用以下两个模板进行安装：

- EL 7：[`el7.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/el7.yml)
- Debian 11 bullseye：[`debian11.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/debian11.yml)
- Ubuntu 20.04 focal：[`ubuntu20.yml`](https://github.com/Vonng/pigsty/blob/v2.7.0/files/pigsty/ubuntu20.yml)


----------------

## 切换配置源

要使用不同的配置模板，您可以将模板的内容复制到 Pigsty 源码目录的 `pigsty.yml` 文件中，并按需进行相应调整。

您也可以在执行 Ansible 剧本时，通过 `-i` 命令行参数，显式指定使用的配置文件，例如：

```bash
./node.yml -i files/pigsty/rpmbuild.yml    # 根据 rpmbuild 配置文件，初始化目标节点，而不是使用默认的 pigsty.yml 配置文件
```

如果您希望修改默认的配置文件名称与位置，您也可以修改源码根目录下的 [`ansible.cfg`](https://github.com/Vonng/pigsty/blob/v2.7.0/ansible.cfg#L6) 的 `inventory` 参数，将其指向您的配置文件路径，这样您就可以直接执行 `ansible-playbook` 命令而无需显式指定 `-i` 参数。

Pigsty 允许您使用数据库（CMDB）作为动态配置源，而不是使用静态配置文件。 Pigsty 提供了三个便利脚本：

- [`bin/inventory_load`](https://github.com/Vonng/pigsty/blob/v2.7.0/bin/inventory_load): 将 `pigsty.yml` 配置文件的内容加载到本机上的 PostgreSQL 数据库中（`meta`.`pigsty`）
- [`bin/inventory_cmdb`](https://github.com/Vonng/pigsty/blob/v2.7.0/bin/inventory_cmdb): 切换配置源为本地 PostgreSQL 数据库（`meta`.`pigsty`）
- [`bin/inventory_conf`](https://github.com/Vonng/pigsty/blob/v2.7.0/bin/inventory_cmdb): 切换配置源为本地静态配置文件 `pigsty.yml`



----------------

## 参考

Pigsty 带有 280+ 配置参数，分为以下32个参数组，详情请参考 [配置参数](/zh/docs/reference/param) 。

|                     模块                      | 参数组                                                       | 描述                      | 数量 |
|:-------------------------------------------:|-----------------------------------------------------------|-------------------------|----|
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`META`](/zh/docs/reference/param#meta)                   | Pigsty 元数据              | 4  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`CA`](/zh/docs/reference/param#ca)                       | 自签名公私钥基础设施 CA           | 3  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`INFRA_ID`](/zh/docs/reference/param#infra_id)           | 基础设施门户，Nginx域名          | 2  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`REPO`](/zh/docs/reference/param#repo)                   | 本地软件仓库                  | 9  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`INFRA_PACKAGE`](/zh/docs/reference/param#infra_package) | 基础设施软件包                 | 2  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`NGINX`](/zh/docs/reference/param#nginx)                 | Nginx 网络服务器             | 7  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`DNS`](/zh/docs/reference/param#dns)                     | DNSMASQ 域名服务器           | 3  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`PROMETHEUS`](/zh/docs/reference/param#prometheus)       | Prometheus 时序数据库全家桶     | 18 |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`GRAFANA`](/zh/docs/reference/param#grafana)             | Grafana 可观测性全家桶         | 6  |
|  [`INFRA`](/zh/docs/reference/param#infra)  | [`LOKI`](/zh/docs/reference/param#loki)                   | Loki 日志服务               | 4  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_ID`](/zh/docs/reference/param#node_id)             | 节点身份参数                  | 5  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_DNS`](/zh/docs/reference/param#node_dns)           | 节点域名 & DNS解析            | 6  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_PACKAGE`](/zh/docs/reference/param#node_package)   | 节点仓库源 & 安装软件包           | 5  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_TUNE`](/zh/docs/reference/param#node_tune)         | 节点调优与内核特性开关             | 10 |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_ADMIN`](/zh/docs/reference/param#node_admin)       | 管理员用户与SSH凭证管理           | 7  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_TIME`](/zh/docs/reference/param#node_time)         | 时区，NTP服务与定时任务           | 5  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_VIP`](/zh/docs/reference/param#node_vip)           | 可选的主机节点集群L2 VIP         | 8  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`HAPROXY`](/zh/docs/reference/param#haproxy)             | 使用HAProxy对外暴露服务         | 10 |
|   [`NODE`](/zh/docs/reference/param#node)   | [`NODE_EXPORTER`](/zh/docs/reference/param#node_exporter) | 主机节点监控与注册               | 3  |
|   [`NODE`](/zh/docs/reference/param#node)   | [`PROMTAIL`](/zh/docs/reference/param#promtail)           | Promtail日志收集组件          | 4  |
| [`DOCKER`](/zh/docs/reference/param#docker) | [`DOCKER`](/zh/docs/reference/param#docker)               | Docker容器服务（可选）          | 4  |
|   [`ETCD`](/zh/docs/reference/param#etcd)   | [`ETCD`](/zh/docs/reference/param#etcd)                   | ETCD DCS 集群             | 10 |
|  [`MINIO`](/zh/docs/reference/param#minio)  | [`MINIO`](/zh/docs/reference/param#minio)                 | MINIO S3 对象存储           | 15 |
|  [`REDIS`](/zh/docs/reference/param#redis)  | [`REDIS`](/zh/docs/reference/param#redis)                 | Redis 缓存                | 20 |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_ID`](/zh/docs/reference/param#pg_id)                 | PG 身份参数                 | 11 |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_BUSINESS`](/zh/docs/reference/param#pg_business)     | PG 业务对象定义               | 12 |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_INSTALL`](/zh/docs/reference/param#pg_install)       | 安装 PG 软件包 & 扩展          | 10 |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_BOOTSTRAP`](/zh/docs/reference/param#pg_bootstrap)   | 使用 Patroni 初始化 HA PG 集群 | 39 |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_PROVISION`](/zh/docs/reference/param#pg_provision)   | 创建 PG 数据库内对象            | 9  |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_BACKUP`](/zh/docs/reference/param#pg_backup)         | 使用 pgBackRest 设置备份仓库    | 5  |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_SERVICE`](/zh/docs/reference/param#pg_service)       | 对外暴露服务, 绑定 vip, dns     | 9  |
|  [`PGSQL`](/zh/docs/reference/param#pgsql)  | [`PG_EXPORTER`](/zh/docs/reference/param#pg_exporter)     | PG 监控，服务注册              | 15 |
