我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 簡介
最近工作中用到了Terraform,權當學習記錄一下,希望能幫助到其它人。
Terraform系列文章如下:
Terraform入門教程,示例展示管理Docker和Kubernetes資源
Terraform插件Provider管理,搜索、定義、下載
Terraform模塊Module管理,聚合資源的抽取與復用
模塊是為了便為管理與復用,就跟函數是一樣的。一個模塊大概有以下文件:
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
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

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