Git または別の VCS を使用して、アプリケーション実行時に変更されるサーバー構成ファイルをバージョン管理するにはどうすればよいですか?

Git または別の VCS を使用して、アプリケーション実行時に変更されるサーバー構成ファイルをバージョン管理するにはどうすればよいですか?

私は Minecraft サーバー (craftbukkit) を運営していますが、サーバー構成ファイルの変更権限を必要とする管理者が他にも数人います。管理者の変更をすべて追跡することが重要なので、当然ながら、git が適切な選択肢のように思えます。

この質問は多くの状況に当てはまる可能性があることに注意してください。これは Minecraft に特有のものではありません。

Gitを使ってウェブサイトを管理するチュートリアルはいくつかあります。最も一般的な解決策は、受信後フックWeb ディレクトリへのチェックアウト操作を実行します。ただし、私の状況では、これによっていくつかの問題が発生します。

まず、管理者が編集する必要があるファイルがいくつかあります実行時にサーバーによって変更されるサーバーのディレクトリ自体をリポジトリにすると、git が混乱するのではないかと思います。私が正しいとすれば、受信後のチェックアウト ソリューションを使用すると、この問題は少なくなります (まだ git を学習中です)。

また、サーバーで行われた変更をリポジトリにプッシュして、管理者がそれらの変更をローカルリポジトリに取得できるようにする必要があります。inotifywaitしかし、これらはすべて、単一のファイルの変更のみを考慮しているようです。私のサーバーには 50 ~ 80 個の構成ファイルがあり、サーバー ランタイムが変更したときに追跡して自動コミットする必要があります。これを処理する最善の方法は何でしょうか?

Git の使用は必須ではないことに注意してください。これまで使用してきたものが気に入っているだけです。この作業に適したより優れたツールがあれば、それがユーザーフレンドリーである限り、それを使用することに抵抗はありません。私のサーバー管理者はプログラマーでも Linux のパワーユーザーでもありませんので、ユーザーフレンドリーであることは重要です。

もともとこれを StackOverflow に投稿しましたが、こちらの方が適していると言われました。

答え1

これは完全な答えではありませんが、役に立つ考えがいくつかあることを願っています。

inotifywait複数のファイルでも問題なく動作し、ディレクトリに再帰的にウォッチポイントを設定できます。たとえば、次のように実行できます。

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 ベースのワークフローを自動化するための気の利いたツールです (ただし、ソリューションの性質は大幅に変更されません)。

管理者が、実行時にサーバーによって更新される同じファイルを編集する場合、問題に直面することになります。これは、サーバー上で何らかの自動競合解決を設定する必要があることを示唆しており、必然的に一部の情報が失われることになります(まあ、見かけ上少なくとも、リポジトリの 2 つの異なるブランチで競合する変更を保存できますが、サーバーは 1 つのブランチしか認識できません。

この問題や解決策のどの部分も Git に特有のものではないと思います。あらゆる種類の分散型、非同期同期型のファイル共有メンテナンスで、これらの問題に遭遇することになります。

答え2

同様の状況で私が行ったことは、ライブ構成をリポジトリ (私は Bazaar を使用することが多い) にして、変更を自動的にコミットする cronjob を記述することです。ライブ構成を VCS リポジトリにすることは問題にならないはずです。唯一の違いはディレクトリですが.git、ほとんどの場合は無視されるはずです。cronjob の間隔は、満足できる粒度であれば何でもかまいません。私の状況では 1 時間ごとに十分でしたが、必要に応じて 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

まず、管理者が編集する必要があるファイルがいくつかあります実行時にサーバーによって変更される

問題ない。

また、サーバーによって行われた変更をリポジトリにプッシュして、管理者がそれらの変更をローカル リポジトリに取得できるようにする必要があります。

デフォルトでは、etckeepercron ジョブとして毎日実行されます。

/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

毎日または1分間隔でも十分でない場合は、ウォッチャー変更後すぐに設定ファイルをコミットできます:

/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

試してみる。

関連情報