git 또는 다른 VCS를 사용하여 애플리케이션 런타임 시 변경되는 서버 구성 파일의 버전을 어떻게 제어할 수 있나요?

git 또는 다른 VCS를 사용하여 애플리케이션 런타임 시 변경되는 서버 구성 파일의 버전을 어떻게 제어할 수 있나요?

저는 Minecraft 서버(craftbukkit)를 실행하고 있으며 서버 구성 파일 수정에 액세스하려는 다른 관리자가 여러 명 있습니다. 모든 변경 사항을 추적하는 것이 중요하므로 당연히 git이 좋은 선택인 것 같습니다.

이 질문은 다양한 상황에 적용될 수 있습니다.이는 Minecraft에만 국한되지 않습니다.

git을 사용하여 웹사이트를 관리하는 방법에 대한 여러 튜토리얼이 있습니다. 가장 일반적인 솔루션은 다음을 사용하는 것 같습니다.수신 후 후크웹 디렉토리에 대한 체크아웃 작업을 실행합니다. 그러나 내 상황에서는 몇 가지 문제가 발생합니다.

먼저, 관리자가 편집해야 할 일부 파일런타임 시 서버에 의해 변경됨. 서버 디렉토리 자체를 저장소로 만들면 이것이 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을 사용하여 웹사이트를 관리하는 방법에 대한 여러 튜토리얼이 있습니다. 가장 일반적인 솔루션은 다음을 사용하는 것 같습니다.수신 후 후크웹 디렉토리에 대한 체크아웃 작업을 실행합니다.

구성 파일에 대해서는 다음을 살펴보십시오.etckeeper:

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크론 작업으로 매일 실행됩니다.

/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

시도 해봐.

관련 정보