5

Terraform Module - extract and reuse

 2 years ago
source link: https://www.pkslow.com/archives/terraform-module-en
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1 Why we need module

Terraform Module helps us manage the resources in the right way, just like the Method in Java. Generally, the module contains the files:

  • main.tf: just like the main function;
  • README.md: description about the module;
  • variables.tf: define the variables used in module;
  • outputs.tf: output the value from the module;
  • examples: show how to use;

2 create your own module

2.1 create the module

I will create a simple module to deploy the nginx to Kubernetes. It helps to deploy the Deployment and Service on k8s for us. There are two files in the simple module:

(1) main.tf: defines the resources(kubernetes Deployment and Service)

(2) variables.tf: defines the variables for the resources

Let's put the two files in the folder nginx-kubernetes:

main.tf:

resource "kubernetes_deployment" "test" {
  metadata {
    name      = var.applicationName
    namespace = var.namespace
  }
  spec {
    replicas = var.replicas
    selector {
      match_labels = {
        app = var.applicationName
      }
    }
    template {
      metadata {
        labels = {
          app = var.applicationName
        }
      }
      spec {
        container {
          image = var.image
          name  = "nginx-container"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

resource "kubernetes_service" "test" {
  metadata {
    name      = var.applicationName
    namespace = var.namespace
  }
  spec {
    selector = {
      app = var.applicationName
    }
    type = "NodePort"
    port {
      node_port   = var.nodePort
      port        = 80
      target_port = 80
    }
  }

  depends_on = [kubernetes_deployment.test]
}

As code shows, the varibles pattern is var.xxx. The Terraform will try to replace the var with the input varibles.

variables.tf:

variable "namespace" {
    description = "k8s namespace"
}

variable "applicationName" {
    description = "applicationName"
}

variable "image" {
    description = "image"
}

variable "replicas" {
    description = "deployment replicas"
}

variable "nodePort" {
    description = "nodePort"
}

All the var.xxx in main.tf need to be pre-defined here.

2.2 How to use the module

It's easy to use the module, just like calling a method in Java:

provider "kubernetes" {
  config_path = "~/.kube/config"
}

module "pkslow-nginx" {
    source = "./nginx-kubernetes"
    namespace = "pkslow"
    applicationName = "pkslow-nginx"
    image = "nginx:1.19.5"
    replicas = 3
    nodePort = 30301
}
  • source: where is the module from;
  • namespace: input varible for Kubernetes;
  • applicationName: input varible for Kubernetes;
  • image: input varible for Kubernetes;
  • replicas: input varible for Kubernetes;
  • nodePort: input varible for Kubernetes;

3 external module

Terraform supports many kinds of Module sources: local/Terraform registry/GitHub/http etc.

Local:

module "pkslow" {
  source = "./pkslow"
}

Terraform Registry:

module "consul" {
  source = "hashicorp/consul/aws"
  version = "0.1.0"
}

GitHub:

module "pkslow" {
  source = "github.com/larrydpk/pkslow"
}

GitHub SSH:

module "pkslow" {
  source = "[email protected]:larrydpk/pkslow.git"
}

Zip file:

module "vpc" {
  source = "https://pkslow.com/vpc-module?archive=zip"
}

4 the end

Please check the code on: https://github.com/LarryDpk/pkslow-samples


References:

Terraform Module

Module Sources


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

推荐阅读:
如何制定切实可行的计划并好好执行
容器技术(Docker-Kubernetes)
SpringBoot-Cloud相关
Https专题


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK