使用 git 處理多個伺服器配置文件
我們已經將很多原始碼遷移到 git 並且對我們目前的解決方案非常滿意。我們希望我們的伺服器配置文件在同一個系統上進行版本控制,但是有一些事情不能按照我們希望的方式工作,我希望有人可以在這里分享他的經驗。
這個問題類似於對伺服器配置文件使用修訂控制?,但我們有一些特殊要求不適用於該問題的建議。
目前設置使用 subversion 配置文件。相應的儲存庫看起來像這樣
/ # 倉庫根目錄 +--www.domain.com/ # www 的配置 | \ - ETC/ | \--apache2/ +--dev.domain.com/ # 開發者配置 | +--等/ | \ - 選擇/ | \--app1/ | \--conf/ # app1 在 dev 上的配置 \--staging.domain.com/ # 暫存配置
使用 subversion 就可以了,因為可以只簽出儲存庫的子目錄。此外,您可以使用 svn:externals 指向一個通用結構,用於幾種不同的配置設置。我們只需要處理所有版本化目錄中的*.svn*文件。另一方面,Git沒有 svn:externals和稀疏檢出總是要求從根目錄到實際目錄的路徑相同。
在討論遷移到 git 時,我嘗試寫下伺服器配置版本控制的主要要求:
- 我們只想要一個儲存庫
- 應該可以輕鬆地將更改推送到中央遙控器
- 變更集應該包含真正的作者
有沒有一種很好的方法可以將所有配置都放在一個儲存庫中,並且只有一個子路徑作為工作副本?目前我正在考慮兩種方法,但想先在這裡問這個問題
- 如果*.git儲存庫位於固定位置,例如/var中的某個位置,我們可以從“目標”工作目錄連結到子路徑。主要問題:我不知道如何從/etc* “連結”到另一個目錄以便只導入內容,除了符號連結單個文件
- 我在這個 SO question上找到了另一種選擇,建議在一個儲存庫中有多個分支。這肯定會增加複雜性,但我可以看到我們嘗試這種方式。
在單台機器上使用 git 進行配置文件管理工作正常,但我相信一定有人按照我們想要的方式使用它。
謝謝卡里姆_
我以前用過這樣的東西;這就是它的工作原理。
回購設置
- 創建一個 git repo,“etc_files”。
- 為每種機器類型創建一個分支,例如“server/www”、“server/dev”等。
- git 支持分支名稱中的斜杠。這有助於我將樹枝保持在腦海中。
- 如果您的機器數量足夠少,則可以為每台單獨的機器創建一個分支。
- 為每個共享基礎設施創建一個分支,例如“modules/apache”、“modules/cups”等。
- 這些分支用於保存所有機器之間相同的文件,例如
/etc/resolv.conf
. 這些將是您現在保存在“svn:externals”儲存庫中的文件。製造一台新機器
- 在新機器上,複製 git repo 並檢查該機器類型的分支。
- 我將此設置為只讀複製,以防止人們未經測試就從生產機器送出更改。
- 設置一個 cron 作業以
git pull
每天自動執行 repo。更改機器分支
更改單個機器分支中的程式碼很簡單;只需
git checkout
開發環境中的適當分支,進行更改,然後將它們送出回中央儲存庫。該分支中的所有機器將在下次 cron 作業執行時自動獲取更改。更改模組分支
更改模組分支的程式碼只是稍微複雜一些,因為它涉及兩個步驟:
git checkout
適當的模組分支- 進行更改並將其送出到集中式伺服器。
git checkout
每個使用該模組分支的機器分支,然後將模組分支合併到其中。git 會發現您之前已經合併了該模組分支,並且只注意到自最後一個共同父級以來發生的更改。這種方法既有優點也有缺點。一個好處是我可以對模組分支進行更改並將其應用於需要它的機器分支,這讓機器分支在準備好之前不會保留在舊版本中。那麼,缺點是您必須記住將模組分支合併到可能正在使用它的每個機器分支中。我使用了一個遍歷送出樹並自動為我進行合併的腳本,但仍然會很痛苦。
作為替代方案,較新版本的 git 支持稱為“子模組”的東西:
子模組允許將外部儲存庫嵌入到源樹的專用子目錄中,始終指向特定的送出。
這將允許你建構一些有點像“svn:externals”樹的東西,然後你可以像現在一樣更新它們。