mirror of
https://gitlab.sarex.io/infra/terraform-contour-mirror.git
synced 2026-08-05 18:31:00 +03:00
++ contour: in-cluster root — minio backend + kubernetes/vault/kafka/postgresql/rabbitmq/minio providers, admin creds via env from vault
This commit is contained in:
parent
ca7332bfdc
commit
128b7b4451
@ -1,3 +1,12 @@
|
|||||||
|
# Contour root — in-cluster backend + providers.
|
||||||
|
#
|
||||||
|
# This branch (`contour`) serves ALL closed contours. Backend state lives in the
|
||||||
|
# contour MinIO; the concrete contour is selected by INFRA_ENV. Providers target
|
||||||
|
# in-cluster services (no managed YC). Infra-service admin creds are read from
|
||||||
|
# Vault by a workflow step and injected as env vars (see .gitea/workflows) —
|
||||||
|
# providers pick them up via get_env, so there is no cross-provider data-source
|
||||||
|
# ordering dependency on the vault-secrets stack.
|
||||||
|
|
||||||
remote_state {
|
remote_state {
|
||||||
backend = "s3"
|
backend = "s3"
|
||||||
generate = {
|
generate = {
|
||||||
@ -5,102 +14,96 @@ remote_state {
|
|||||||
if_exists = "overwrite_terragrunt"
|
if_exists = "overwrite_terragrunt"
|
||||||
}
|
}
|
||||||
config = {
|
config = {
|
||||||
endpoint = "https://storage.yandexcloud.net"
|
endpoint = get_env("TF_STATE_S3_ENDPOINT", "")
|
||||||
bucket = get_env("S3_PROD_STATE_BUCKET", "tfstate-terragrunt-prod")
|
bucket = get_env("TF_STATE_S3_BUCKET", "")
|
||||||
key = "${path_relative_to_include()}/terraform.tfstate"
|
key = "${path_relative_to_include()}/terraform.tfstate"
|
||||||
region = "ru-central1"
|
region = get_env("TF_STATE_S3_REGION", "ru-central1")
|
||||||
access_key = get_env("S3_ACCESS_KEY", get_env("AWS_ACCESS_KEY_ID", ""))
|
access_key = get_env("S3_ACCESS_KEY", get_env("AWS_ACCESS_KEY_ID", ""))
|
||||||
secret_key = get_env("S3_SECRET_KEY", get_env("AWS_SECRET_ACCESS_KEY", ""))
|
secret_key = get_env("S3_SECRET_KEY", get_env("AWS_SECRET_ACCESS_KEY", ""))
|
||||||
skip_region_validation = true
|
skip_region_validation = true
|
||||||
skip_credentials_validation = true
|
skip_credentials_validation = true
|
||||||
skip_metadata_api_check = true
|
skip_metadata_api_check = true
|
||||||
force_path_style = true
|
|
||||||
skip_bucket_root_access = true
|
skip_bucket_root_access = true
|
||||||
# Object Storage бакет без versioning/SSE; свежий terragrunt иначе падает на проверке.
|
force_path_style = true
|
||||||
skip_bucket_versioning = true
|
|
||||||
skip_bucket_ssencryption = true
|
|
||||||
skip_bucket_enforced_tls = true
|
|
||||||
skip_bucket_public_access_blocking = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Генерация общего провайдера для всех модулей
|
|
||||||
generate "provider" {
|
generate "provider" {
|
||||||
path = "provider.tf"
|
path = "provider.tf"
|
||||||
if_exists = "overwrite_terragrunt"
|
if_exists = "overwrite_terragrunt"
|
||||||
contents = <<EOF
|
contents = <<EOF_PROVIDER
|
||||||
terraform {
|
terraform {
|
||||||
required_version = ">= 1.0"
|
required_version = ">= 1.5.0"
|
||||||
|
|
||||||
required_providers {
|
required_providers {
|
||||||
yandex = {
|
kubernetes = { source = "hashicorp/kubernetes", version = "~> 2.23" }
|
||||||
source = "yandex-cloud/yandex"
|
vault = { source = "hashicorp/vault", version = "~> 4.2" }
|
||||||
version = ">= 0.161.0"
|
kafka = { source = "Mongey/kafka", version = "~> 0.7" }
|
||||||
}
|
postgresql = { source = "cyrilgdn/postgresql", version = "~> 1.21" }
|
||||||
kubernetes = {
|
rabbitmq = { source = "cyrilgdn/rabbitmq", version = "~> 1.8" }
|
||||||
source = "hashicorp/kubernetes"
|
minio = { source = "aminueza/minio", version = "~> 2.0" }
|
||||||
version = "~> 2.23"
|
random = { source = "hashicorp/random", version = "~> 3.1" }
|
||||||
}
|
tls = { source = "hashicorp/tls", version = "~> 4.0" }
|
||||||
random = {
|
|
||||||
source = "hashicorp/random"
|
|
||||||
version = "~> 3.1"
|
|
||||||
}
|
|
||||||
rabbitmq = {
|
|
||||||
source = "cyrilgdn/rabbitmq"
|
|
||||||
version = "~> 1.8"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
provider "yandex" {
|
variable "kubeconfig_path" {
|
||||||
token = var.yc_token != "" ? var.yc_token : null
|
type = string
|
||||||
service_account_key_file = var.yc_service_account_key_file != "" ? var.yc_service_account_key_file : null
|
default = ""
|
||||||
cloud_id = var.yc_cloud_id != "" ? var.yc_cloud_id : null
|
}
|
||||||
folder_id = var.yc_folder_id != "" ? var.yc_folder_id : null
|
|
||||||
zone = "ru-central1-a"
|
variable "kube_context" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
provider "kubernetes" {
|
provider "kubernetes" {
|
||||||
# Если kubeconfig_path указан и файл существует - используем его
|
|
||||||
# Иначе провайдер автоматически использует in-cluster config (для runner'а в k8s)
|
|
||||||
config_path = var.kubeconfig_path != "" ? var.kubeconfig_path : null
|
config_path = var.kubeconfig_path != "" ? var.kubeconfig_path : null
|
||||||
config_context = var.kube_context != "" ? var.kube_context : null
|
config_context = var.kube_context != "" ? var.kube_context : null
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "yc_token" {
|
# Vault: static VAULT_TOKEN if provided, else in-cluster k8s auth by the runner SA.
|
||||||
type = string
|
provider "vault" {
|
||||||
default = ""
|
%{if get_env("VAULT_TOKEN", "") == ""~}
|
||||||
description = "Yandex Cloud IAM token"
|
auth_login_kubernetes {
|
||||||
|
role = "${get_env("VAULT_K8S_ROLE", "terraform")}"
|
||||||
|
mount_path = "auth/${get_env("VAULT_K8S_AUTH_BACKEND", "kubernetes")}"
|
||||||
|
}
|
||||||
|
%{endif~}
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "yc_service_account_key_file" {
|
# In-cluster PostgreSQL (admin). Password injected from Vault secrets/postgresql/admin.
|
||||||
type = string
|
provider "postgresql" {
|
||||||
default = ""
|
host = "${get_env("PG_ADMIN_HOST", "postgresql.postgresql.svc.cluster.local")}"
|
||||||
description = "Path to Yandex Cloud service account key file"
|
port = ${get_env("PG_ADMIN_PORT", "5432")}
|
||||||
|
username = "${get_env("PG_ADMIN_USER", "postgres")}"
|
||||||
|
password = "${get_env("PG_ADMIN_PASSWORD", "")}"
|
||||||
|
sslmode = "disable"
|
||||||
|
superuser = false
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "yc_cloud_id" {
|
# In-cluster Kafka (Bitnami). Admin = inter_broker super-user from Vault secrets/kafka/bootstrap.
|
||||||
type = string
|
provider "kafka" {
|
||||||
default = ""
|
bootstrap_servers = ["${get_env("KAFKA_BOOTSTRAP", "kafka-kafka-contour.kafka.svc.cluster.local:9092")}"]
|
||||||
description = "Yandex Cloud ID"
|
tls_enabled = false
|
||||||
|
sasl_mechanism = "${get_env("KAFKA_SASL_MECHANISM", "plain")}"
|
||||||
|
sasl_username = "${get_env("KAFKA_ADMIN_USER", "inter_broker_user")}"
|
||||||
|
sasl_password = "${get_env("KAFKA_ADMIN_PASSWORD", "")}"
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "yc_folder_id" {
|
# In-cluster RabbitMQ management API. Admin from Vault secrets/rabbitmq/auth.
|
||||||
type = string
|
provider "rabbitmq" {
|
||||||
default = ""
|
endpoint = "${get_env("RABBITMQ_ENDPOINT", "http://rabbitmq.rabbitmq.svc.cluster.local:15672")}"
|
||||||
description = "Yandex Cloud folder ID"
|
username = "${get_env("RABBITMQ_ADMIN_USER", "admin")}"
|
||||||
|
password = "${get_env("RABBITMQ_ADMIN_PASSWORD", "")}"
|
||||||
}
|
}
|
||||||
|
|
||||||
variable "kubeconfig_path" {
|
# In-cluster MinIO S3 API. Admin from Vault secrets/minio/admin.
|
||||||
type = string
|
provider "minio" {
|
||||||
default = ""
|
minio_server = "${get_env("MINIO_ENDPOINT", "minio.minio.svc.cluster.local:9000")}"
|
||||||
description = "Path to kubeconfig file"
|
minio_user = "${get_env("MINIO_ADMIN_USER", "")}"
|
||||||
|
minio_password = "${get_env("MINIO_ADMIN_PASSWORD", "")}"
|
||||||
|
minio_ssl = false
|
||||||
}
|
}
|
||||||
|
EOF_PROVIDER
|
||||||
variable "kube_context" {
|
|
||||||
type = string
|
|
||||||
default = ""
|
|
||||||
description = "Kubernetes context"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user