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

От ekzorchik

Всем хорошего дня, меня зовут Александр. Я под ником - ekzorchik, являюсь автором всех написанных, разобранных заметок. Большинство вещей с которыми мне приходиться разбираться, как на работе, так и дома выложены на моем блоге в виде пошаговых инструкции. По сути блог - это шпаргалка онлайн. Каждая новая работа где мне случалось работать вносила новые знания и нюансы работы и соответственно я расписываю как сделать/решить ту или иную задачу. Это очень помогает. Когда сам разбираешь задачу, стараешься ее приподнести в виде структурированной заметки чтобы было все наглядно и просто, то процесс усвоения идет в гору. Также прошу на https://win.ekzorchik.ru https://lin.ekzorchik.ru https://net.ekzorchik.ru https://voip.ekzorchik.ru https;//home.ekzorchik.ru