我正在運行 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
試一試。