Резервное Копирование Микротика С Использованием Ssh И Scp

Если оглянуться назад, когда не было Ansible или других систем удаленного администрирования Linux, мы использовали только свои собственные скрипты и позволяли им подключаться к системам по ssh с помощью ключей.

Думаю, по сей день многие используют свои скрипты вместо централизованных систем управления.

Я решил поделиться своим опытом.

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

Логика работы сформировалась сразу.

Зайдите на хост по ssh, выполните несколько команд для подготовки резервных копий и заберите готовые файлы с помощью scp. Первым шагом является создание пользователя, который будет иметь доступ к необходимым данным с необходимыми правами.

Здесь я думаю каждый сможет разобраться, к какой группе отнести пользователя.

Главное помнить:

  1. Логин для входа без пароля должен быть одинаковым на всех хостах, иначе вам придется указывать свой логин для каждого хоста, что не удобно;
  2. Пользователь должен иметь доступ к хосту без пароля (ssh-keygen в помощь);
  3. Пользователь должен иметь доступ к файлам, которые необходимо получить.

тут можно пойти несколькими путями: 1) запустить команду в удаленной оболочке для сбора необходимых данных для резервного копирования и затем их забрать 2) настроить cron на хосте и запустить команду сбора данных, и только потом, когда-нибудь зайди к хостеру и забери готовые резервные пирожки.

Конечно, мы пойдем по первому пути.

У нас есть такая конфигурация - 10 хостов (Микротик), с которых нужно получить два типа бэкапов - бинарный (для восстановления с нуля) и конфигурацию без паролей и сертификатов для заливки в рабочий конфиг.

Также в нашем полном распоряжении имеется машина с Debian 8 на борту, назовем ее сервером (и не важно, что это контейнер, важно, что это Debian), и конечно, куда бы мы без него были - zabbix-сервер.

  • ИП Микротик - 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 будет в формате 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 с сервера на наши хосты.

Я ленивый и использовал WinBox для Микротика.

Для Linux мы можем упростить задачу, создав sh-скрипт и запустив его от имени пользователя, к которому мы будем обращаться к хосту для резервного копирования ( на хостах пользователь уже должен существовать ) такой контент - Если у вас есть ключ DSA, измените id_rsa.pub на id_dsa.pub.

#!/usr/bin/env bash hosts=(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) username='user' for host in ${hosts[*]} do cat $HOME/.

ssh/id_rsa.pub | ssh -o "StrictHostKeyChecking no" ${user}@${host} 'cat >> ~/.

ssh/authorized_keys' done

Запускаем его и поочередно вводим пароли для всех 10 серверов.

В скрипте есть подвох - я специально не добавил галочку, а то совсем забуду как нажимать клавиши -) если все прочитать, то трюк не сработает. Тааак, что дальше, но мы, наверняка, уже знаем, как получить доступ ко всем хостам без пароля под пользователем, скажем user. Хотим получить конфиги Микротика.

Давайте, собственно, начнем.

Создаем на сервере следующий скрипт:

#!/usr/bin/env bash hosts=(10.10.0.1_mik0.host_22 \ 10.10.1.1_mik1.host_22 \ 10.10.2.1_mik2.host_22 \ 10.10.3.1_mik3.host_22 \ 10.10.4.1_mik4.host_22 \ 10.10.5.1_mik5.host_22 \ 10.10.6.1_mik6.host_22 \ 10.10.7.1_mik7.host_22 \ 10.10.8.1_mik8.host_22 \ 10.10.9.1_mik9.host_22 ) # bash array of values. All values are arrays too, after remove splitter "_".

# Sub array content IP_ZABBIX-HOSTNAME_SSH-DAEMON-PORT cdate=`date +%d-%m-%Y` # System date =) Hi Max dir="/mik_backup/" # Storage for backups cmd="/system backup save name=backup; export file=backup.rsc hide-sensitive" # command that do the preparation of backup username="user" # SSH user zabbix_hp=(10.10.10.10 10051) # IP then PORT age="30" # remove all backups older then 30 days itemname="backup" # zabbix item error_value="1" # error value for trigger value="0" # good value =) for host in ${hosts[*]} # Get values from main list do hostname=($(echo ${host} | tr "_" " ")) # Get values from sub list ssh ${username}@${hostname[0]} -o "StrictHostKeyChecking no" -p${hostname[2]} "${cmd}" new_dir="${HOME}${dir}${hostname[1]}/${cdate}" mkdir -p ${new_dir} scp -P${hostname[2]} ${username}@${hostname[0]}:backup.backup ${new_dir} scp -P${hostname[2]} ${username}@${hostname[0]}:backup.rsc ${new_dir} check=`find ${new_dir} -type f -name backup.*` if [ "${check}" == "" ] then zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${error_value} else zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${value} fi done find ${HOME}${dir} -mindepth 2 -mtime ${age} -type d -exec rm -rf {} \; #clear dirs

