Статьи

Интеграция etckeeper с Logentries & Chef

[Эта статья была написана Джимми Тан] 

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

Интегрирующий и шеф-повар с одним (1)

В то время как инструменты контроля версий, такие как 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.