Terraform模組Module管理,聚合資源的抽取與複用
我最新最全的文章都在 南瓜慢說 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 = "[email protected]:larrydpk/pkslow.git"
}
壓縮包:
module "vpc" {
source = "https://pkslow.com/vpc-module?archive=zip"
}
4 總結
程式碼請檢視:https://github.com/LarryDpk/pkslow-samples
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。