我注意到有几个人建议使用etckeeper将版本控制应用于我的 /etc 目录。
在我看来,默认安装会将存储库放在您尝试管理的 /etc 所在的同一台机器上。这对于版本控制来说很好,但并没有带来制作文件服务器外备份的额外好处 - 或者允许我将 /etc 的部分内容从一台源机器复制到另一台源机器。
是否有可能共享一个 git 存储库在中央管理机器上,以便每个服务器上的 etckeeper 将其数据存储在同一个位置?
(我现在用 svn 和一些自定义脚本做类似的事情来提交和恢复文件,但我必须记住在进行更改时提交它们。)
答案1
首先,使用安装 etckeeper,在 /etc/etckeeper/etckeeper.conf 中为 git 配置。按照 etckeeper 的安装方法安装您的发行版或从源代码安装。
很快,你就会有一个 /etc/.git
现在在您的服务器上,确保您有一个(安全的)repo 可以推送到...
# ssh faruser@farhost
# mkdir somedir && cd somedir && git init && chmod 700 .git
# exit
现在在初始主机上,通过 ssh 将本地 repo 推送到服务器:
# cd /etc && git push faruser@farhost:somedir
在这种情况下,Somedir 当然可以是相对的(遵循 ssh 约定)
每当您做出影响 /etc 的更改(并被 etckeeper 拦截到 /etc/.git 中)时,请执行此操作,这样您的机器就会同时拥有本地和离机存储库。
或者设置无密码 ssh 并在 /etc/etckeeper/commit.d/ 中创建一个钩子,这样如果机器始终处于连接状态,它就会自动发生。
答案2
可以添加远程分支配置,将每个服务器的 etckeeper 存储库的主分支映射到远程存储库上的分支。为此,您可以在每台服务器上运行以下命令:
cd /etc
git branch -m master $HOSTNAME
git remote add origin [email protected]:path/to/single/repo.git
git push -u origin master:$HOSTNAME
完成此设置后,后续git push
将把每个服务器主分支的更改发送到中央存储库上的专用服务器分支。
尽管分支没有共同的起点,但可以通过运行以下命令轻松比较来自两个不同分支(代表两个不同的服务器)的同一个文件:
git diff origin/server1 origin/server2 -- file
这可以与以下建议的自动设置相结合乔乔。
答案3
如何自动完成,完整内容:
在客户端上创建文件 /etc/etckeeper/commit.d/60-push(不要忘记 chmod+x 它)。
#!/bin/sh
git push central_server:/var/git/client_name.git master
central_server 在 ssh 配置中定义,见下文。/var/git/client_name.git 是中央服务器上的目录,包含 git repo。
来自 root(!) 的 ~/.ssh/config 应该包含如下内容:
host central_server
Hostname 192.168.0.1
User etckeeper #a user on the central server
IdentityFile ~/.ssh/custom_key # key is in authorized_keys in
#etcpeeper@central_server:~/.ssh/authorized_keys
然后你需要在 central_server 上初始化 git repo
mkdir /var/git/client_name.git
su etckeeper
cd /var/git/client_name.git
git --bare init
通过在 /etc 中进行小幅编辑来测试它,然后使用 etckeeper 提交“test push'ing”。