如何使用 git 或其他 VCS 對在應用程式運行時更改的伺服器設定檔進行版本控制?

如何使用 git 或其他 VCS 對在應用程式運行時更改的伺服器設定檔進行版本控制?

我正在運行 Minecraft 伺服器 (craftbukkit),並且還有其他幾位管理員想要存取修改伺服器設定檔。追蹤他們的所有更改很重要,因此 git 似乎是一個不錯的選擇。

請注意,這個問題可能涉及很多情況,它不是 Minecraft 特有的。

有幾個關於使用 git 管理網站的教學。最常見的解決方案似乎是使用接收後掛鉤對 Web 目錄執行簽出操作。然而,就我的情況而言,這會帶來一些問題。

首先,管理員需要編輯一些文件在運行時由伺服器更改。我假設如果我將伺服器目錄本身放入儲存庫,這會讓 git 感到困惑。如果我是正確的(我仍在學習 git),使用接收後結帳解決方案,問題會更少。

我還需要將伺服器所做的更改推送到儲存庫中,以便管理員可以將這些變更提取到本機儲存庫中。我看過使用的解決方案inotify等待但這些似乎都只考慮到單一文件的變更。我的伺服器有 50-80 個配置文件,當伺服器運行時更改它們時,我需要追蹤它們並自動提交。處理這個問題的最佳方法是什麼?

請注意,使用 git 不是必要的。我只是喜歡到目前為止我所使用的東西。如果有更好的工具可以完成這項工作,我願意使用它,只要它是用戶友好的。請注意,我的伺服器管理員不是編碼人員,也不是 Linux 高級用戶,因此用戶友善性會有所幫助。

我最初將其發佈在 StackOverflow 上,但被告知它更適合這裡。

答案1

這不是一個完整的答案,但希望有一些有用的想法:

inotify等待將愉快地處理多個文件,並且可以遞歸地在目錄上設置觀察點。例如,我可以運行:

inotifywait -m -r -e close_write /etc

/etc/passwd並編輯和後得到以下日誌/etc/postfix/main.cf

/etc/ CLOSE_WRITE,CLOSE .passwd.swpx
/etc/ CLOSE_WRITE,CLOSE .passwd.swp
/etc/ CLOSE_WRITE,CLOSE 4913
/etc/ CLOSE_WRITE,CLOSE passwd
/etc/ CLOSE_WRITE,CLOSE .passwd.swp
/etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swx
/etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swp
/etc/postfix/ CLOSE_WRITE,CLOSE 4913
/etc/postfix/ CLOSE_WRITE,CLOSE main.cf
/etc/postfix/ CLOSE_WRITE,CLOSE .main.cf.swp

您可以非常輕鬆地將其寫入腳本中,在每次close_write事件發生時,將檔案提交到本機儲存庫並將變更推送到遠端伺服器。

另請注意因克朗是一個漂亮的工具,用於自動化這種基於 inotify 的工作流程(但不會顯著改變解決方案的性質)。

如果您的管理員要編輯伺服器在執行時間更新的相同文件,您將會遇到困難。這表明您將必須在伺服器上設定某種自動衝突解決方案,這將不可避免地導致丟失一些資訊(嗯,明顯的損失,至少,您顯然可以在存儲庫的兩個不同分支中保留衝突的更改,但伺服器只能看到一個分支)。

我不認為這個問題或解決方案的任何部分是 git 所特有的。對於任何類型的分散式、非同步同步共用檔案維護,您都會遇到這些問題。

答案2

我在類似情況下所做的是將即時配置作為儲存庫(我傾向於使用 Bazaar),並編寫一個 cronjob 來自動提交任何更改。即時配置 VCS 儲存庫應該不是問題——唯一的區別是.git目錄,在大多數情況下應該忽略它。 cronjob 的間隔可以是您滿意的任何粒度。對於我的情況來說,每小時一次就足夠了,但如果有必要,也可以每 5 分鐘一次,甚至 1 分鐘一次。

答案3

有幾個關於使用 git 管理網站的教學。最常見的解決方案似乎是使用接收後掛鉤對 Web 目錄執行簽出操作。

對於配置文件,請查看等等管理員:

Name       : etckeeper
Arch       : noarch
Version    : 0.63
Release    : 1.el5
Size       : 36 k
Repo       : epel
Summary    : Store /etc in a SCM system (git, mercurial, bzr or darcs)
URL        : http://kitenet.net/~joey/code/etckeeper/
License    : GPLv2+
Description: The etckeeper program is a tool to let /etc be stored in a git,
           : mercurial, bzr or darcs repository. It hooks into yum to automatically
           : commit changes made to /etc during package upgrades. It tracks file
           : metadata that version control systems do not normally support, but that
           : is important for /etc, such as the permissions of /etc/shadow. It's
           : quite modular and configurable, while also being simple to use if you
           : understand the basics of working with version control.
           : 
           : The default backend is git, if want to use a another backend please
           : install the appropriate tool (mercurial, darcs or bzr).
           : To use bzr as backend, please also install the etckeeper-bzr package.
           : 
           : To start using the package please read /usr/share/doc/etckeeper-0.63/README

首先,管理員需要編輯一些文件在運行時由伺服器更改

沒問題。

我還需要將伺服器所做的更改推送到儲存庫中,以便管理員可以將這些變更提取到本機儲存庫中。

預設情況下,etckeeper每天作為 cron 作業運行:

/etc/cron.daily/etckeeper

#!/bin/sh
set -e
if [ -x /usr/bin/etckeeper ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
    . /etc/etckeeper/etckeeper.conf
    if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then
        # avoid autocommit if an install run is in progress
        lockfile=/var/cache/etckeeper/packagelist.pre-install
        if [ -e "$pe" ] && [ -n "$(find "$lockfile" -mtime +1)" ]; then
            rm -f "$lockfile" # stale
        fi
        if [ ! -e "$lockfile" ]; then
            AVOID_SPECIAL_FILE_WARNING=1
            export AVOID_SPECIAL_FILE_WARNING
            if etckeeper unclean; then
                etckeeper commit "daily autocommit" >/dev/null
            fi
        fi
    fi
fi

如果您還想推送到遠端儲存庫,請按如下方式編輯上述文件:

        if etckeeper unclean; then
            etckeeper commit "daily autocommit" >/dev/null
            cd /etc && git push origin master
        fi

如果每天甚至每分鐘的間隔還不夠,守望者可以在變更後立即提交設定檔:

/etc/watcher.ini

[DEFAULT]
logfile=/tmp/watcher.log
pidfile=/tmp/watcher.pid
[job1]
watch=/etc
events=create,delete,write_close
recursive=true
autoadd=true
command=cd /etc && etckeeper commit "daily autocommit" >/dev/null && git push origin master

試一試。

相關內容