commit 1594d8f76ade95b74326620339b9c375fefe3eb9 Author: pierre Date: Thu Nov 14 11:25:06 2024 +0000 first commit diff --git a/module.tf b/module.tf new file mode 100644 index 0000000..5a64bfd --- /dev/null +++ b/module.tf @@ -0,0 +1,264 @@ +terraform { + required_version = "> 0.8.0" +} + + +provider "kubernetes" { + config_path = "~/.kube/config" +} + +variable "networks" { + type = map(object({ + cidr_block = string + subnets = map(object({ cidr_block = string })) + })) + default = { + "private" = { + cidr_block = "10.1.0.0/16" + subnets = { + "db1" = { + cidr_block = "10.1.0.1/16" + } + "db2" = { + cidr_block = "10.1.0.2/16" + } + } + }, + "public" = { + cidr_block = "10.1.1.0/16" + subnets = { + "webserver" = { + cidr_block = "10.1.1.1/16" + } + "email_server" = { + cidr_block = "10.1.1.2/16" + } + } + } + "dmz" = { + cidr_block = "10.1.2.0/16" + subnets = { + "firewall" = { + cidr_block = "10.1.2.1/16" + } + } + } + } +} + + + +variable "kubernetes" { + type = map(object({ + #service = string + # pvc_name = optional(string) + name = optional(string) + image = string + mount_path = optional(string, "/mount") + pvc_size = optional(string) + replicas = optional(number, 1) + namespace = optional(string) + service_port = optional(number) + service_name = optional(string) + liveness_tcp_socket = optional(number) + liveness_http_get = optional(string) + liveness_http_get_path = optional(string) + enabled = optional(bool, true) + requirements = optional(map(string), { + limits-cpu = "800m" + limits-memory = "500Mi" + requests-cpu = "200m" + requests-memory = "200Mi" + }) + environment_variables = optional(map(string), { name = "value" }) + # environment_variables = optional(list(object({ + # name = string + # value = string + # }))) + })) + +} + + + +resource "kubernetes_namespace" "automatic" { + for_each = { for key, value in var.kubernetes : key => value if value.enabled == true } + metadata { + annotations = { + name = coalesce(each.value.namespace, each.key) + } + name = coalesce(each.value.namespace, each.key) + } +} + + +resource "kubernetes_persistent_volume_claim" "automatic-pvc" { + for_each = { for key, value in var.kubernetes : key => value if value.pvc_size != null && value.enabled == true } + metadata { + namespace = coalesce(each.value.namespace, each.key) + name = "${each.key}-pvc" + } + spec { + access_modes = ["ReadWriteMany"] + storage_class_name = "nfs-storage-intelligent" + resources { + requests = { + storage = each.value.pvc_size + } + } + } +} + + +resource "kubernetes_service" "automatic_service" { + for_each = { for key, value in var.kubernetes : key => value if value.service_port != null && value.enabled == true } + metadata { + # name = coalesce(each.value.namespace, each.key) + # name = "${each.value.namespace}-svc" + name = "${coalesce(each.value.namespace, each.key)}-svc" + namespace = coalesce(each.value.namespace, each.key) + } + spec { + selector = { + app = each.key + } + port { + port = each.value.service_port + target_port = each.value.service_port + } + + + } + + +} + + + +resource "kubernetes_deployment_v1" "automatic" { + for_each = { for key, value in var.kubernetes : key => value if value.enabled == true } + metadata { + namespace = coalesce(each.value.namespace, each.key) + name = coalesce(each.value.namespace, each.key) + labels = { + app = each.key + } + } + + spec { + replicas = each.value.replicas + + selector { + match_labels = { + app = each.key + } + } + + template { + metadata { + labels = { + app = each.key + } + } + + spec { + container { + image = each.value.image + name = coalesce(each.value.name, each.key) + dynamic "port" { + for_each = each.value.service_port != null ? [""] : [] + content { + container_port = each.value.service_port + name = each.key + } + } + + dynamic "volume_mount" { + for_each = each.value.pvc_size != null ? [""] : [] + content { + + mount_path = each.value.mount_path + name = "${each.key}-volume" + + } + } + + + ######################################### + ############# working but not goign through every arguments + + + # dynamic "env" { + # for_each = each.value.environment_variables != null ? [""] : [] + # content { + # name = keys(each.value.environment_variables)[0] + # value = values(each.value.environment_variables)[0] + # } + # } + + ####################################### + + + + + + + dynamic "env" { + for_each = each.value.environment_variables != null ? each.value.environment_variables : {} + content { + name = env.key + value = env.value + } + } + + + resources { + limits = { + cpu = each.value.requirements.limits-cpu + memory = each.value.requirements.limits-memory + } + requests = { + cpu = each.value.requirements.requests-cpu + memory = each.value.requirements.requests-memory + } + } + + dynamic "liveness_probe" { + for_each = each.value.liveness_tcp_socket != null || each.value.liveness_http_get != null ? [""] : [] + content { + dynamic "tcp_socket" { + for_each = each.value.liveness_tcp_socket != null ? [""] : [] + content { + port = each.value.liveness_tcp_socket + } + } + + + dynamic "http_get" { + for_each = each.value.liveness_http_get != null ? [""] : [] + content { + port = each.value.liveness_http_get + path = coalesce(each.value.liveness_http_get_path, "/") + } + } + + initial_delay_seconds = 3 + period_seconds = 3 + } + } + } + + dynamic "volume" { + for_each = each.value.pvc_size != null ? [""] : [] + content { + name = "${each.key}-volume" + persistent_volume_claim { + claim_name = "${each.key}-pvc" + } + } + + } + } + } + } +} diff --git a/module.tf.save b/module.tf.save new file mode 100644 index 0000000..250bb08 --- /dev/null +++ b/module.tf.save @@ -0,0 +1,185 @@ +terraform { + required_version = "> 0.8.0" +} + + +provider "kubernetes" { + config_path = "~/.kube/config" +} + + +resource "kubernetes_namespace" "screeps" { + metadata { + annotations = { + name = "screeps" + } + name = "screeps" + } +} + + +resource "kubernetes_persistent_volume_claim" "screeps-pvc" { + metadata { + namespace = "screeps" + name = "screeps-pvc" + } + spec { + access_modes = ["ReadWriteMany"] + storage_class_name = "nfs-storage-intelligent" + resources { + requests = { + storage = "1Gi" + } + } + } +} + + +resource "kubernetes_deployment_v1" "screeps" { + metadata { + namespace = "screeps" + name = "screeps" + labels = { + app = "screepsserver" + } + } + + spec { + replicas = 1 + + selector { + match_labels = { + app = "screepsserver" + } + } + + template { + metadata { + labels = { + app = "screepsserver" + } + } + + spec { + container { + image = "screepers/screeps-launcher" + name = "screeps-launcher" + port { + container_port = 21025 + name = "screeps-port" + } + volume_mount { + mount_path = "/screeps" + name = "screeps-volume" + } + + resources { + limits = { + cpu = "2" + memory = "2Gi" + } + requests = { + cpu = "250m" + memory = "500Mi" + } + } + + + + } + volume { + name = "screeps-volume" + persistent_volume_claim { + claim_name = "screeps-pvc" + } + } + + } + } + } +} + +resource "kubernetes_service" "screeps_service" { + metadata { + name = "screeps" + namespace = "screeps" + } + spec { + selector = { + app = "screepsserver" + } + port { + port = 21025 + } + + } +} + + +variable "kubernetes" { + type = map(object({ + service = string + #testingbool= bool + pvc_name = optional(string) + namespace = optional(string) + service_port = optional(number) + LoadBalancerbool = optional(string) + enabled = optional(bool, true) + proxy_cache = optional(bool, false) + extra-value = optional(string, "") + http2_bool = optional(bool, false) + proxy_pass_https = optional(bool, false) + authentication_required = optional(bool, false) + })) + +} + +resource "kubernetes_namespace" "automatic" { + for_each = { for key, value in var.kubernetes : key => value if value.enabled == true } + metadata { + annotations = { + name = coalesce(each.value.namespace, each.key) + } + name = coalesce(each.value.namespace, each.key) + } +} + + +resource "kubernetes_persistent_volume_claim" "automatic-pvc" { + for_each = { for key, value in var.kubernetes : key => value if value.pvc_name != null } + metadata { + namespace = coalesce(each.value.namespace, each.key) + name = coalesce(each.value.namespace, each.key) + } + spec { + access_modes = ["ReadWriteMany"] + storage_class_name = "nfs-storage-intelligent" + resources { + requests = { + storage = "1Gi" + } + } + } +} + + +resource "kubernetes_service" "automatic_service" { + for_each = { for key, value in var.kubernetes : key => value if value.service_port != null } + metadata { + name = coalesce(each.value.namespace, each.key) + namespace = coalesce(each.value.namespace, each.key) + } + spec { + selector = { + app = "screepsserver" + } + port { + port = each.value.service_port + } + +if(each.value.LoadBalancerbool == "enabled" ? [type = "LoadBalancer"] :[] + + } + + } +} diff --git a/pvc.claim.yaml b/pvc.claim.yaml new file mode 100644 index 0000000..7efb390 --- /dev/null +++ b/pvc.claim.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: screeps +--- +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: screeps-storage + namespace: screeps +spec: + storageClassName: nfs-storage-intelligent + accessModes: + - ReadWriteMany + resources: + requests: + storage: 20Gi + diff --git a/terraform.tfstate b/terraform.tfstate new file mode 100644 index 0000000..453bd7a --- /dev/null +++ b/terraform.tfstate @@ -0,0 +1,9 @@ +{ + "version": 4, + "terraform_version": "1.9.2", + "serial": 386, + "lineage": "000b6e63-c8e6-a547-e28c-f294b07c2a36", + "outputs": {}, + "resources": [], + "check_results": null +} diff --git a/terraform.tfstate.backup b/terraform.tfstate.backup new file mode 100644 index 0000000..642e513 --- /dev/null +++ b/terraform.tfstate.backup @@ -0,0 +1,17 @@ +{ + "version": 4, + "terraform_version": "1.9.2", + "serial": 385, + "lineage": "000b6e63-c8e6-a547-e28c-f294b07c2a36", + "outputs": { + "test_environment_variables": { + "value": {}, + "type": [ + "object", + {} + ] + } + }, + "resources": [], + "check_results": null +} diff --git a/variables.auto.tfvars b/variables.auto.tfvars new file mode 100644 index 0000000..54f0ff5 --- /dev/null +++ b/variables.auto.tfvars @@ -0,0 +1,156 @@ +kubernetes = { + screeps = { + enabled = false + name = "screeps-server" + pvc_size = "1Gi" + mount_path = "/screeps" + image = "screepers/screeps-launcher" + service_port = 21025 + environment_variables = { t1est = "tset" } + requirements = { + limits-cpu = "900m" + limits-memory = "600Mi" + requests-cpu = "300m" + requests-memory = "400Mi" + } + } + + djangoterra = { + enabled = false + # image = "localhost:31795/django-python" + image = "gitea.tryton.geeraert.eu/pi-ux-ce/django-python:1.0.0" + # image = "nginx:latest" + pvc_size = "10Mi" + mount_path = "/code" + service_port = 8000 + requirements = { + limits-cpu = "200m" + limits-memory = "200Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + } + + nginx = { + enabled = true + namespace = "testnginx" + #image = "localhost:31795/django-python" + image = "nginx:latest" + #pvc_size = "10Mi" + # mount_path = "/code" + # service_port = 80 + # liveness_http_get = 80 + # requirements = { + # limits-cpu = "200m" + # limits-memory = "200Mi" + # requests-cpu = "50m" + # requests-memory = "50Mi" + # } + # environment_variables = [{ + # "name" : "NGINX_PORT", + # "value" : "80" + # name = "NGINX-second_PORT" , value = "81" + # }] + environment_variables = { t1est = "tset", a2nother = "rehtona" } + # environment_variables = { t1est = "tset" } + # environment_variables = { + # name = "NGINX_PORT" , value = "80" + # name = "NGINX-second_PORT" , value = "81" + # } + } + + redis = { + enabled = false + image = "redis" + service_port = 6379 + liveness_tcp_socket = 6379 + # environment_variables = [{ + # "name" : "redis_PORT", + # "value" : "6379" + # }] + } + + vulcan = { + enabled = false + image = "localhost:31795/vulcan-frontend:latest" + service_port = 80 + requirements = { + limits-cpu = "50m" + limits-memory = "50Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + } + bwdownload = { + enabled = false + namespace = "backup-bitwarden" + image = "alpine" + requirements = { + limits-cpu = "50m" + limits-memory = "50Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + } + gogs = { + enabled = false + image = "gogs/gogs" + requirements = { + limits-cpu = "50m" + limits-memory = "50Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + service_port = 3000 + pvc_size = "1Gi" + mount_path = "/data" + } + gitea = { + enabled = false + image = "gitea/gitea:1.22.3" + requirements = { + limits-cpu = "50m" + limits-memory = "50Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + service_port = 3000 + pvc_size = "1Gi" + mount_path = "/data" + } + + notmuch = { + enabled = false + image = "kalbasit/notmuch" + service_port = 80 + } + + spider = { + enabled = false + image = "iredmail/spider:latest" + requirements = { + limits-cpu = "200m" + limits-memory = "500Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + service_port = 8080 + pvc_size = "100Mi" + mount_path = "/opt/spider" + } + + piler = { + enabled = false + image = "sutoj/piler:1.4.5" + requirements = { + limits-cpu = "200m" + limits-memory = "500Mi" + requests-cpu = "50m" + requests-memory = "50Mi" + } + service_port = 80 + } + +} + +