В данной заметке я покажу, как настроить мониторинг содержимого каталога /etc в хранилище версий git через приложение etckeeper применительно к системе Ubuntu 12.04 Desktop/Server amd64. Данное приложение отслеживает действия, производимые с системными файлами. При грамотной эксплуатации позволяет ответить на наболевшие вопросы — что, где, когда изменилось в системе. Раньше, я перед тем как редактировать конфигурационный файл создавал его резервную копию рядом, но это, конечно же хорошо, но сравнивать через diff изменения в ручную не самая лучшая идея. Ниже представлена пошаговая работа, как работает приложение etckeeper – это свое рода система управлениями изменений. Начнем же…
Текущая система:
ekzorchik@srv-serv:~$ uname -a && lsb_release -a && dpkg --print-architecture
Linux srv-serv 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
amd64
Устанавливаем утилиты etckeeper и git в нашу систему:
ekzorchik@srv-serv:~$ sudo apt-get install etckeeper git-core gitk -y
, после установки Git‘а, нужно указать ваше имя и адрес электронной почты.
ekzorchik@srv-serv:~$ sudo git config --global user.name "ekzorchik"
ekzorchik@srv-serv:~$ sudo git config --global user.email "ekzorchik@ekzorchik.ru"
После чего переходим в настройке конфигурационного файла etckeeper.conf, в любом удобном редакторе открываем файл /etc/etckeeper/etckeeper.conf,
ekzorchik@srv-serv:~$ sudo nano /etc/etckeeper/etckeeper.conf
снимаем комментарий со строки содержащей
VCS="git"
и ставим символ комментария перед строкой
VCS="bzr"
Сохраняем внесенные изменения.
За отслеживание операции установки и удаления программ, с помощью таких утилит как apt и dpkg научим etckeeper вешать хуки, а так же отслеживать наличие изменений в каталоге /etc после произведенных операций, может так случиться что на подконтрольной системе иногда используется утилита aptitude, поэтому ее тоже включим:
ekzorchik@srv-serv:~$ sudo nano /etc/etckeeper/etckeeper.conf
HIGHLEVEL_PACKAGE_MANAGER=apt,aptitude
LOWLEVEL_PACKAGE_MANAGER=dpkg
Сохраняем внесенные изменения.
Повышаем свои права до уровня суперпользователя:
ekzorchik@srv-serv:~$ sudo su -
root@srv-serv:~#
Переходим в каталог /etc/ и создаем git репозитарий из этого каталога:
root@srv-serv:~# cd /etc && etckeeper init
Initialized empty Git repository in /etc/.git/
Создаем начальный коммит:
root@srv-serv:/etc# git add . && git commit -a -m 'Initial commit'
Избавляемся от ненужных файлов и оптимизируем репозиторий:
root@srv-serv:/etc# git gc
Counting objects: 1445, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (1098/1098), done.
Writing objects: 100% (1445/1445), done.
Total 1445 (delta 92), reused 0 (delta 0)
root@srv-serv:/etc# exit
logout
На заметку:
Здесь gc это сокращение от “garbage collect“, что означает “сборка мусора“. Эта команда выполняет несколько действий: собирает все объекты в рыхлом формате и упаковывает их в pack-файлы, объединяет несколько упакованных файлов в один большой, удаляет объекты, недостижимые ни из одного коммита и хранящиеся дольше нескольких месяцев.
Теперь любое изменение файлов в директории /etc не останется незамеченным. В любой момент мы можем поинтересоваться что, где, когда какие файлы редактировал и изменения вносил:
Продемонстрирую, что можно извлечь в ходе анализа работы с директорией /etc:
создаю и удаляю файл из директории /etc
ekzorchik@srv-serv:~$ sudo touch /etc/file
ekzorchik@srv-serv:~$ sudo etckeeper commit "...create file /etc/file..."
[master c1714a0] ...create file /etc/file...
Author: ekzorchik <ekzorchik@srv-serv>
1 file changed, 1 insertion(+)
create mode 100644 file
На заметку: использование ключей упрощающих работу с commit:
- commit -a → совершит документирование, автоматические индексируя строки изменения в файлах проекта. Новые файлы при всем притом индексироваться не будут. А удаление будет учтено.
- commit -m “commit comment” – совершит комментирование прямо из консоли вместо текстового редактора
- commit FILENAME – добавит индекс и создаст коммит на основе изменений единственного файла
На заметку: по дефолтным параметрам — etckeeper, изменения совершенные в директории /etc сохраняет ежедневно, об это говорит опция:
ekzorchik@srv-serv:~$ sudo nano /etc/etckeeper/etckeeper.conf
AVOID_DAILY_AUTOCOMMITS=1
, также она способствует автоматическому сохранению различий, как до и после установки пакетов.
ekzorchik@srv-serv:~$ sudo etckeeper commit -m "...change etckeeper.conf..."
[master 57321e1] ...change etckeeper.conf...
Author: ekzorchik <ekzorchik@srv-serv>
1 file changed, 1 insertion(+), 1 deletion(-)
, из отчета выше видно, что у каждого изменения есть уникальный идентификатор — в моем случаем это master 57321e1, зная его можно отобразить детально не засоряя отчетами консоль, что произошло в этом изменении:
ekzorchik@srv-serv:~$ sudo etckeeper vcs show master 57321e1
commit 57321e16b23d950b87834bae97242277840079f3
Author: ekzorchik <ekzorchik@srv-serv>
Date: Tue Oct 28 21:14:29 2014 +0300
...change etckeeper.conf...
diff --git a/etckeeper/etckeeper.conf b/etckeeper/etckeeper.conf
index b2af9ca..58bcc1f 100644
--- a/etckeeper/etckeeper.conf
+++ b/etckeeper/etckeeper.conf
@@ -18,7 +18,7 @@ DARCS_COMMIT_OPTIONS="-a"
# Uncomment to avoid etckeeper committing existing changes
# to /etc automatically once per day.
-#AVOID_DAILY_AUTOCOMMITS=1
+AVOID_DAILY_AUTOCOMMITS=1
# Uncomment the following to avoid special file warning
# (the option is enabled automatically by cronjob regardless).
Я же рекомендую и использую для точного отслеживания изменений фиксировать в ручную: sudo etckeeper commit "...описание_сделанных_изменений..."
Удаляю созданный ранее файл или только что созданный:
ekzorchik@srv-serv:~$ sudo rm /etc/file
ekzorchik@srv-serv:~$ sudo etckeeper commit "...remove file /etc/file..."
[master ed4c522] ...remove file /etc/file...
Author: ekzorchik <ekzorchik@srv-serv>
1 file changed, 1 deletion(-)
delete mode 100644 file
установлю приложение tree в систему:
ekzorchik@srv-serv:~$ sudo apt-get install tree -y
ekzorchik@srv-serv:~$ sudo apt-get remove tree -y
Author: ekzorchik <ekzorchik@srv-serv>
1 file changed, 1 insertion(+), 1 deletion(-)
Как видите, все становится более понятным, когда начинаешь пользоваться и прогонять работу данного приложения сперва на простых действия, а уже потом на более сложных, как ниже по этой заметке:
Рассмотрим следующие примеры:
Создаем пользователя и назначаем ему пароль:
ekzorchik@srv-serv:~$ sudo useradd tost
ekzorchik@srv-serv:~$ sudo passwd tost
Enter new UNIX password:Aa1234567
Retype new UNIX password:Aa1234567
passwd: password updated successfully
Отобразим какие изменения связи с создание и назначением пароля для учётной записи были зафиксированы:
ekzorchik@srv-serv:~$ sudo etckeeper vcs diff
diff --git a/group b/group
index 38c9031..c8ca9a0 100644
--- a/group
+++ b/group
@@ -51,3 +51,4 @@ ekzorchik:x:1000:
lpadmin:x:111:ekzorchik
sambashare:x:112:ekzorchik
utempter:x:113:
+tost:x:1001:
diff --git a/group- b/group-
index 62b35c9..38c9031 100644
--- a/group-
+++ b/group-
@@ -50,3 +50,4 @@ netdev:x:110:
ekzorchik:x:1000:
lpadmin:x:111:ekzorchik
sambashare:x:112:ekzorchik
+utempter:x:113:
diff --git a/gshadow b/gshadow
index 5c9f2bc..67a478b 100644
--- a/gshadow
+++ b/gshadow
@@ -51,3 +51,4 @@ ekzorchik:!::
@@ -50,3 +50,4 @@ netdev:!::
ekzorchik:!::
lpadmin:!::ekzorchik
sambashare:!::ekzorchik
+utempter:!::
diff --git a/passwd b/passwd
index 61a1968..0a5996b 100644
--- a/passwd
+++ b/passwd
@@ -23,3 +23,4 @@ whoopsie:x:103:106::/nonexistent:/bin/false
landscape:x:104:109::/var/lib/landscape:/bin/false
ekzorchik:x:1000:1000:ekzorchik,,,:/home/ekzorchik:/bin/bash
sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin
+tost:x:1001:1001::/home/tost:/bin/sh
diff --git a/shadow b/shadow
index f1462f6..f3c55e7 100644
--- a/shadow
+++ b/shadow
@@ -23,3 +23,4 @@ whoopsie:*:16238:0:99999:7:::
landscape:*:16238:0:99999:7:::
ekzorchik:$6$LSHMkv4A$TRHXGTnvBSshcCZBDbgGULiLrohywbMt2OTJyJ.HNxBK5l5fKtKbruMZ0
sshd:*:16238:0:99999:7:::
+tost:$6$Y8iEVJfU$VRXIerbI0B/6kZkz8U0VuRX6SZ61lTGxJPaw74uAL84Wo6PaDaTWMF6N7doWQo
Как видно выше, из выделенного информация подробна и позволяет в кое мере оценить, что же было произведено при создании пользователя. Теперь же я покажу, а что если удалить учетную записи, какие записи буду зафиксированы:
ekzorchik@srv-serv:~$ sudo userdel tost
ekzorchik@srv-serv:~$ sudo etckeeper vcs diff
diff --git a/group- b/group-
index 62b35c9..c8ca9a0 100644
--- a/group-
+++ b/group-
@@ -50,3 +50,5 @@ netdev:x:110:
ekzorchik:x:1000:
lpadmin:x:111:ekzorchik
sambashare:x:112:ekzorchik
+utempter:x:113:
+tost:x:1001:
diff --git a/gshadow- b/gshadow-
index ef61d01..67a478b 100644
--- a/gshadow-
+++ b/gshadow-
@@ -50,3 +50,5 @@ netdev:!::
ekzorchik:!::
lpadmin:!::ekzorchik
sambashare:!::ekzorchik
+utempter:!::
+tost:!::
diff --git a/passwd- b/passwd-
index 61a1968..0a5996b 100644
--- a/passwd-
ну и так далее, т. е. Все в точности да наоборот. С этим тоже понятно.
Более короткий отчет, по дополнительным параметрам следует посмотреть справку: (ekzorchik@srv-serv:~$ sudo etckeeper vcs diff –-help
)
ekzorchik@srv-serv:~$ sudo etckeeper vcs diff --shortstat
4 files changed, 6 insertions(+)
Удаляем ПО с использованием apt-get:
ekzorchik@srv-serv:~$ sudo apt-get install htop
ekzorchik@srv-serv:~$ sudo etckeeper commit -m "...install htop..."
# On branch master
nothing to commit (working directory clean)
ekzorchik@srv-serv:~$ sudo aptitude remove htop
The following packages will be REMOVED:
htop
0 packages upgraded, 0 newly installed, 1 to remove and 3 not upgraded.
Need to get 0 B of archives. After unpacking 183 kB will be freed.
(Reading database ... 50653 files and directories currently installed.)
Removing htop ...
Processing triggers for man-db ...
ekzorchik@srv-serv:~$ sudo etckeeper commit -m "...uninstall htop..."
# On branch master
nothing to commit (working directory clean)
Наберем в файле произвольный текст и за комминтим изменения:
ekzorchik@srv-serv:~$ sudo nano /etc/test/file
privet in console on bloga www.ekzorchik.ru
ekzorchik@srv-serv:~$ sudo etckeeper commit -m "...create text file..."
[master ca36aa8] ...create text file...
Author: ekzorchik <ekzorchik@srv-serv>
2 files changed, 2 insertions(+)
create mode 100644 test/file
ekzorchik@srv-serv:~$ sudo etckeeper vcs show
commit ca36aa8203d2c4298316703eec3c275bbcd2f36e
Author: ekzorchik <ekzorchik@srv-serv>
Date: Tue Oct 28 20:52:46 2014 +0300
...create text file...
diff --git a/.etckeeper b/.etckeeper
index 42fa734..eef5436 100755
--- a/.etckeeper
+++ b/.etckeeper
@@ -1059,6 +1059,7 @@ maybe chmod 0755 './systemd/system/multi-user.target.wants
maybe chmod 0755 './terminfo'
maybe chmod 0644 './terminfo/README'
maybe chmod 0755 './test'
+maybe chmod 0644 './test/file'
maybe chmod 0644 './test/tost'
maybe chmod 0644 './timezone'
maybe chmod 0644 './ucf.conf'
diff --git a/test/file b/test/file
new file mode 100644
index 0000000..9e25dca
--- /dev/null
+++ b/test/file
@@ -0,0 +1 @@
+privet in console on bloga www.ekzorchik.ru
— текст набранный в новом файле и который зафиксировался как изменение.
Откатим изменения, когда файл существовал и в нем были изменения:
Убедимся, что находимся на последнем коммите ветки master, прежде чем продолжить работу.
ekzorchik@srv-serv:~$ sudo rm -R /etc/test/
ekzorchik@srv-serv:~$ cd /etc
Перечислим существующие ветки с которыми работаем на данный момент etckeeper:
ekzorchik@srv-serv:~$ sudo etckeeper vcs branch
* master
Переключимся на ветку: – master
ekzorchik@srv-serv:/etc$ sudo git checkout master
D test/file
Already on 'master'
Сначала проверяем состояние рабочего каталога:
ekzorchik@srv-serv:/etc$ sudo git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: test/file
#
no changes added to commit (use "git add" and/or "git commit -a")
, видим, что файл test был изменен, но еще не проиндексирован.
Для отмены изменений в рабочем каталоге нужно задействовать команду checkout для переключения в версию файл test в репозитории:
ekzorchik@srv-serv:/etc$ sudo git checkout test
ekzorchik@srv-serv:/etc$ sudo git status
# On branch master
nothing to commit (working directory clean)
Команда проверки состояния сообщит, что коммитить нечего. Это означает, что в репозитории хранится текущее состояние рабочего каталога, и нет никаких изменений, ожидающих записи.
ekzorchik@srv-serv:/etc$ cat /etc/test/file
— файл восстановлен
privet in console on bloga www.ekzorchik.ru
, команда status показывает нам, что не было произведено никаких изменений, не зафиксированных в рабочем каталоге. Для вывода более расширенной информации использовать команду: – ekzorchik@srv-serv:/etc$ sudo etckeeper vcs show
Чтобы быстро узнать, сколько у нас занято места, можно воспользоваться командой count-objects:
ekzorchik@srv-serv:/etc$ sudo git count-objects -v
count: 30
size: 180
in-pack: 1445
packs: 1
size-pack: 809
prune-packable: 0
garbage: 0
Теперь etckeeper настроен и готов к работе. При установке и удалении программ проводятся автоматические коммиты в репозиторий Использование etckeeper сильно снижает цену ошибки при работе с системными настройками в каталоге /etc и поэтому просто обязано быть на любом сервере администрируемым Вами.
Для справки: основные сведения по работе почерпнуты в справочной системе:
ekzorchik@srv-serv:~$ man etckeeper
документация по утилите:
ekzorchik@srv-serv:~$ less /usr/share/doc/etckeeper/README.gz
Хотя я конечно не рассмотрел всех нюансов работы с данной утилитой в текущей заметке, я исправлюсь, но в дальнейшем. Сейчас этого хватит. Кто не хочет дожидаться появления новых заметок по этой теме может самостоятельно экспериментировать и набираться опыта. А пока собственно и все, но хочю порекомендовать Вам читатели моего блога перед любыми изменениями на продуктивных серверах составлять план работ, который должен содержать следующее:
- Время начала работ
- Номер инцидента, если работы ведутся по заявке клиента.
- Номер заявки редмайна для внутренних работ.
- Конечная цель работ
- Пошаговые действия
С уважением, автор блога — ekzorchik.