Автоматизация PostgreSQL — Ansible и Terraform
Infrastructure as Code для БД
Ручная настройка "зайду по SSH и поправлю conf" не масштабируется и не аудируется. IaC даёт:
- версионирование параметров;
- повторяемость dev/stage/prod;
- code review изменений
max_connectionsтак же, как кода приложения.
Общая теория — IaC, Terraform, Ansible.
Ansible — bare metal и VM
Типовая role структура:
roles/postgresql/
tasks/main.yml
templates/postgresql.conf.j2
templates/pg_hba.conf.j2
handlers/main.yml
defaults/main.yml
tasks/main.yml (фрагмент):
Код ITЗагрузка примера кода…
defaults/main.yml:
postgresql_shared_buffers: 2GB
postgresql_max_connections: 200
postgresql_work_mem: 16MB
Patroni + etcd часто разворачивают отдельными roles (community patroni, etcd). Idempotency — повторный play не ломает данные, если tasks guarded creates: / when:.
Terraform — managed PostgreSQL
Пример AWS RDS (упрощённо):
Код ITЗагрузка примера кода…
Output для приложения:
output "database_url" {
value = "postgres://${aws_db_instance.app.username}:${var.db_password}@${aws_db_instance.app.endpoint}/${aws_db_instance.app.db_name}"
sensitive = true
}
Аналоги — yandex_mdb_postgresql_cluster, google_sql_database_instance, azurerm_postgresql_flexible_server.
Terraform + Kubernetes operator
CloudNativePG cluster как CR через kubernetes_manifest или Helm provider:
resource "helm_release" "cnpg" {
name = "cloudnative-pg"
repository = "https://cloudnative-pg.github.io/charts"
chart = "cloudnative-pg"
namespace = "database"
}
GitOps (Argo CD) хранит manifest Cluster в Git; Terraform создаёт только cluster K8s / VPC / S3 bucket для Wal-G.
Секреты
| Anti-pattern | Pattern |
|---|---|
| password в terraform.tfvars в Git | Vault, AWS Secrets Manager, SOPS |
| plain Secret YAML в repo | External Secrets Operator |
| один password навсегда | rotation job |
Ansible Vault для group_vars/production.yml.
CI/CD для миграций схемы
IaC не заменяет Flyway/Liquibase/Alembic для DDL приложения:
- Terraform/Ansible — инстанс, users, extensions, GUC.
- Migration tool — schema версионирование в pipeline приложения.
Порядок deploy — migration до rollout app, совместимость backward (expand-contract).
Drift detection
terraform planв CI — изменения в managed DB.- Ansible
--checkили tools вродеdatabagдля сравнения live GUC с template. pg_settings.source— что задано через file vs session.
Практика
- Ansible play — установка Postgres 16 на VM, deploy custom
postgresql.conf. - Terraform module — RDS или Yandex MDB в dev account, output endpoint.
- Pipeline —
terraform planon MR,applyon merge to main с approval.