Управление версиями /etc при помощи Etckeeper в CentOS 7

В экосистеме Linux такие процессы, как установка, поддержка и обновление программного обеспечения, являются постоянной необходимостью. Однако при этом также важно постоянно отслеживать изменения в локальном конфигурационном файле. Инструмент etckeeper позволяет управлять изменениями в этом конфигурационном файле при помощи репозиториев Git, Mercurial, Bazaar или Darcs – то есть точно так же, как при разработке проекта. Это устраняет необходимость создавать резервную копию файла перед внесением в него каких-либо изменений или поправок.

Кроме того, etckeeper легко интегрируется с yum для автоматической фиксации изменений, внесенных в содержимое каталога /etc при обновлении пакетов. Это позволяет в случае необходимости вернуться к предыдущим версиям конфигурационных файлов.

Требования

Чтобы следовать руководству, понадобится учётная запись не-root пользователя с правами sudo; подробнее об этом можно узнать в этой статье.

Инструмент etckeeper отслеживает только права доступа к файлам, метаданные и изменения. Он не предоставляет инструментов «из коробки» для восстановления файлов. Потому необходимо знать и понимать основы работы системы контроля изменений.

В данном руководстве будет использоваться Git, стандартная система контроля версий для etckeeper. Чтобы получить дополнительные инструкции по работе с Git, читайте следующие статьи:

В этом руководстве Git напрямую не используется, но etckeeper позволяет запускать команды Git.

1: Установка etckeeper

Сначала нужно добавить на сервер репозиторий EPEL (англ. Extra Packages for Enterprise 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.con. Откройте его в текстовом редакторе.

sudo nano /etc/etckeeper/etckeeper.conf

Далее приведены основные переменные, которые нужно отладить, чтобы etckeeper мог работать должным образом. Остальные параметры можно оставить закомментированными.

В разделе # The VCS to use найдите строку VCS=”git” и убедитесь, что она раскомментирована (удалите символ # в начале строки). Эта опция должна быть раскомментирована по умолчанию, так как Git является стандартной VCS для etckeeper в CentOS 7.

Чтобы запретить etckeeper автоматически вносить изменения раз в день, убедитесь, что строка AVOID_DAILY_AUTOCOMMITS=1 раскомментирована. Чтобы решить, нужно вам это или нет, подумайте о том, насколько часто конфигурационные файлы системы подвергаются изменениям (например, среда тестирования, как правило, изменяется каждый день). Если конфигурационные файлы меняются часто, нужно раскомментировать эту строку; в противном случае можете оставить её закомментированной.

Чтобы прерывать установку менеджера yum в случае, если в /etc остались не переданные изменения, раскомментируйте AVOID_COMMIT_BEFORE_INSTALL=1. Эта строка требует создавать коммиты вручную, прежде чем использовать yum для установки пакетов. Необходимость этой опции зависит только от индивидуальной среды сервера и количества изменений. В принципе, она очень похожа на предыдущую опцию, но касается в первую очередь установки пакетов.

Обновив параметры настроек, сохраните и закройте файл.

3: Установка репозитория Git

Теперь нужно инициировать репозиторий Git в каталоге /etc. Для начала откройте этот каталог.

cd /etc

Инициируйте репозиторий Git при помощи команды:

sudo etckeeper init

На экране должно появиться сообщение:

Initialized empty Git repository in /etc/.git/

Теперь в каталоге /etc можно найти каталог .git и файл .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

Теперь нужно создать коммит для начального состояния каталога /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

5: Внесение изменений

Теперь внесите изменения в файл, находящийся в каталоге /etc и добавьте коммиты для этих изменений, чтобы потом попробовать отменить их.

Выберите любой файл и измените его. К примеру, можно добавить новый хост; для этого вставьте строку, содержащую IP-адрес и имя хоста, в конец файла /etc/hosts.

Итак, откройте файл:

sudo nano /etc/hosts

В конец файла вставьте строку:

192.168.0.2    node01

Сохраните и закройте файл. Создайте коммит:

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

Отредактируйте права на файл:

sudo chmod 640 /etc/hosts

Измените владельца файла (замените условное имя пользователя 8host своим именем):

sudo chown 8host:8host /etc/hosts

Проверьте текущие права доступа и владельца файла:

ls -l /etc/hosts

Вывод должен выглядеть так:

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

6: Отмена изменений

Теперь попробуйте использовать функцию восстановления etckeeper; обратите внимание: 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 не нужно, достаточно нескольких символов.

sudo etckeeper vcs checkout 76c19 /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

Теперь проверьте текущие права доступа к файлу и его владельца:

ls -l /etc/hosts

На выходе будет:

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

Как видите, все сведения о файле были восстановлены.

Заключение

Инструмент etckeeper – отличное решение для контроля версий каталога /etc в Git-репозитории. Кроме стандартной системы Git можно также использовать репозитории Bazaar, Mercurial или Darcs.

Вне зависимости от используемой системы контроля версий etckeeper позволит отслеживать конфигурационные файлы и вернуть предыдущее состояние файла при необходимости отменить или отредактировать изменения.

Tags: , ,

Добавить комментарий