現代 DevOps 團隊仰賴版本控制系統來管理程式碼,而 Git 正是核心工具。本文將探討 Git 的應用,從系統測試到程式碼備份,並涵蓋與 GitHub 的整合。首先介紹 InSpec,一個用於驗證系統組態的工具,示範如何編寫測試案例並透過 SSH 連線執行。接著說明資料函式庫備份策略,以 MariaDB 為例,講解如何使用 mysqldump 命令備份資料。最後,帶領讀者建立 GitHub 帳戶,設定 SSH 金鑰,並建立第一個 Git 倉函式庫,逐步示範 Git 的基礎操作,包含 add、commit 等指令,以及 .gitignore 的使用。
擴充套件 DevOps 能力:深入 Git 的應用
隨著你在本文中的進展,你已經接觸到了多種不同的 Linux 和開源技術,並且累積了豐富的經驗。這種經驗為你奠定了自動化和容器化技術的基礎,幫助你處理更複雜的任務,並將手動組態轉化為程式碼。DevOps 的核心是可重複的操作,旨在消除繁瑣的手動工作。
在本章中,我們將探討一些方法,透過深入研究 Git 來擴充套件這種理念——基礎設施即程式碼。現代 DevOps 團隊使用版本控制系統,以有組織的方式管理分散的程式碼,而版本控制為基礎設施(裸機、虛擬機器和容器)和應用程式的持續整合和持續交付(CI/CD)提供了支援。無論你是開發還是維運團隊的一員,這些工具正變得更加統一,而 Git 正處於這一切的核心。
使用 InSpec 進行系統測試
在進行系統管理和維護時,確保系統組態正確是至關重要的。Chef InSpec 是一個強大的工具,可以用來測試和驗證系統組態。
編寫簡單的 InSpec 測試
首先,建立一個簡單的 profile 檔案來測試目標系統上是否存在特定的使用者,例如 jadams。你的 my-inspec-test.rb 檔案應包含以下內容:
describe user('jadams') do
it { should exist }
end
要對目標系統執行此測試,請執行以下命令:
$ inspec exec path/to/my-inspec-test.rb -t ssh://root@ubuntu04
這個命令應該在幾秒鐘內完成,並顯示類別似於以下輸出:
Profile: tests from my-inspec-test.rb (tests from my-inspec-test.rb)
Version: (not specified)
Target: ssh://root@ubuntu04:22
User jadams
✓ is expected to exist
Test Summary: 1 successful, 0 failures, 0 skipped
#### 內容解密:
describe user('jadams') do:這行程式碼開始了一個對使用者jadams的描述區塊,用於測試該使用者是否存在。it { should exist }:這行程式碼定義了一個測試,預期使用者jadams應該存在。end:結束描述區塊。
使用 InSpec Shell 進行互動式測試
InSpec 提供了一個內建工具,允許你在不建立檔案的情況下,直接從 shell 中測試 InSpec 資源命令。這是除錯和測試的好方法。
要使用該工具,請執行以下命令,以連線到目標節點:
$ inspec shell -t ssh://root@ubuntu04
這將進入一個帶有 inspec> 提示符的終端會話,你可以在此使用 InSpec 資源編寫測試,一行一行地執行:
describe user('jadams') do
it { should exist }
end
你可以利用近 500 個 Chef InSpec 資源來驗證語法和測試各種匹配器,以及參照系統上的特定值,如包版本。
#### 內容解密:
inspec shell -t ssh://root@ubuntu04:啟動 InSpec shell 並連線到指定的目標節點。describe user('jadams') do至end:與前面的例子相同,用於測試使用者是否存在。
備份工具的使用
在建立系統和構建應用程式時,很容易失去對所擁有的東西的跟蹤,或者更糟糕的是丟失工作。為了最小化這些風險,備份系統、資料和程式碼是非常重要的。
組態 Proxmox 複製
Proxmox 提供了一個系統快照功能,可以用來備份系統到現有的狀態。如果出現問題,可以回復到較早的版本並繼續工作。
此外,Proxmox 還具有複製功能,可以自動將虛擬機器或 LXC 從一個 Proxmox 節點備份到另一個節點。要使用此功能,需要至少兩個 Proxmox 節點。在 Proxmox 控制台中,選擇要複製的虛擬機器,然後點選「Replicate」,並設定相關引數。
#### 內容解密:
- Proxmox 的複製功能可以將系統複製到不同的主機上,確保在驅動器故障或底層系統當機的情況下能夠還原系統。
備份 MariaDB 資料
對於使用 MariaDB 或 MySQL 的資料函式庫,可以使用 mysqldump 命令來備份資料函式庫內容。這個命令可以輸出資料函式庫的內容到一個檔案中,並且可以透過多種引數來設定備份選項。
示例命令如下:
$ mysqldump -u [user] -p[password] --all-databases > mydatabases.sql
$ mysqldump -u [user] -p[password] --database db1 db2 > db01_dump.sql
這些輸出的 .sql 檔案可以用來還原資料函式庫,或者將資料函式庫複製到另一個新系統上。
#### 內容解密:
mysqldump命令用於匯出資料函式庫內容到 SQL 檔案中。-u [user]和-p[password]用於指定資料函式庫使用者名稱和密碼。--all-databases選項用於匯出所有資料函式庫。--database db1 db2用於匯出指定的資料函式庫。
使用 Git 儲存程式碼
雖然 Git 通常被視為版本控制工具,但它也可以作為一種備份解決方案。當與自動化和合規性程式碼一起使用時,Git 提供了一種可靠的方式來遠端儲存和跟蹤程式碼變更。
建議養成建立 Git 儲存函式庫的習慣,例如使用 GitHub 或 GitLab,並將你的程式碼儲存在其中。你甚至可以使用 Proxmox Turnkey 範本佈署自己的 GitLab 伺服器,這是 DevOps 實驗室的一個很好的補充。
#### 內容解密:
- Git 不僅可以用於版本控制,還可以用作備份工具。
- 將程式碼儲存在遠端 Git 儲存函式庫中,可以確保程式碼的安全性和可追溯性。
使用 Git 擴充套件你的 DevOps 能力
在前面的章節中,你還沒有機會深入瞭解 Git 這個版本控制工具。Git 使你能夠進行版本控制、遠端儲存和程式碼分享。在 DevOps 中,使用 Git 已經成為常態,特別是在 GitHub、GitLab 和 Bitbucket 等知名網站的推動下。在接下來的章節中,你將學習一些基本的 Git 命令,建立並使用公共 Git 儲存函式庫,並使用 Proxmox 佈署自己的 GitLab 伺服器。
建立 GitHub 帳戶
GitHub 是開始使用版本控制的好地方,因為它已經相當成熟,相對容易使用,並且為你提供了無限數量的公共和私有儲存函式庫。一個免費的帳戶還為你提供了 2,000 分鐘的 GitHub Actions(用於自動化軟體開發工作流程,也就是所謂的持續整合/持續佈署或 CI/CD),並且可以在你的公共儲存函式庫上分配分享程式碼所有者,以及其他功能。對於你的 DevOps 實驗環境,一個免費的 GitHub 帳戶提供了足夠的能力來完成你的工作。
在本地安裝和組態 Git
在建立帳戶後,回到你的 Linux 工作站終端機來安裝和組態 git。首先,這裡關注的是命令列工具,但你也可以嘗試一些目前可用的酷炫圖形工具。你還可以將你的遠端 GitHub 儲存函式庫與 VS Code 編輯器整合,以便無縫地與你的帳戶合作,這是一種方便的方法,可以實時跟蹤你工作的變化。
在 Ubuntu 系統上,安裝 Git 非常簡單:
$ sudo apt update && apt install git
儘管它很小且輕量級,但 Git 其實非常強大。它跟蹤你程式碼的變化,並允許你在本地建立和提交不同版本的作品,然後將內容推播到遠端伺服器,在那裡它可以被廣泛分享。明確地說,Git 在沒有 GitHub(或 GitLab、Bitbucket 或類別似的公共儲存)的情況下也能正常工作。養成使用它的習慣——在工作過程中執行 Git 命令——是一種很好的方式,可以在不建立龐大的副本的情況下嘗試你的程式碼的新變化。如果你喜歡某個新版本的作品,你可以將其提升(稱為合併),並參考之前提交的作品。
要在你的工作站上使用 Git 與 GitHub,你需要設定幾個本地系統變數,即你的使用者名稱和 GitHub 帳戶電子郵件:
$ git config --global user.name "John Adams"
$ git config --global user.email "[email protected]"
透過全域性設定這些變數,你告訴 Git 誰擁有程式碼,以及在將程式碼推播到你的遠端 GitHub 儲存函式庫時使用哪個帳戶。在團隊環境中,這樣可以輕鬆跟蹤誰在何時何地做了更改。--global 標誌將這些組態設定為系統範圍的(對於你的 Linux 使用者),因此無論你在系統的哪個位置建立程式碼,Git 都知道是你在工作。這些全域性組態儲存在你的 Linux 主目錄中:
$ cat ~/.gitconfig
[user]
name = John Adams
email = [email protected]
建立安全的 SSH 連線
這些基本設定足以讓你入門,但讓我們透過建立並新增一個 SSH 金鑰到你的 GitHub 帳戶設定中,在你的工作站和 GitHub 之間建立一個安全的連線。這將使你能夠以安全的方式將程式碼推播到並從 GitHub 的公共和私有儲存函式庫中提取程式碼。私有儲存函式庫就是這樣,其他 github.com 的使用者無法看到你的作品,除非你明確授予他們許可權。這樣,分散的軟體開發團隊就可以在自己之間儲存和分享敏感程式碼,但不能與全世界分享。
首先,建立一個新的 SSH 金鑰專門用於 GitHub。你可以使用之前生成的 id_rsa 金鑰,但很可能它可以存取你所有的系統,這帶來了一些安全問題。相反,建立一個全新的金鑰,並給它一個能幫助你記住它的用途的名字:
$ ssh-keygen -t rsa -b 4096 -C "[email protected]" \
-N '' -f $HOME/.ssh/github_rsa
此命令建立一個新的 SSH 金鑰,而無需提示你回答組態問題。在這個例子中,你設定加密型別為 RSA,提供你的電子郵件地址,將密碼設定為無(-N ''),並將生成的公鑰和私鑰儲存為 github_rsa 和 github_rsa.pub 在你的 ~/.ssh 目錄中。
將 SSH 金鑰新增到 GitHub
要使用這個新的 SSH 金鑰與 GitHub 實作對遠端站點的安全、免密碼存取,請將 github_rsa.pub 金鑰新增到你的 GitHub 帳戶。登入到 GitHub,透過瀏覽器點選螢幕右上角的帳戶圖示,然後選擇“設定”。在左側選單中,點選“SSH 和 GPG 金鑰”,然後點選綠色的“新建 SSH 金鑰”按鈕。你將看到一個類別似於圖 10-1 的表單。
圖表說明
此圖示呈現了在 GitHub 中新增新的 SSH 金鑰的步驟。
給這個新條目一個標題(比如說,你的工作站主機名或類別似“My-Workstation”的東西),並將你新建立的 ~/.ssh/github_rsa.pub 檔案內容貼上到“金鑰”框中:
$ cat ~/.ssh/github_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDUQpuzXn0bas3SJJJwdp
5eQy9PGC6b/TWmeL1OnXpQYX1qqjP5hACJqcGEGu3p5q25dfXHpXseSBDl
GNjs1WRBQ3RS9c3yc0L8bInN6c5EtFmY4ZKwf8v2LASq4hzJ3YYikAjY3bxv
JyExA1LkTAh9BRcum7Epv9mxPA1VOwJgUQcxyKrsZaUWlJj5rvu9F8uOGUOQ
CawjvP9Ut8dgUYkUzwuJf1CHCsn9Qz40vczextd98mlY4k7wBFryCqJ9bs
GfsUsECGKSwao6LggmQ5u4W1TQls3pKk42owmqMh6ybCPf3rQ==
[email protected]
點選“新增 SSH 金鑰”按鈕儲存此條目後不久,你將收到一封來自 GitHub 的電子郵件,告訴你一個新的公鑰已新增到你的帳戶,這是一個很好的安全功能。
詳細解說
此步驟完成了在本地安裝和組態Git,以及建立與GitHub之間的安全SSH連線。這樣能夠安全地推播和提取程式碼,且能跟蹤變更紀錄,適用於團隊開發環境。
使用 SSH 推播的優勢
當你從 GitHub 下載某個程式碼倉函式庫(稱為克隆)時,通常會使用類別似以下的指令:
$ git clone https://github.com/ubuntu/thunderbird.git
$ git clone [email protected]:ubuntu/thunderbird.git
這些是存取公開和私有 GitHub 倉函式庫及其內容的標準方法。如果倉函式庫是私有的,系統會要求你輸入密碼或權杖以授權存取。使用 SSH 金鑰後,github.com/your-user-name 與你的工作站之間會預先建立授權。這在克隆公開程式碼時並不是什麼大問題,但當你將程式碼推播到 GitHub(或其他版本控制系統)時,它會讓你的生活變得更加輕鬆。你不需要輸入密碼或權杖來確認你的身份和許可權,但你的操作是安全的,且體驗非常順暢。
建立新的 Git 倉函式庫
如今的 GitHub 和類別似的雲端服務使得從其網頁儀錶板建立新的專案倉函式庫變得非常容易。要分享程式碼(並且基本上進行備份),你可以將其從工作站推播到遠端的 GitHub 倉函式庫。
前往你的 github.com/your-user-name 帳戶,點選 Repositories 標籤,然後點選綠色的 New 按鈕以新增一個倉函式庫。輸入 Repository 名稱,選擇 Public 或 Private,並保持 README、.gitignore 和 Choose a license 框為未選中狀態,如圖 10-2 所示。
圖示:建立新的 GitHub 倉函式庫
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Git DevOps 深入應用與實踐
package "軟體測試架構" {
package "測試層級" {
component [單元測試
Unit Test] as unit
component [整合測試
Integration Test] as integration
component [端對端測試
E2E Test] as e2e
}
package "測試類型" {
component [功能測試] as functional
component [效能測試] as performance
component [安全測試] as security
}
package "工具框架" {
component [pytest] as pytest
component [unittest] as unittest
component [Selenium] as selenium
component [JMeter] as jmeter
}
}
unit --> pytest : 撰寫測試
unit --> integration : 組合模組
integration --> e2e : 完整流程
functional --> selenium : UI 自動化
performance --> jmeter : 負載測試
note right of unit
測試金字塔基礎
快速回饋
高覆蓋率
end note
@enduml
此圖示說明瞭在 GitHub 上建立新倉函式庫的步驟。
你的 GitHub 倉函式庫帳戶現在將在主儀錶板的 Repositories 檢視中顯示該倉函式庫。
建立內容
在此步驟中,你將開始在工作站上使用 Git,然後將其推播到新的 GitHub 倉函式庫。雖然你已經有一些包含先前章節程式碼的目錄,但請從一個全新的目錄開始此範例。
$ cd ~
$ mkdir my-test-repo
在該新資料夾中,使用 Git 初始化它:
$ cd ~/my-test-repo
$ git init
init 命令在資料夾內建立一個新的 .git 目錄,這是 Git 跟蹤你正在處理的程式碼的地方。你可以在目錄中新增一個 .gitignore 檔案,告訴 Git 不跟蹤某些檔案或資料夾。例如,如果你在 my-test-repo 中有一個名為 private-stuff 的子目錄,你可以建立一個包含該條目的 .gitignore:
$ vi .gitignore
# 排除 private-stuff 資料夾
private-stuff
任何列在 .gitignore 中的檔案或資料夾都將被完全忽略。在此範例中,這意味著 private-stuff 資料夾及其中的所有內容。當然,這只是一個基本的範例。你可以使用 .gitignore 做很多事情,包括忽略特定型別的所有檔案(*.pub)等等。
#### 程式碼解析:.gitignore 用法
# 排除特設定檔案或資料夾
private-stuff
*.pub
內容解密:
private-stuff:排除名為 private-stuff 的資料夾及其所有內容。*.pub:排除所有副檔名為 .pub 的檔案。
Git 透過跟蹤檔案並維護有關它們的資訊來運作。使用 git add 和 git commit 可以開始這種跟蹤,每次你進行的提交本質上是你當前分支中的工作快照。Git 使用分支來跟蹤同一倉函式庫的不同內容,讓你可以在不更改原始檔案的情況下對現有程式碼進行更改。
讓我們看看這是如何與一個簡單的文字檔案一起運作的。在 ~/my-test-repo 中新增一個檔案,例如 example.txt:
$ echo "這是我的文字檔案。" > example.txt
如果你檢視此資料夾的 git status,你的檔案將與有關你當前分支的一些其他資訊一起出現,預設為 master:
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
example.txt
nothing added to commit but untracked files present (use "git add" to track)
此輸出告訴你,你處於預設分支(master),並且在此分支中有檔案,但 Git 尚未對它們進行任何操作。透過執行 git add,然後執行 git commit 來更改此狀態:
$ git add .
這裡的 . 是告訴 Git 將當前資料夾 my-test-repo 中的所有內容新增到其跟蹤中。你也可以使用 git add example.txt 新增單個檔案。需要注意的是,如果成功執行,執行 git add 不會產生任何輸出。再次使用 git status 檢視發生了什麼變化。
#### 程式碼解析:Git 基本操作
$ git add .
$ git commit -m "首次提交。"
內容解密:
git add .:將當前目錄下的所有檔案新增到 Git 的跟蹤中。git commit -m "首次提交。":提交變更並新增提交訊息「首次提交。」。
當你在下一個範例中執行 git commit 時,Git 將根據 git add 步驟知道應該包含哪些檔案。試試以下操作,並新增 -m 旗標以新增有關提交的訊息。這是允許你新增有關提交本身的描述(例如發生了什麼變化)的必要步驟。
$ git commit -m "首次提交。"
[master (root-commit) 8f9acf2] 首次提交。
2 files changed, 3 insertions(+)
create mode 100644 .gitignore
create mode 100644 example.txt
與 git add 不同,此命令提供輸出,如果再次執行 git status,你將看到 Git 確實已經開始跟蹤你的工作,並且知道你已經儲存(提交)了你的工作。這也設定了 head,即你目前跟蹤的程式碼版本:
$ git status
On branch master
nothing to commit, working tree clean
如果你執行 git show,你將看到你的 example.txt 檔案的內容以及有關你稱為「首次提交」的提交的一些資訊。
現在,對你的 example.txt 檔案進行編輯,新增一行,使其內容變為:
這是我的文字檔案。
這是一些更多的內容。
如果你現在執行 git add 和 git commit,Git 將知道這兩個版本的單一檔案,並向你顯示差異:
$ git add .
$ git commit -m "第二次提交。"
$ git show example.txt
#### 程式碼解析:檢視變更差異
$ git show example.txt
內容解密:
git show example.txt:顯示 example.txt 檔案的最新變更內容。