[Эта статья была написана Джимми Тан]
При работе в команде по поддержанию инфраструктуры системы правильное документирование и передача изменений, внесенных в файлы конфигурации внутри, /etc
имеет основополагающее значение для предотвращения пробелов в знаниях в вашей команде.
В то время как инструменты контроля версий, такие как git, полезны для отслеживания стандартных изменений в кодовой базе, git не собирает метаданные, важные для /etc
подобных разрешений /etc/shadow
. Чтобы удовлетворить эту потребность, мы изучили etckeeper — небольшое приложение для управления версиями, разработанное Джои Хессом (известной из Debian) для записи пакетов, установленных или удаленных из /etc
. При работе с etckeeper стало очевидно, что отслеживание изменений во времени в контексте других событий, происходящих в наших системах, будет полезным и легко осуществимым с помощью Logentries.
etckeeper имеет несколько этапов выполнения и предоставляет механизм для подключения к каждому этапу с помощью набора простых скриптов. Используя API Logentries, вы можете легко отправлять метаданные etckeeper на этапах после установки и фиксации etckeeper. Все, что вам нужно для начала — это журнал на основе токенов в вашей учетной записи Logentries.
На этапе после установки мы используем хук, сохраненный в /etc/etckeeper/post-install.d/40send-to-logentries
. Вам нужно будет вставить правильный токен в следующий скрипт.
#!/bin/sh
set -e
pl="/var/cache/etckeeper/packagelist"
dirty="/var/cache/etckeeper/dirty"
host=`hostname`
inet=`ip -4 address show dev eth0 | grep inet | awk '{print $2}'`
appname=etckeeper
NC_OPTS="-w 3"
token="TOKEN_FROM_LOGENTRIES"
API=api.logentries.com
PORT=10000
# run this if /etc is not clean
if etckeeper unclean; then
message="Logging changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run"
echo "$token appname=$appname host=$host action=notification stage='post-install' message='$message' inet='$inet'" | nc $NC_OPTS $API $PORT
# list changed files
git diff --name-status > $dirty
while read -r line
do
f=$line
echo "$token appname=$appname host=$host action=config stage='post-install' change='$f' inet='$inet'" | nc $NC_OPTS $API $PORT
done < "$dirty" fi if [ -e $dirty ]; then rm -f $dirty fi # Installed/removed packages if [ -e $pl.pre-install ]; then message="Installed or removed packages" echo "$token appname=$appname host=$host action=notification stage='post-install' message='$message' inet='$inet'" | nc $NC_OPTS $API $PORT ( etckeeper list-installed | diff -U0 $pl.pre-install - | tail -n+4 | egrep '^[-+]' || true ) > $pl.diff
while read -r line
do
name=$line
echo "$token appname=$appname host=$host action=package stage='post-install' change='$name' inet='$inet'" | nc $NC_OPTS $API $PORT
done < "$pl.diff"
fi
if [ -e $pl.diff ]; then
rm -f $pl.diff
fi
На этапе фиксации мы выполняем эту зацепку /etc/etckeeper/commit.d/10send-to-logentries
. Снова в следующем скрипте вам нужно будет вставить правильный токен.
#!/bin/sh
set -e
dirty="/var/cache/etckeeper/dirty"
host=`hostname`
inet=`ip -4 address show dev eth0 | grep inet | awk '{print $2}'`
appname=etckeeper
NC_OPTS="-w 3"
token="TOKEN_FROM_LOGENTRIES"
API=api.logentries.com
PORT=10000
# run this if /etc is not clean
if etckeeper unclean; then
message="Logging changes in /etc after $HIGHLEVEL_PACKAGE_MANAGER run"
echo "$token appname=$appname host=$host action=notification stage='commit' message='$message' inet='$inet'" | nc $NC_OPTS $API $PORT
# list changed files
git diff --name-status > $dirty
while read -r line
do
f=$line
echo "$token appname=$appname host=$host action=config stage='commit' change='$f' inet='$inet'" | nc $NC_OPTS $API $PORT
done < "$dirty"
fi
if [ -e $dirty ]; then
rm -f $dirty
fi
Как только описанные выше ловушки будут развернуты на ваших хостах и могут получить доступ к api.logentries.com, любые изменения состояния и изменения состояния пакета /etc
будут отправляться в Logentries в режиме реального времени.
...
appname=etckeeper host=x01 action=package change='-dstat 0.7.2-4' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=config change='Dbash_completion.d/darcs' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=package change='+dstat 0.7.2-4' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=package change='-dstat 0.7.2-4' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=package change='+socat 1.7.2.4-1' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=package change='-socat 1.7.2.4-1' inet='192.168.1.70/24'
appname=etckeeper host=x01 action=notification message='Installed or removed packages' inet='192.168.1.70/24'
...
Once your etckeeper metadata is being sent to Logentries, there are several useful things you can do, including:
- Building alerts to notify teams of new changes
- Creating custom tags to easily spot specific changes
- Build dashboards to visualize config changes over time, compared to systems behavior
If you use Chef, we developed an etckeeper_wrapper cookbook which extends the etckeeper-cookbook, providing a number useful features for deploying etckeeper and a handler for the chef-client to execute etckeeper at every chef-client run. This provides a small safety net for the ops team to revert changes if things go wrong. The etckeeper_wrapper cookbook can be found here athttps://github.com/jcftang/etckeeper_wrapper.