Власть над конфигурацией. Etckeeper и Git

Наверное каждый слышал о рекомендации выполнять резервное копирование конфигурационных файлов перед их редактированием. Так же бывают случаи когда обновление пакета или системы в целом приводит к перезаписи файлов с настройками в результате чего что то перестает работать. Если вам известны подобные проблемы то продукт etckeeper то что нужно.

Как это работает

В основе всего лежит система контроля версий — Concurrent Versions System (CVS). Так как /etc традиционно используется для хранения конфигурационных файлов, преимущественно текстовых, CVS здесь подходит как нельзя лучше. Но даже учитывая простоту использования современных систем версионного контроля они имеют тот же недостаток, что и резервное копирование конфигов в ручную. Администраторы попросту забывают или ленятся ими пользоваться будучи уверенными, что все пройдет гладко. По этому, я рекомендую поставить себе на вооружение маленькую но полезнейшую утилиту etckeeper которая будет это делать за вас.

Суть утилиты заключается в том, что бы автоматически делать резервное копирование состояния /etc до и после установки любых приложений а так же раз в сутки на всякий случай. В качестве хранилища, могут использоваться на выбор одна из нескольких CVS. Наиболее популярные из них это Bazaar и Git. В Ubuntu обычно по умолчанию используется первая а RHEL-подобных дистрибутивах в основном Git, хотя, это не принципиально.

Установка

Прелесть этой маленькой утилиты в том, что для ее установки и настройки требуется выполнить буквально несколько простых команд при этом работу которую она делает, сложно переоценить.

Для демонстрации примеров я будут использовать CentOS 6.5 а в роли CVS — Git.

Прежде необходимо подключить репозиторий EPEL;

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh epel-release-6-8.noarch.rpm

Теперь можно устанавливать etckeeper;

yum install etckeeper

В маленьком списке зависимостей можно увидеть Git который будет использоваться по умолчанию.

После успешной установки стоит заглянуть в скромный конфигурационный файл /etc/etckeeper/etckeeper.conf, что бы убедиться в верности параметров.

В начале указываем VCS. Нужная уже выбрана по умолчанию.

#VCS=»hg»
VCS=»git»
#VCS=»bzr»
#VCS=»darcs»

Убираем знак комментария, если не хотим что бы etckeeper делал снимок /etc каждые сутки;

#AVOID_DAILY_AUTOCOMMITS=1

Убираем знак комментария, если не хотим что бы etckeeper делал снимок изменений /etc перед установкой пакетов;

#AVOID_COMMIT_BEFORE_INSTALL=1

На этом пожалуй наиболее интересные параметры заканчиваются остается лишь выполнить запуск etckeeper;

etckeeper init

Initialized empty Git repository in /etc/.git/

В результате будет создан пустой репозиторий Git — /etc/.git в который будут помещаться резервные копии.

Использование

Теперь когда etckeeper запущен, можно спокойно устанавливать новые пакеты или обновлять систему не заботясь о резервном копировании файлов конфигураций, плюс у вас будет ежедневная копия /etc на всякий случай.
Здесь можно было бы рассказать о том как откатиться к нужному снимку /etc и завершать статью. Но, мы ведь профессионалы и должны полностью изучить возможности инструмента и использовать его по максимуму.

Создание копии

После запуска etckeeper рекомендуется в ручную оправить содержимое /etc в репозиторий.

Делается это следующей командой;

etckeeper commit "initial commit"

Это называется commit — базовое понятие во всех системах контроля версий при котором все отличия отправляются в репозиторий. В нашем случае все содержимое /etc так как это первый запуск.

Теперь посмотрим текущий статус;

etckeeper vcs status

On branch master nothing to commit (working directory clean)

Это означает, что не каких изменений с последнего коммита не произведено.

Дабы расставить все по своим местам, необходимо понимать, что приведенные выше команды init, commit это фактически команды Git’a которые etckeeper передает ему в виде параметров.

Например;

etckeeper init = git init /etc

etckeeper vcs status = git status

Здесь, можно провести границу. Обвязка в виде etckeeper’а хороша для выполнения commit’ов автоматически при установке\обновлении ПО и раз в сутки. При работе в ручном режиме правильнее отказаться от посредника и использовать именно Git.

Первичная настройка

Прежде чем перейти к практическим примерам и активному использованию Git’a необходимо настроить ряд параметров, в первую очередь для нашего же удобства. Обычно это делается сразу же после его установки.

Так как Git это среда совместной работы где один и тот же файл может редактироваться несколькими пользователями необходима их идентификация. Для этого используется произвольное имя и e-mail. По умолчанию, эти параметры генерируются на основании имен компьютера и учетной записи пользователя. Но это не нормально и при каждом коммите вам об этом будет напоминаться. Поэтому сразу же зададим эти параметры.

