1. 程式人生 > 其它 >Terraform模組Module管理,聚合資源的抽取與複用

Terraform模組Module管理,聚合資源的抽取與複用

我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!

1 簡介

最近工作中用到了Terraform,權當學習記錄一下,希望能幫助到其它人。

Terraform系列文章如下:

Terraform入門教程,示例展示管理Docker和Kubernetes資源

Terraform外掛Provider管理,搜尋、定義、下載

Terraform狀態State管理,讓變更有記錄

Terraform模組Module管理,聚合資源的抽取與複用

Terraform常用命令

模組是為了便為管理與複用,就跟函式是一樣的。一個模組大概有以下檔案:

  • main.tf:就像是函式入口;
  • README.md
    :如函式的宣告;
  • variables.tf: 變數說明,就像函式的入參;
  • outputs.tf: 輸出,如函式的返回值;
  • examples: 使用示例;

另外,模組也是可以巢狀的,即模組裡有子模組,但不建議巢狀太深。

2 建立及使用自定義模組

2.1 建立模組

我們來通過一個簡單示例講解如何自己建立一個模組。這個模組的功能是在Kubernetes上部署一個nginx,就是建立一個Deployment和一個Service。

這個模組共有兩個檔案,一個是main.tf,用來定義Resource,即Deployment和Service。另一個檔案是variables.tf,用來定義這個模組所需要的輸入變數。這兩個檔案都放在當前目錄的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]
}

它就是資源定義,然後把一些變數用var.xxx的形式替換,這樣Terraform解析的時候就會找對應的變數進行賦值。

variables.tf檔案如下:

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

variable "applicationName" {
    description = "applicationName"
}

variable "image" {
    description = "image"
}

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

variable "nodePort" {
    description = "nodePort"
}

main.tf檔案使用的變數,都在這裡有定義。

2.2 使用模組

現在我們已經建立好了模組,接下來要引用它。我們就在當前目錄引用即可。程式碼如下:

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: 模組來源的地址;
  • namespace: 命令空間,模組定義的入參;
  • applicationName: 應用名,模組定義的入參;
  • image: 映象,模組定義的入參;
  • replicas: Pod的數目,模組定義的入參;
  • nodePort: 埠,模組定義的入參;

引用模組還是很簡單的,跟呼叫函式差不多,就是告訴別人名字和入參。

3 使用外部模組

模組的source支援多種型別,如本地路徑、Terraform官方倉庫、GitHub等。

本地路徑:

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

Terraform倉庫:

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

GitHub地址:

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

如果是用SSH,如下:

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

壓縮包:

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

4 總結

程式碼請檢視:https://github.com/LarryDpk/pkslow-samples


歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。