Тип бэкенда: 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.12/language/settings/backends/pg/