Ну что ж, надеюсь ты успел отдохнуть и готов к новым приключениям. Сегодня мы с тобой реализуем собственный конфиг-агент. Естественно применим самые наилучшие практики, естественно на bash. Поехали.

Что такое конфиг-агент? Это такой механизм, который держит конфиги на сервере в актуальном состоянии. К примеру какой-нибудь мудень плохой человек с бодуна накосорезил и грохнул важный nginx файл с апстримами, а вернуть как было не может, нет знаний, нет головы, нет бекапов, нет будущего.

Ты спросишь? А какого хуя? Как так получилось? А вот так, порой у тестировщиков есть root на тестовые машины, чтобы они не дергали девопсов, а могли сами зайти на свой сервер и подебажить проект. Но дебаг может затронуть nginx, php и т.п. конфиги. Лезут же куда не попадя, все хотят быть крутыми девопс инженерами.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
В этом случае нас спасет конфиг-агент, который автоматически придет через минуту, заберет эталонные конфиги из git, всё красиво восстановит и передернет на Билли Айлиш.

Ясно дело можно через ansible и puppet все это провернуть, но слишком избыточно, это то же самое, что поднять kubernetes и крутить в нем личный бложек на wordpress, ну такое…

Не унывай, выход есть! Это можно реализовать за несколько минут и потом снова пару недель пинать хуи воздух. Главное на планировании спринта сказать — я оцениваю эту задачу в 14 дней.

Как я раньше и сказал, есть некий git репозиторий где хранятся все эталонные конфиги. Все изменения в конфигах производятся через этот репозиторий.

На примере покажу как мониторить nginx конфиги и сделать простенький агент. Дальше уж сам свой велосипед под свои реалии запилишь.

Практика (упрощаю до минимума, чтобы ты понял смысл)

Закидываем файл /usr/local/sbin/config-agent.sh делаем ему chmod +x (чтобы он был исполняемым) и ставим его в крон

*/1 * * * *

#!/bin/bash

DIR=/tmp/nginx-configs

if [ ! -d "$DIR" ];
then
   git clone git@git.bashdays.ru:dev/nginx-configs.git /tmp/nginx-configs
fi

cd /tmp/nginx-configs && git pull --quiet
RSYNC=$(rsync -aizh /tmp/nginx-configs/ /etc/nginx)

if [ $? -eq 0 ]; then
  if [ -n "${RSYNC}" ]; then
    systemctl reload nginx
  fi
else
  exit 0
fi

Давай смотреть что тут происходит:

  1. Создаем отдельную папку если ее нет в /tmp
  2. Клонируем в нее эталонные конфиги с git репозитория
  3. Переходим в папку и забираем последние изменения
  4. С помощью rsync, синкаем эталон в папку /etc/nginx
  5. Если файлы заменились в /etc/nginx то делаем reload

Всё!

Знак $? используется для поиска возвращаемого значения последней выполненной команды.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Теперь у нас есть полный контроль от кривых рук. Ну а чтобы изменить какой-то конфиг, нужно заморочиться и сделать это через git репу со всеми вытекающими кодревью и т.п.

Как говорится - на bash’ке моей горшок, а в кармане пирожок!

Всем хорошего понедельника коллеги!