git config --global user.name "Alex Rudenko"
git config --global user.email "a.rudenko@domain.com"

Так же можно задать используемый по умолчанию текстовый редактор;

git config --global core.editor <имя_редактора>

И определить какой утилитой выполнять сравнение файлов, если стандартный diff чем то не устраивает;

git config --global merge.tool <имя_утилиты>

Изменение файлов

Например изменим hostname в файле /etc/sysconfig/network и произведем соответствующие изменения в файле /etc/hosts.

А теперь посмотрим статус;

# git status

...
# modified: hosts
# modified: sysconfig/network
(вывод сокращен)

В результате мы увидим имена файлов изменившихся, с момента последнего коммита;

Примечание: Для удобной работы с репозиторием /etc при помощи команды git необходимо предварительно перейти в каталог /etc (cd /etc) иначе, у всех команд придется дополнительно использовать параметр —git-dir /etc/.git.

А следующая команда покажет что конкретно в них изменено:

git diff

 Плюсами и минусами а так же цветами отмечены соответствующие изминения. Отправим их в репозиторий;

git commit -av -m "Edit hostname and hosts"

-a — отправить в репозиторий все изменения, -v — выводить больше информации, -m — комментарий

Git отслеживает и коммитит изменения только тех файлов, что уже присутствуют в репозитории. Если вы создадите новый файл в директории /etc то утилиты status, diff нечего о нем не расскажут. Для этого его необходимо предварительно добавить в репозиторий.

git add <имя_файла>

Примечание: При установке пакетов, etckeeper добавляет новые файлы в репозиторий автоматически.

Установка пакетов

Перед установкой любого пакета, etckepper автоматически выполняет коммит за вас. Это позволит без болезненно откатиться к любым прежним версиям файлов если что то пойдет не так.

Например;

yum -y install mc

 В самом конце листинга можно будет увидеть подобные строчки;

....
Running Transaction
etckeeper: pre transaction commit
Installing : gpm-libs-1.20.6-12.el6.x86_64 1/2
Installing : 1:mc-4.7.0.2-3.el6.x86_64 2/2
etckeeper: post transaction commit
Verifying : 1:mc-4.7.0.2-3.el6.x86_64 1/2
Verifying : gpm-libs-1.20.6-12.el6.x86_64 2/2
(вывод сокращен)

Просмотр изменений

Теперь когда сделано несколько коммитов, интересно взглянуть на их историю;

git log

 В результате будет выведенна краткая информация по всем коммитам; уникальный идентификатор, дата, имя автора и комментарий.

git log --pretty=oneline

 Выведет сокращенный вариант;

97c7ddf96569f6f1f8450271bfe9803748ac8ef5 add test2.txt
eb4cf1ff683e007779ee9a5bcb61d28e33d99c5b committing changes in /etc after...
853353b3fb3dfb3903e92e46c8cc70efdfa05c71 saving uncommitted changes...
7e07823132d80266a5508e88b03c36bacffb1673 Edit hostname and host
b8215712b225a293ec715afcaec9f0218c7fef3d Initial commit

так же можно просмотреть коммиты затрагивающие конкретный каталог;

git log /etc/sysconfig/*

 Или вывести весь лог последнего коммита (-2 двух последних и так далее)

git log --summary -1

 Откат изменений

Вернуться к последнему состоянию /etc;

git reset --hard

 Вернуться к конкретному состоянию

git reset --hard eb4cf1f

 eb4cf1f — это первые цифры уникального идентификатора коммита. Я указываю первые семь цифр для надежности но можно ограничиться и четырьмя.

Если все же решите вернуться в последнее(до возврата) состояние то необходимо;

1. посмотреть все коммиты через которые перепрыгнули;

git reflog

206ba4a HEAD@{0}: 206ba4a: updating HEAD
5d6d285 HEAD@{1}: commit: test3
3d5b13a HEAD@{2}: commit: committing changes in /etc after yum run
3ee4429 HEAD@{3}: commit: saving uncommitted changes in /etc prior to yum
b0cf5c7 HEAD@{4}: commit: committing changes in /etc after yum run
12c0fe8 HEAD@{5}: commit: hostname and hosts

и перейти к любому из них(последний до текущего имеет №1)

git reset --hard 5d6d285

 Так же можно вернуть любой из отдельных файлов из последнего комита;

git checkout /etc/hosts

или из конкретного;

git checkout 206ba4a /etc/hosts

 Выводы

Это далеко не все возможности современной системы контроля версий. Но даже этих примеров достаточно, что бы понять на сколько полезным этот инструмент может быть администраторам. А такое простое средство как etckeeper поможет автоматизировать некоторые процессы и быть спокойнее в моменты когда что то пойдет не так.