Тип бэкенда: pg
Хранит состояние в базе данных Postgres версии 10 или новее.
Этот бэкенд поддерживает блокировку состояния.
В OpenTofu 1.10 изменился принцип блокировки при создании рабочих пространств. Небезопасно параллельно использовать бэкенд pg с несколькими версиями OpenTofu (ниже 1.10), если они используют одну и ту же базовую базу данных.
Пример конфигурации
terraform {
backend "pg" {
conn_str = "postgres://user:pass@db.example.com/tofu_backend"
}
}Перед инициализацией бэкенда с помощью tofu init база данных уже должна существовать:
createdb tofu_backend
Эта команда createdb доступна в клиентских приложениях Postgres, которые устанавливаются вместе с сервером базы данных.
Использование переменных среды
Мы рекомендуем использовать переменные среды для настройки бэкенда pg, чтобы конфиденциальные учетные данные не записывались на диск и не попадали в систему контроля версий.
Бэкенд pg поддерживает стандартные переменные среды libpq.
Бэкенд можно настроить, указав всю конфигурацию в переменной среды:
terraform {
backend "pg" {}
}$ export PG_CONN_STR=postgres://user:pass@db.example.com/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"
}
}Переменные конфигурации
Мы рекомендуем передавать учетные данные и другие конфиденциальные данные с помощью переменных среды. Если вы используете -backend-config или указываете эти значения непосредственно в конфигурации, OpenTofu включит их и в подкаталог .terraform, и в файлы планов. Подробнее см. в разделе Учетные данные и конфиденциальные данные.
Поддерживаются следующие параметры конфигурации или переменные среды:
-
conn_str— строка подключения Postgres; URLpostgres://. Для указания способа подключения к базе данных PostgreSQL также можно использовать переменные средыPG_CONN_STRи стандартные переменныеlibpq. -
schema_name— имя автоматически управляемой схемы Postgres; по умолчанию —terraform_remote_state. Также можно задать с помощью переменной средыPG_SCHEMA_NAME. Схемаpublicпо-прежнему будет использоваться для последовательности, создающей идентификаторы состояний. Подробнее см. в разделе о блокировках. -
skip_schema_creation— если задано значениеtrue, схема Postgres должна уже существовать. Также можно задать с помощью переменной средыPG_SKIP_SCHEMA_CREATION. OpenTofu не будет пытаться создать схему; это полезно, если она уже создана администратором базы данных. -
table_name— имя автоматически управляемой таблицы Postgres; по умолчанию —states. Также можно задать с помощью переменной средыPG_TABLE_NAME. -
skip_table_creation— если задано значениеtrue, таблица Postgres должна уже существовать. Также можно задать с помощью переменной средыPG_SKIP_TABLE_CREATION. OpenTofu не будет пытаться создать таблицу; это полезно, если она уже создана администратором базы данных. -
index_name— имя автоматически управляемого индекса Postgres; по умолчанию —states_by_name. Также можно задать с помощью переменной средыPG_INDEX_NAME. -
skip_index_creation— если задано значениеtrue, индекс Postgres должен уже существовать. Также можно задать с помощью переменной средыPG_SKIP_INDEX_CREATION. OpenTofu не будет пытаться создать индекс; это полезно, если он уже создан администратором базы данных.
Обратите внимание: при изменении table_name или schema_name потребуется вручную перенести существующие данные состояния.
Техническое устройство
Этот бэкенд создает таблицу с именем, заданным в table_name, в автоматически управляемой схеме Postgres, указанной в переменной schema_name.
Ключом таблицы служит имя рабочего пространства. Если рабочие пространства не используются, применяется имя default.
Блокировки поддерживаются с помощью рекомендательных блокировок Postgres. Команда force-unlock не поддерживается, поскольку эти блокировки на уровне базы данных автоматически снимаются при прерывании сеанса или потере соединения. Чтобы просмотреть активные блокировки на сервере Postgres, используйте системное представление pg_locks.
Рекомендательные блокировки используются в нескольких случаях: при обновлении состояния и при создании состояния. При обновлении состояния рекомендательная блокировка устанавливается с идентификатором состояния. В противном случае, при создании состояния (и рабочего пространства), она устанавливается с хешем имени схемы. Это позволяет различным конфигурациям бэкенда не влиять друг на друга при совместном использовании базы данных.
Таблица, используемая для хранения состояния, содержит:
- целочисленный серийный идентификатор
id, используемый в качестве ключа для рекомендательных блокировок - ключ
nameрабочего пространства типа text с уникальным индексом - состояние OpenTofu
dataтипа text
Принцип блокировки
Для блокировок используются рекомендательные блокировки Postgres — глобальный механизм блокировки на уровне базы данных. Чтобы корректно блокировать разные конфигурации, использующие одну и ту же базу данных, последовательность Postgres, используемая для генерации идентификаторов состояния, хранится в схеме public и используется всеми конфигурациями, которым нужны блокировки в этом экземпляре базы данных.
Поэтому убедитесь, что у пользователя Postgres есть доступ к схеме, используемой данной конфигурацией, а также к схеме public.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/settings/backends/pg/