如何在CentOS7上使用Etckeeper通过版本控制管理/etc

来自菜鸟教程
跳转至:导航、​搜索

介绍

在 Linux 生态系统中,定期安装、维护和升级软件是必须的。 但是,仍然需要跟踪对本地配置文件所做的更改。 与在进行更改之前复制配置文件的旧备用方式相反,etckeeper 允许您使用 Git、Mercurial、Bazaar 或 Darcs 存储库跟踪修改,就像您对软件开发项目所做的那样。

此外,etckeeper 与 yum 无缝集成,可以在升级包时自动提交对 /etc 目录内容所做的更改。 如果您想要(或需要)这样做,这将允许您恢复到以前版本的配置文件。

先决条件

要遵循本教程,您将需要:

  • 一个具有 sudo 非 root 用户的 CentOS 7 Droplet,您可以按照 本教程 中的步骤 1 到 4 进行设置。

etckeeper 仅跟踪文件权限、元数据和更改。 它不提供开箱即用的工具来执行文件的恢复,因此有必要了解修订控制系统的基础知识。

在本文中,我们将使用 Git,它是 etckeeper 使用的默认 VCS。 如果你想刷新关于 Git 和版本控制的记忆,可以查看【X84X】本教程系列【X108X】。 虽然您不会在本指南中直接使用 Git,但您可以通过 etckeeper 运行特定于 Git 的命令。

第 1 步 — 安装 etckeeper

在这一步中,我们将安装 etckeeper。

首先,您需要在您的 CentOS 7 服务器上启用 EPEL(企业 Linux 的额外软件包),因为那是包含 etckeeper 的存储库。

sudo yum update && sudo yum install epel-release

然后安装etckeeper。

sudo yum update && sudo yum install etckeeper

Git默认自带CentOS 7,所以我们不需要安装。

第 2 步 — 自定义 etckeeper 的配置

安装 etckeeper 后,下一步是更新 /etc/etckeeper/etckeeper.conf 配置文件。

首先,使用 Nano 或您喜欢的文本编辑器打开配置文件。

sudo nano /etc/etckeeper/etckeeper.conf

以下是您需要配置的基本变量,以便 etckeeper 正常工作。 随意将其余设置注释掉。

首先,在注释 # The VCS to use. 下,确保 VCS="git" 未注释(即 行首没有 #)。 默认情况下,此选项已取消注释,因为 git 是 CentOS 7 上 etckeeper 安装使用的默认 VCS。

如果您想阻止 etckeeper 每天自动提交一次更改,请确保取消注释 AVOID_DAILY_AUTOCOMMITS=1。 为了决定是否要设置它,您应该考虑您的系统配置文件是否经常更改(例如 测试环境经常每天都在变化)。 如果是这样,您应该注释掉该行; 否则,您可以发表评论。

如果您希望 yum install 在 /etc 中有未提交的更改时中止,请确保取消注释 AVOID_COMMIT_BEFORE_INSTALL=1。 这将需要在使用 yum 安装软件包之前手动提交。 否则,将其注释掉,yum 将在运行安装之前自动提交更新的文件。 这个选择完全取决于你; 这在很大程度上取决于您的环境和变化的数量。 这很像前面的例子,只是这次它取决于你安装包的频率。

完成更新选项后,保存并关闭文件。

第 3 步 — 初始化 Git 存储库

在这一步中,我们将在 /etc 中初始化 Git 存储库。

首先,切换到/etc目录。

cd /etc

接下来,通过运行以下命令来初始化存储库。

sudo etckeeper init

您应该收到以下消息:

Initialized empty Git repository in /etc/.git/

您现在应该看到 .git 目录和 /etc 中的 .gitignore 文件。 例如,如果您运行以下命令:

ls -la /etc | grep git

您应该会在输出中看到这些行:

drwx------.  7 root     root       4096 Apr  2 21:42 .git
-rw-r--r--.  1 root     root        874 Apr  2 21:42 .gitignore

注意.git必须在本地系统中受到保护(因此只有超级用户的读、写和执行权限); 因为版本控制系统不会自己跟踪文件权限,所以 etckeeper 提供了这个功能。

.git 目录包含几个配置和描述文件以及其他用于 Git 本身的子目录。 .gitignore 文件,它明确指定了 git 应该忽略的未跟踪文件,旨在由 etckeeper 整体管理。 不建议手动编辑它,但有一个例外。

