Если заглянуть назад в прошлое, когда еще не было Ansible или других систем удаленного администрирования linux, мы пользовались только своими подручными скриптами, позволяя им подключаться к системам по ssh с помощью ключей. Думаю и по сей день многие использую свои скрипты взамен системам централизованного управления.
Я и решил поделиться своим опытом.
Нужно было написать скрипт умеет ходить на заданное количество хостов и бекапит некоторые файлы конфигурации.
Логика работы выстроилась сразу. Зайти на хост по ssh, выполнить некоторые команды для подготовки бекапов и забрать готовые файлы с помощью scp.
Первым делом нужно создать пользователя, который будет иметь доступ к данным с необходимыми правами. Тут я думаю каждый сам сможет разобраться в какую группу определить пользователя. Главное помнить:
- Имя пользователя для работы без пароля должно быть одинаково на всех хостах.
- Пользователь должен иметь доступ к хосту без пароля (ssh-keygen в помощь);
- Пользователь должен иметь доступ к файлам необходимо забрать.
тут можно выполнить сбор данных, используемых путями, 1) выполнить команду в удаленном режиме для сбора необходимых данных через хосты. Конечно мы пойдем по первому пути
Имеем такую конфигурацию -
10 хостов (Mikrotik), с которых необходимо получить два типа бекапов - бинарный (для восстановления с нуля) и конфигурацию без паролей и сертификатов для заливки на работающий конфиг. Так же в нашем полном распоряжении имеется машина с debian 8 на борту назовем ее сервер (и не важно, что это контейнер, важно что это дебиан) ну и конечно куда без него - zabbix-server.
- IP Mikrotik - 10.10.0.1, 10.10.1.1, 10.10.2.1, 10.10.3.1, 10.10.4.1, 10.10.5.1, 10.10.6.1, 10.10.7.1, 10.10.8.1, 10.10.9.1;
- IP Zabbix-сервер - 10.10.10.10;
Для упрощения задачи zabbix-hostname будет в формате mik (третий октет в десятичном формате) .host таким образом получаем -
- Имена хостов Zabbix - mik0.host, mik1.host, mik2.host, mik3.host, mik4.host, mik5.host, mik6.host, mik7.host, mik8.host, mik9.host
Если кто не помнит - имя хоста zabbix мы указываем в файле настроек zabbix-agent (агент тут не нужен, но все же) и на сервере zabbix в web-ui.
Первым делом создаст на нашем сервере ключ RSA. RSA - да вообщем то по привычке, кстати, старые версии RB только DSA, все что свежее 6.35 уже работает с RSA и DSA, потому что смотрите по обстановке, можно и обновиться, как сделал я :) , если у вас уже есть готовый ключ - пропускайте этот шаг.
ssh-keygen -t RSA
Переносим содержимое файла $ HOME / .ssh / id_rsa.pub с сервера на наши хосты. Я ленивый и для Mikrotik использовал winbox.
Для линукс можно сделать проще создание скрипта sh и запускаем его от имени пользователя мы будем ходить на хостах за бекапами ( на хостах пользователь уже должен быть ) такого содержания -
Если у вас ключ DSA, нужно изменить id_rsa.pub на id_dsa.pub
#! / usr / bin / env bash
Запускаем его и вводим поочередно пароли для всех 10 серверов.
В скрипте есть подвох - специально не стал проверять, а то совсем забыу как нажимать -) если вы все прочитали то подвох не сработает.
Тааак, что там дальше, а, точно, мы уже умеем ходить без пароля на все хосты под допустимым пользователем.
Мы же хотим получить конфиги Mikrotik. Собственно приступим.
Создаем на сервере вот такой вот скрипт -
#! / usr / bin / env bash
Постарался максимально прокомментировать все что происходит в скрипте. Давайте разберем, что же тут такое делается.
Тут мы говорим каким интерпретатором будем выполнять код
#! / usr / bin / env bash
Тут создаем массив с необходимыми нам данными для подключения к хостам и отправки данных в zabbix
хосты = (10.10.0.1_mik0.host_22 \
Тут думаю только одна переменная нуждается в объяснении - $ cmd. Это две команды выполняются на Mikrotik последовательно. Первая создает бинарный бекап
второй скрипт с настройками без выгрузки паролей и ключей шифрования.
cdate = `date +% d-% m-% Y` # Системная дата =) Hi Max
Основное тело программы. На входе в цикл мы имеем массив массився в переменную $ hosts. Цикл работает так - берем первый элемент массива, у нас он равен 10.10.0.1_mik0.host_22 и начинаем с ним работать. Первым же мы мы заносим в переменную $ hostname массив созданный из первого элемента $ hosts. Делаем мы это с помощью команды, по сути, как в python эмитируем методом строки .split (). Получается вполне сносно. Мы получаем 3 элемента в массиве $ hostname. Первый элемент - ip хоста. Второй элемент - zabbix-hostname. Третий элемент - ssh-порт.
Дальше мы обращаемся к этому элементу с помощью индекса, опять же python.
Далее формируем древо каталогов для хранения файлов и указываем scp какие файлы забирать. Прошу не пинать - если кто подскажет как с помощью scp в такой конструкции обращаться к файлам по маске + в карму.
После того как мы получили файлы - отправляем в zabbix сообщение об успехе.
Проверка создания конфига общего поиском файла в каталоге назначения. Можно было сделать сравнение md5 на Mikrotik и в каталоге назначения, но это уже другая история, хотя я так делал.
для хоста в $ {hosts [*]} # Получить значения из основного списка
Тут чистим место. Переменная $ age поможет нам сохранить бекапы столько сколько нам этого надо
найти $ {HOME} $ {dir} -mindepth 2 -mtime $ {age} -type d -exec rm -rf {} \; #clear dirs
Теперь самое тривиальное.
Создаем на сервере шаблон zabbix или просто элемент данных zabbix_trapper на наших узлах, которые мы заблаговременно добавили на мониторинг в zabbix.
Не буду выкладывать шаблон из одного элемента данных и одного триггера. Думаю сделать его сможет каждый. Главное помнить, если хосты мониторятся через zabbix-proxy, данные вы должны отправлять на zabbix-proxy. В ином случае отправляем все на zabbix-сервер.
Не важно даже какой будет IP у этих хостов в веб-интерфейсе zabbix. Важно чтобы совпадали имя хоста с данными в скрипте.
PS. На все скрипты нужно кинуть chmod + x так их можно будет запускать без интерпретатора.
PSS передать scp список файлов для резервного копирования на linux, можно сделать еще один массив и вложить его в цикл для. Можно сделать все в виде получаемых параметров. Ну вообщем можно развлечься.