在現代軟體開發流程中,自動化佈署至關重要。本文將探討如何使用 GitLab CI/CD 建立自動化Pipeline,並結合 Terraform 管理基礎設施,實作 Docker 容器在 Proxmox 平台上的自動化佈署。首先,我們會設定 GitLab Runner 並撰寫 .gitlab-ci.yml 檔案定義Pipeline的各個階段。接著,我們將使用 Terraform 建立 Docker 容器,並探討如何將 Terraform 與 Proxmox 整合,以實作更全面的基礎設施自動化管理。最後,我們會簡述如何透過版本控制和安全措施來維護程式碼和基礎設施設定。
使用 GitLab 擴充套件 DevOps 功能
GitLab 提供了豐富的功能,不僅僅是一個存放程式碼的倉函式庫。你可以建立 Wiki 來伴隨你的程式碼專案,建立構件倉函式庫,與 Kubernetes(用於容器佈署)和 Terraform(用於自動化組態)整合,以及更多。其中最有價值的功能之一是 GitLab 的 CI/CD 功能。你可以使用它來自動化佈署你的程式碼到實際執行的伺服器上(包括 Docker 主機)。
CI/CD 簡介
持續整合/持續交付(CI/CD)是自動化構建、測試和佈署軟體程式碼的現代實踐。當開發人員將程式碼推播到 GitHub、GitLab 或其他 Git 倉函式庫時,這些操作可以作為觸發器,觸發軟體開發週期中的複雜步驟。在本文中,你將看到建立所謂的Pipeline(pipelines)所涉及的一些步驟。
在 DevOps 術語中,Pipeline是在 GitLab 中透過 .gitlab-ci.yml 檔案定義的自動化步驟,你需要在每個程式碼倉函式庫(如 my-test-repo)中建立這些檔案。這些是簡單的 YAML 檔案,定義了Pipeline的階段和特定的作業。作業可以用於使用 linting 工具測試程式碼(例如針對 Chef 程式碼的 Chef Cookstyle)、封裝 Docker 映像、將它們推播到 Docker Hub,以及將它們佈署到 Docker 主機等。選項非常多,使用“Pipeline”這個術語很有幫助,因為它有助於形象化邏輯流程中的彎曲和轉折。如果出現故障,你和你的開發人員可以立即看到問題所在,以便進行程式碼編輯並一次又一次地啟動自動化流程。
建立 GitLab Runner
在執行Pipeline之前,GitLab 需要一個地方來執行你定義的作業。這被稱為 Runner。Runner 通常是一台單獨的虛擬機器,上面安裝了 gitlab-runner 以及執行所需任務所需的軟體包。例如,如果你只是執行簡單的 Bash 命令,Runner 伺服器需要安裝 Bash。如果你正在執行 Ansible playbook 或 Chef 自動化操作,Runner 需要安裝這些軟體包。可以把 Runner 想像成一種工作站,你從不實際登入和使用它。GitLab 使用它來為你執行 CI/CD 工作。
要建立 Runner,請在 Proxmox 中啟動一個新的 Ubuntu 虛擬機器,並給它一個主機名 runner.devops.lab。組態 DNS 以將其指向 DevOps 實驗室子網中的一個位址,例如 10.128.1.41。
# 在 runner.devops.lab 伺服器上執行以下命令
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
$ sudo apt-get install gitlab-runner
$ sudo gitlab-runner restart
向 GitLab 例項註冊 Runner
為了讓 Runner 和 GitLab 之間能夠通訊,它們需要在它們之間分享一個可信的證書。這可能是一個複雜的過程,但以下步驟使其與自簽名證書一起工作,只要你在初始 GitLab 組態期間完成了更新 openssl.cnf 檔案的步驟即可。這些步驟將必要的檔案從 gitlab.devops.lab 伺服器複製到 runner.devops.lab 伺服器。
# 在 runner.devops.lab 伺服器上執行以下命令
$ sudo mkdir /etc/gitlab-runner/certs
$ sudo scp -i ~/.ssh/id_rsa root@gitlab:/etc/gitlab/ssl/gitlab.devops.lab{.crt,.pem} /etc/gitlab-runner/certs/
$ sudo gitlab-runner register --url https://gitlab.devops.lab/ --registration-token GR1348941s8WR5SgT8Zyr5uy3jXkA
在註冊過程中,你會被提示輸入一些值。只需按 Enter 鍵,直到被要求識別執行者(executor),這是 Runner 將如何執行你定義的 CI/CD 作業。出現提示時輸入 shell。
建立Pipeline
要在你的 my-test-repo 中建立一個Pipeline——一系列每次你提交並將程式碼推播到 GitLab 時都會自動執行的操作——你可以使用基本的 GitLab CI/CD 示例。
在你的 GitLab 控制台中,導航到你的 my-test-repo。點選左側選單中的 CI/CD,然後點選編輯器。點選“建立新的 CI/CD Pipeline”以開始建立你的 .gitlab-ci.yml 檔案。這將帶你到編輯標籤,你可以在控制台中直接編輯 YAML 檔案。
# .gitlab-ci.yml 示例
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "正在編譯程式碼..."
- echo "編譯完成。"
unit-test-job:
stage: test
script:
- echo "正在執行單元測試... 這將需要大約 60 秒。"
- sleep 60
- echo "程式碼覆寫率為 90%。"
lint-test-job:
stage: test
script:
- echo "正在進行程式碼檢查... 這將需要大約 10 秒。"
- sleep 10
- echo "未發現程式碼檢查問題。"
deploy-job:
stage: deploy
script:
- echo "正在佈署應用程式..."
- echo "應用程式佈署成功。"
詳細解說:
- 階段定義:在
.gitlab-ci.yml檔案中,首先定義了Pipeline的三個階段:build、test和deploy。這些階段按照順序執行。 - 作業定義:每個階段下有多個作業,例如
build-job、unit-test-job、lint-test-job和deploy-job。每個作業都包含一系列指令碼命令。 - 指令碼執行:在每個作業中,
script部分定義了要執行的命令。例如,在build-job中,它輸出編譯開始和完成的訊息。 - 模擬耗時操作:在
unit-test-job和lint-test-job中,使用了sleep命令來模擬耗時的操作,分別是 60 秒和 10 秒。 - 佈署作業:最後,
deploy-job用於模擬應用程式的佈署過程,並輸出佈署成功的訊息。
使用 Terraform 自動化系統佈署
在探討 DevOps 工作流程時,你會發現 Git 技能在自動化系統和應用程式佈署方面非常有用。與其手動佈署系統或製作映像範本(或克隆快照),不如用幾份程式碼檔案描述你想要的內容,然後在短時間內讓新系統啟動並執行。其理念是定義一次,然後在任何地方重複佈署。
到目前為止,本文所學的一切都為使用 Terraform 做好了準備。Terraform 是用於在本地、公有雲(如 AWS 和 Azure)以及 Proxmox DevOps 實驗室中提供系統的流行工具。在本章中,你將使用 Terraform 純粹透過程式碼建立 Linux 例項,這些程式碼可以重複使用,以每次獲得相同的結果。
安裝 Terraform
Terraform 是 HashiCorp 的開源工具之一,可以免費下載並安裝在大多數現代作業系統上,包括流行的 Linux 發行版、Windows、macOS、FreeBSD 和 OpenBSD。你可以下載二進位制檔案(.deb、.rpm、.exe 等),也可以新增 HashiCorp 儲存函式庫並使用系統的套件管理器進行安裝。本例使用後者。
在你的 Linux 工作站上,執行以下命令以新增儲存函式庫金鑰、HashiCorp 儲存函式庫本身,然後安裝 Terraform。本例使用 Ubuntu,但其他 Linux 平台的說明可在 https://terraform.io/downloads 找到。
$ curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
$ sudo apt update && sudo apt install terraform
內容解密:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -:下載 HashiCorp 的 GPG 金鑰並新增到系統的金鑰環中,以驗證套件的真實性。sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main":將 HashiCorp 儲存函式庫新增到系統的軟體來源列表中。sudo apt update && sudo apt install terraform:更新套件列表並安裝 Terraform。
這些操作將應用程式放在 /usr/bin/terraform,應該在你的系統 PATH 中,無需採取其他操作即可使用它。透過執行幫助命令測試安裝:
$ terraform -help
Usage: terraform [global options] <subcommand> [args]
...
內容解密:
terraform -help:顯示 Terraform 的使用說明和可用子命令。
使用 Docker 的 Terraform 示例
HashiCorp 網站上有許多關於如何開始使用 Terraform 的優秀範例,包括如何使用它來提供執行 NGINX 網頁伺服器的 Docker 容器。這是一個很好的起點,可以突出典型的 Terraform 專案檔案 main.tf 的組成部分。這些檔案定義了提供者(你想要用來提供系統的目標平台,例如 Docker、AWS、Proxmox、VMware 等)和描述你想要安裝和設定的資源區塊。
檢視以下範例,看看這些元素如何在一個簡單的 main.tf 檔案中運作。在你的工作站上建立這個檔案於新的 ~/terraform-repo/nginx 目錄中:
$ mkdir -p ~/terraform-repo/nginx
請注意,這些範例在你的筆記型電腦或工作站上同時執行 Docker 和 Terraform,但你也可以將容器佈署到你的獨立 Docker 主機 docker.devops.lab。要使用那個遠端 Docker 主機,請將你的 main.tf 中的 Docker 提供者行更改為以下內容:
provider "docker" {
host = "ssh://user@docker.devops.lab:22"
}
以下是一個簡單的 Terraform main.tf 檔案,用於在 Docker 中建立 NGINX 容器:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = ">= 2.15.0"
}
}
}
provider "docker" {
host = "unix:///var/run/docker.sock"
}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "tutorial"
ports {
internal = 80
external = 8080
}
}
內容解密:
terraform { required_providers { ... } }:指定所需的提供者及其版本。provider "docker" { ... }:設定 Docker 提供者,指定連線到本地 Docker 守護程式。resource "docker_image" "nginx" { ... }:定義一個 Docker 映象資源,使用最新的 NGINX 映象。resource "docker_container" "nginx" { ... }:定義一個 Docker 容器資源,使用前面定義的 NGINX 映象,並設定埠對映。
透過這些範例,你可以看到如何使用 Terraform 自動化系統佈署,從而提高 DevOps 工作流程的效率和一致性。
使用 Terraform 自動化佈署 Docker 容器
Terraform 是一種基礎設施即程式碼(Infrastructure as Code, IaC)工具,能夠簡化資源的建立、修改和刪除過程。本文將介紹如何使用 Terraform 佈署 Docker 容器,並探討其基本原理和應用。
Terraform 基本結構
Terraform 的設定檔以 .tf 為副檔名,通常命名為 main.tf。這個檔案定義了所需的提供者(provider)和資源(resource)。以下是一個簡單的 main.tf 範例,用於佈署 Docker 容器:
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 2.13.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:latest"
keep_locally = false
}
resource "docker_container" "nginx" {
image = docker_image.nginx.latest
name = "tutorial"
ports {
internal = 80
external = 8000
}
}
內容解密:
terraform區塊:定義了所需的提供者及其版本。在此例中,使用了kreuzwerker/docker提供者,版本為~> 2.13.0。provider "docker"區塊:初始化 Docker 提供者,使 Terraform 能夠與 Docker 互動。docker_image資源:下載並使用指定的 Docker 映象(在此例中為nginx:latest)。docker_container資源:根據指定的映象建立 Docker 容器,並設定名稱和埠對映。
初始化與佈署
要佈署此設定,請執行以下步驟:
初始化 Terraform:
$ terraform init此命令下載所需的提供者外掛。
規劃佈署:
$ terraform plan此命令檢查設定檔的有效性並顯示將要執行的變更。
應用佈署:
$ terraform apply此命令根據設定檔建立資源。執行時需要輸入
yes以確認。
確認與清理
佈署完成後,可以使用以下命令確認容器是否正在執行:
$ docker ps
若要刪除容器和相關資源,請執行:
$ terraform destroy
輸入 yes 以確認刪除操作。
版本控制與安全
建議使用 Git 追蹤 Terraform 設定檔的變更。建立 .gitignore 檔案以忽略 Terraform 的狀態檔案,避免將敏感資訊上傳至版本控制系統。
將 Terraform 與 Proxmox 結合使用
除了 Docker,Terraform 也支援其他多種平台,如 Proxmox。本文將簡要介紹如何組態 Proxmox 以與 Terraform 協同工作。
組態 Proxmox
要在 Proxmox 中使用 Terraform,需要進行一些初始設定,包括建立角色和使用者,並賦予其執行自動化任務的許可權。這些設定可以透過 Proxmox 的命令列或網頁介面完成。
設定步驟範例圖示
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title GitLab CI CD 與 Terraform 自動化佈署
package "Docker 架構" {
actor "開發者" as dev
package "Docker Engine" {
component [Docker Daemon] as daemon
component [Docker CLI] as cli
component [REST API] as api
}
package "容器運行時" {
component [containerd] as containerd
component [runc] as runc
}
package "儲存" {
database [Images] as images
database [Volumes] as volumes
database [Networks] as networks
}
cloud "Registry" as registry
}
dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置
@enduml此圖示說明瞭在 Proxmox 中設定 Terraform 的基本流程。
詳細步驟說明:
- 建立角色:定義一個具有必要許可權的角色,以便 Terraform 可以與 Proxmox API 互動。
- 建立使用者:建立一個專門用於 Terraform 的使用者帳戶。
- 賦予許可權:將剛才建立的角色賦予給新建立的使用者。
這些步驟確保了 Terraform 能夠安全有效地與 Proxmox 平台互動,從而實作自動化佈署和管理虛擬機器或 LXC 容器。
使用 Terraform 管理 Proxmox 資源
一旦 Proxmox 設定完成,就可以使用 Terraform 的 telmate/proxmox 提供者來管理 Proxmox 資源,包括虛擬機器和 LXC 容器。這需要定義一個 main.tf 檔案,並在其中指定 Proxmox 提供者和相關資源。
provider "proxmox" {
# 設定 Proxmox 提供者的引數,例如 endpoint 和憑證資訊
}
resource "proxmox_lxc" "example" {
# 定義 LXC 容器的設定,例如範本、CPU 和記憶體資源
}