Управление версиями /etc при помощи Etckeeper в CentOS 7
Centos, Linux | Комментировать запись
В экосистеме 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: CentOS 7, etckeeper, Git