跳至主要内容

后端类型:pg

将状态存储在 PostgreSQL 数据库 版本 10 或更高版本中。

此后端支持 状态锁定

示例配置

代码块
terraform {
backend "pg" {
conn_str = "postgres://user:[email protected]/tofu_backend"
}
}

在使用 tofu init 初始化后端之前,数据库必须已经存在

代码块
createdb tofu_backend

createdb 命令位于 PostgreSQL 客户端应用程序 中,这些应用程序与数据库服务器一起安装。

使用环境变量

建议使用环境变量来配置 pg 后端,以避免将敏感凭据写入磁盘并提交到源代码管理。

pg 后端支持标准 libpq 环境变量

可以通过将整个配置作为环境变量提供来配置后端

代码块
terraform {
backend "pg" {}
}
代码块
$ export PG_CONN_STR=postgres://user:[email protected]/tofu_backend
$ tofu init

或者仅配置敏感参数

代码块
terraform {
backend "pg" {
conn_str = "postgres://db.example.com/tofu_backend"
}
}
代码块
$ export PGUSER=user
$ read -s PGPASSWORD
$ export PGPASSWORD
$ tofu init

数据源配置

要在另一个配置中使用 pg 远程状态,请使用 terraform_remote_state 数据源

代码块
data "terraform_remote_state" "network" {
backend = "pg"
config = {
conn_str = "postgres://localhost/tofu_backend"
}
}

配置变量

支持以下配置选项或环境变量

  • conn_str - PostgreSQL 连接字符串;一个 postgres:// URL。PG_CONN_STR标准 libpq 环境变量也可以用来指示如何连接到 PostgreSQL 数据库。
  • schema_name - 自动管理的 PostgreSQL 架构的名称,默认为 terraform_remote_state。也可以使用 PG_SCHEMA_NAME 环境变量设置。
  • skip_schema_creation - 如果设置为 true,则 PostgreSQL 架构必须已经存在。也可以使用 PG_SKIP_SCHEMA_CREATION 环境变量设置。OpenTofu 不会尝试创建架构,这在数据库管理员已经创建了架构时很有用。
  • skip_table_creation - 如果设置为 true,则 PostgreSQL 表必须已经存在。也可以使用 PG_SKIP_TABLE_CREATION 环境变量设置。OpenTofu 不会尝试创建表,这在数据库管理员已经创建了表时很有用。
  • skip_index_creation - 如果设置为 true,则 PostgreSQL 索引必须已经存在。也可以使用 PG_SKIP_INDEX_CREATION 环境变量设置。OpenTofu 不会尝试创建索引,这在数据库管理员已经创建了索引时很有用。

技术设计

此后端在 schema_name 变量配置的自动管理的 PostgreSQL 架构中创建了一个名为 states 的表。

该表以 工作区 名称作为键。如果未使用工作区,则使用名称 default

锁定通过 PostgreSQL 咨询锁 支持。不支持 force-unlock,因为这些数据库本机锁将在会话中止或连接失败时自动解锁。若要查看 PostgreSQL 服务器中的未决锁,请使用 pg_locks 系统视图

states 表包含

  • 一个序列整数id,用作咨询锁的键
  • 工作区name键作为文本,具有唯一索引
  • OpenTofu 状态data 作为文本