rsync+Gitで設定ファイルの差分管理

基本的にサーバーの設定はPuppet経由で実施しており、かつmanifestをGitで管理しているので、変更内容は後から容易にトラッキング出来るのだが、1台だけで実施していた作業や、暫定的に追加した対応については、サーバー上の設定を直接変更していることも多い。

その部分については、基本的には設定項目をExcelで管理していたのだが、変更項目が多かったり、今までに無い変更だったりすると、台帳のフォーマットに大きく変更が入ってしまうことがある。
また複数人で作業していると台帳更新が徹底されないこともあり、もう少し上手いやり方が欲しいところだった。

より上手い方法として、サーバー上で変更が頻繁に入る部分を、日次でrsyncでGitサーバーに転送しておき、かつGitサーバーではcronでdailyコミットを行うことで、各設定ファイルの差分を管理していくことにした。

やり方としては次のようになる。(CentOS6で実施。)
1. Gitサーバー側での作業
1-1.
次のような/etc/rsyncd.confを作成しておく。

uid = root
gid = root

[rsyncbackup]
        path = /srv/rsyncbackup
        read only = false

合わせて/etc/xinetd.d/rsync でdisable = no を設定し、xinetd を有効化しておく。

1-2.
/srv/rsyncbackup でgit initを実施しておく。

1-3. cronに次の登録を実施しておく。

 cd /srv/rsyncbackup && git add -A . && git commit -m "daily commit" > /dev/null 2>&1

2. 管理したいサーバーに 次のcronを登録する。(転送対象, 除外対象、転送時刻は適宜変更)

2 1 * * * cd / && rsync -aqzR --exclude=/etc/selinux /etc /usr/local serverfqdn::rsyncbackup/$(hostname)

これで、各サーバーの設定ファイルがGitで管理できるようになる。普段.yyyymmdd などのバックアップファイルで管理している部分までdiff形式で取得できるようになるのでとても便利だ。また、スクリプトの開発等で使用しているサーバーに入れておくことで、各サーバーにGitを入れなくてもスクリプトのバージョン管理が出来るようになる。

[考慮点]

  • 一部のファイル (/etc/adjtime など) は定期的に内容が変化して、その度にコミットが発生してしまう。こちらを回避するために不要な項目については .gitignoreに追加していく必要がある。
  • Gitはレポジトリのサイズが大きくなるとgit status, git log --stat などのスピードが落ちるので、各サーバーから送付するサイズはできる限り絞った方がよい。
  • DBの中に設定を持つような場合、PostgreSQLならテーブル指定のpg_dump等を使用して設定ファイルとして落とし込む必要がある。
  • rsyncに--deleteをつけた方がよいかは今後の課題。

[今後の展開]

  • Puppetマニフェストもそうだが、こちらのレポジトリもRedmineと組み合わせておくと、チケット内容(日付、実施者、変更意図、作業ログなど)と実機の設定変更の内容を関連付けることが出来る。後から実施内容を振り返る際にとても便利そうだ。。


トラックバック
http://d.hatena.ne.jp/enakai00/20131001/1380616727