Я постарался максимально подробно комментировать все, что происходит в сценарии.

Давайте разберемся, что здесь происходит. Здесь мы говорим, какой интерпретатор мы будем использовать для выполнения кода

#!/usr/bin/env bash

Здесь мы создаем массив с нужными нам данными для подключения к хостам и отправляем данные в zabbix

hosts=(10.10.0.1_mik0.host_22 \ 10.10.1.1_mik1.host_22 \ 10.10.2.1_mik2.host_22 \ 10.10.3.1_mik3.host_22 \ 10.10.4.1_mik4.host_22 \ 10.10.5.1_mik5.host_22 \ 10.10.6.1_mik6.host_22 \ 10.10.7.1_mik7.host_22 \ 10.10.8.1_mik8.host_22 \ 10.10.9.1_mik9.host_22 )

Здесь я думаю, что пояснения требует только одна переменная — $cmd. Это две команды, которые выполняются на Микротике последовательно.

Первый создает двоичную резервную копию второй создает скрипт с настройками без загрузки паролей и ключей шифрования.



cdate=`date +%d-%m-%Y` # System date =) Hi Max dir="/mik_backup/" # Storage for backups cmd="/system backup save name=backup; export file=backup.rsc hide-sensitive" # command to do the preparation of backup username="user" # SSH user zabbix_hp=(10.10.10.10 10051) # IP then PORT age="30" # remove all backups older then 30 days itemname="backup" # zabbix item error_value="1" # error value for trigger value="0" # good value =)

Основная часть программы.

На входе в цикл у нас есть массив, содержащийся в переменной $hosts. Цикл работает так: берём первый элемент массива, у нас он равен 10.10.0.1_mik0.host_22 и начинаем с ним работать.

Первый шаг — добавить массив, созданный из первого элемента массива $hosts, в переменную $hostname. Мы делаем это с помощью команды tr, по сути, как и в Python, мы вызываем действие строкового метода .

split().

Получается вполне терпимо.

Мы получаем 3 элемента в массиве $hostname. Первый элемент — IP-адрес хоста.

Второй элемент — zabbix-hostname. Третий элемент — ssh-порт. Далее мы получаем доступ к этим элементам с помощью индекса, опять же в Python. Далее формируем дерево каталогов для хранения файлов и указываем scp, какие файлы подхватывать.

Пожалуйста, не беспокойте меня - если кто-нибудь может сказать мне, как использовать scp в этой конструкции для доступа к файлам по маске + карме.

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

Можно было сделать сравнение md5 на микротике и в каталоге назначения, но это уже другая история, хотя я так и сделал.



for host in ${hosts[*]} # Get values from main list do hostname=($(echo ${host} | tr "_" " ")) # Get values from sub list ssh ${username}@${hostname[0]} -o "StrictHostKeyChecking no" -p${hostname[2]} "${cmd}" new_dir="${HOME}${dir}${hostname[1]}/${cdate}" mkdir -p ${new_dir} scp -P${hostname[2]} ${username}@${hostname[0]}:backup.backup ${new_dir} scp -P${hostname[2]} ${username}@${hostname[0]}:backup.rsc ${new_dir} check=`find ${new_dir} -type f -name backup.*` if [ "${check}" == "" ] then zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${error_value} else zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${value} fi done

Мы здесь убираемся.

Переменная $age поможет нам сохранять резервные копии столько, сколько нам нужно.



find ${HOME}${dir} -mindepth 2 -mtime ${age} -type d -exec rm -rf {} \; #clear dirs

Теперь самая тривиальная часть.

Создаем шаблон на zabbix сервере или просто элемент данных типа zabbix_trapper на наших узлах, которые мы предварительно добавили для мониторинга в zabbix. Я не буду публиковать шаблон, состоящий из одного элемента данных и одного триггера.

Я думаю, что каждый может это сделать.

Главное помнить, что если хосты мониторятся через zabbix-proxy, вы должны отправлять данные на zabbix-proxy. В противном случае отправляем все на zabbix-сервер.

Даже не имеет значения, какой IP будет у этих хостов в веб-интерфейсе zabbix. Важно, чтобы имя хоста соответствовало данным в скрипте.

ПС.

Все скрипты нужно кидать chmod +x таким образом их можно запускать без вызова интерпретатора.

P.S.S Чтобы передать список файлов в scp для резервного копирования в Linux, вы можете создать еще один массив и вложить его в цикл for. Все можно делать в виде полученных параметров.

Ну в целом можно развлечься.

Теги: #Системное администрирование #Администрирование сервера #mikrotik #linux для всех #bash-скрипты #bash-скрипты

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.