如果您不想使用版本控制跟踪某些文件,您可以手动将它们添加到 .gitignore 文件中。 要停止跟踪文件,首先打开 .gitignore 进行编辑。

sudo nano .gitignore

文件的最后一行将显示为 # end section managed by etckeeper。 添加要忽略的文件的文件名,每行一个,在此文件上方。

file_to_ignore
another_file_to_ignore
# end section managed by etckeeper

然后保存并关闭文件。

由于您之前初始化了本地存储库,因此您还需要从当前由 git 管理的缓存中删除这些文件。

etckeeper vcs rm --cached file_to_ignore

对之前添加到 .gitignore 的文件重复上述命令。

第 4 步 — 将 /etc 提交到 Git 存储库

在这一步中,我们将提交我们的初始 /etc

添加你的第一个提交很容易; 只需输入以下命令。 虽然不是绝对必要的,但您应该为每个提交添加描述,以便以后能够轻松识别它们。

sudo etckeeper commit "First commit of my /etc directory"

然后,您应该会看到提交到您的存储库的文件的输出列表,如下所示(截断):

create mode 100644 selinux/targeted/modules/active/modules/dnsmasq.pp
create mode 100644 selinux/targeted/modules/active/modules/dnssec.pp
create mode 100644 selinux/targeted/modules/active/modules/docker.pp
create mode 100644 selinux/targeted/modules/active/modules/dovecot.pp

第五步——做出改变

在这一步中,我们将对 /etc 中的文件进行一些更改并提交它们。 在下一步中,我们将还原这些更改。

首先,更改您选择的文件的内容。 例如,您可以通过在 /etc/hosts 末尾添加由 IP 地址及其关联主机名组成的行来将新主机添加到本地名称解析中。

首先,打开文件。

sudo nano /etc/hosts

然后,将以下行添加到文件末尾。

192.168.0.2    node01

保存并关闭文件。 现在,让我们提交这个更改。

sudo etckeeper commit "Added a line to the hosts file"

最后,修改文件的权限。

sudo chmod 640 /etc/hosts

并修改其所有权(确保将 sammy 替换为您自己的用户名)。

sudo chown sammy:sammy /etc/hosts

您可以查看 /etc/hosts 的当前权限和所有权。

ls -l /etc/hosts

输出应如下所示:

-rw-r----- 1 sammy sammy 675 Apr 17 15:01 /etc/hosts

第 6 步 — 撤消更改

现在让我们测试一下 etckeeper 的恢复能力——不仅是文件及其内容,还有它的权限和所有权。

首先,列出您迄今为止所做的提交。

sudo git log --pretty=oneline

输出的第一列是唯一标识提交的 SHA-1 哈希; 第二个是您之前提交更改时使用的描述。

您的输出应该与此类似,但具有不同的哈希值。

d0958fbe4d947a6a3ad98141f9fe89d1fd1a95c4 Added a line to the hosts file
76c193da740a3e137fa000773a79de8bb5c898b7 First commit of my /etc directory

记下每个提交的哈希值。 您将使用它们回滚到之前的状态。

让我们将 /etc/hosts 回滚到开始本教程之前的样子。 将红色字符替换为与您的第一次提交对应的 SHA-1 哈希。 请注意,您不需要指定整个 SHA-1 哈希字符串; 几个唯一标识它的字符就可以了。

sudo etckeeper vcs checkout 76c19 /etc/hosts

现在我们可以检查 /etc/hosts 的内容、权限和所有权,看看它们已经被改回来了。

查看文件的最后几行。

tail /etc/hosts

应该给你一个这样的输出,它缺少我们添加的 192.168.0.2 node01 行,正如预期的那样。

...

# The following lines are desirable for IPv6 capable hosts
::1 test-etckeeper test-etckeeper
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

再次检查 /etc/hosts 的当前权限和所有权。

ls -l /etc/hosts

您将看到如下所示的输出。

-rw-r--r-- 1 root root 704 Apr 17 15:01 /etc/hosts

文件的内容以及权限和所有权已正确恢复。

结论

在本教程中,我们解释了如何使用 etckeeper,这是一个将 /etc 目录存储在 Git 存储库中的好工具。 您还可以使用 Bazaar、Mercurial 或 Darcs 存储库。

无论您选择哪种 VCS,etckeeper 都将帮助您掌握配置文件,并确保您在需要撤消更改或修改功能时始终可以回滚到以前的状态。