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 = "git@github.com:larrydpk/pkslow.git"
}

壓縮包:

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

4 總結

代碼請查看:https://github.com/LarryDpk/pkslow-samples


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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM