terraform { required_version = "> 0.8.0" required_providers { bitwarden-secrets = { source = "bitwarden/bitwarden-secrets" version = "0.5.4-pre" } } } provider "kubernetes" { config_path = "~/.kube/config" } provider "bitwarden-secrets" { api_url = "https://bitwarden.tryton.geeraert.eu/api" identity_url = "https://bitwarden.tryton.geeraert.eu/identity" access_token = "0.9f4b7c5f-e6e7-4eff-929e-b474016a2b9c.bMRELajGGb7qMuXXvzgCCJdDfxfTCS:mFDT7tHSi43KJSnkwvTSYg==" organization_id = "a6361589-badd-4bde-9cb4-af8901161c0d" } variable "kubernetes" { type = map(object({ name = optional(string) docker = optional(bool) image = string pvc = optional(map(object({ name = optional(string) pvc = optional(bool, false) config_map = optional(bool, false) secret = optional(bool, false) host_path = optional(string) pvc_size = optional(string) storage_class_name = optional(string, "nfs-storage-intelligent") annotations_fileType = optional(string) existing_pvc = optional(bool, false) mount_path = string sub_path = optional(string) }))) environment = optional(map(object({ name = optional(string) value = optional(string) value_from = optional(object({ secret_key_ref = object({ name = string key = optional(string, null) }) })) }))) replicas = optional(number, 1) namespace = optional(string) connected_namespace = optional(string, "") command = optional(list(string)) service_port = optional(list(number)) service_type = optional(string, "ClusterIP") service_name = optional(string) domain_name = optional(list(string)) legacy_domain = optional(bool, false) exposed = optional(bool, true) liveness_tcp_socket = optional(number) liveness_http_get = optional(string) liveness_http_get_path = optional(string) database = optional(map(string)) database_command = optional(list(string)) database_args = optional(list(string)) redis = optional(map(string)) enabled = optional(bool, true) secret_ref = optional(list(string)) config_map_ref = optional(list(string)) config_map_import = optional(list(string)) secret_import = optional(list(string)) extra_manifest = optional(list(string)) requirements = optional(map(string)) # requirements = optional(map(string), { # limits-cpu = "800m" # limits-memory = "500Mi" # requests-cpu = "200m" # requests-memory = "200Mi" # }) dns_nameservers = optional(string) service_account_name = optional(string) environment_variables = optional(map(string), { name = "value" }) security_context = optional(bool, false) import_database_secret = optional(object({ #putting them a non optional as the code doesn't allow optional value host = string name = string password = string port = string username = string })) })) } variable "database_backup_info" { type = map(object({ image = optional(string) command = optional(string) })) description = "based on DB engine, give the docker image and the command used to backup" default = { postgres = { image = "alpine/psql" command = "pg_dump |gzip -9 > /backup/$(DB_DATABASE_NAME)-DB-$(date +%Y%m%d).sql.gz" } mysql = { image = "mysql" command = "mysqldump -h $DB_HOST -u $MYSQL_USER -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE |gzip -9 > /backup/$(DB_DATABASE_NAME)-DB-$(date +%Y%m%d).sql.gz" } sqlserver = { image = "mcr.microsoft.com/mssql-tools" command = "/opt/mssql-tools/bin/sqlcmd -S $DB_HOST -U $DB_USERNAME -P $DB_PASSWORD -Q \"BACKUP DATABASE $DB_DATABASE_NAME TO DISK = '/backup/$DB_DATABASE_NAME-$(date +%Y%m%d).bak' WITH COPY_ONLY, CHECKSUM,FORMAT, MEDIANAME = 'SQLServerBackups',NAME = 'Full Backup of SQLTestDB'\";exit" } } } variable "storage_path" { type = map(string) default = { main_storage = "/data/kubernetes", fast_access = "/ssd" } } locals { env_details = flatten([ for key, value in var.kubernetes : [ for index, env in value.environment_variables : { index = index name = env }] if value.enabled == true && value.environment_variables != null ]) } resource "kubernetes_namespace_v1" "automatic" { for_each = { for key, value in var.kubernetes : key => value if value.enabled == true && value.connected_namespace == "" } metadata { annotations = { name = coalesce(each.value.namespace, each.key) } labels = { deployment_method = "Terraform" } name = coalesce(each.value.namespace, each.key) } } locals { kubernetes_manifests = flatten([ for k, obj in var.kubernetes : [ for index, manifest in(obj.extra_manifest != null ? obj.extra_manifest : []) : { key = "${k}_${index}" name = obj.name manifest = manifest enabled = obj.enabled } if obj.enabled == true ] ]) } resource "kubernetes_manifest" "manifest" { for_each = { for item in local.kubernetes_manifests : item.key => item } manifest = yamldecode(file(each.value.manifest)) provider = kubernetes }