По многочисленным просьбам моих подписчиков к ставшим востребованным приватным заметкам моих блогов (https://{lin,win,net}.ekzorchik.ru
), я решил разобрать во всех нюансах адаптацию заметки про Oxidized
к установке на Ubuntu 22.04 Server
(Ранее успешно эксплуатировалась: "Обновленная установка Oxidized на Ubuntu 18.04"
) посредством которой можно осуществлять резервное копирование сетевого оборудования Mikrotik
и визуализировать через Web
-интерфейс изменения снятого конфига если таковой был.
Просто сейчас системные администраторы больше хотят GUI
-шности чем руководствоваться принципом чем проще чем надежнее, а надежнее на своем собственном опыте это то что сделал сам (скрипт к примеру, и написанная собственно ручно инструкция по развертыванию и восстановлению).
В заметке участвует:
Официальный сайт по приложению oxidized
Мой Mikrotik RB2011UiAS-2HnD (Version 6.47.4) (IP: 172.35.35.100)
OS: Ubuntu 22.04 Server (IP: 172.35.35.32)
В качестве операционной системы на которой буду разворачивать сервис Oxidized
выступит Ubuntu 22.04 Server
Шаг №1:
Обновляю систему до самого актуального состояния в рамках текущего релиза:
ekzorchik@srv-us2204a1a:~$ sudo rm -Rf /var/lib/apt/lists ekzorchik@srv-us2204a1a:~$ cat /etc/update-manager/release-upgrades | grep Prompt Prompt=lts ekzorchik@srv-us2204a1a:~$ sudo sed -i '/Prompt/s/lts/never/' /etc/update-manager/release-upgrades ekzorchik@srv-us2204a1a:~$ cat /etc/update-manager/release-upgrades | grep Prompt Prompt=never ekzorchik@srv-us2204a1a:~$ sudo apt-get update && sudo apt-get upgrade -y && sudo apt dist-upgrade -y
Шаг №2:
Устанавливаю приложения которые хочу иметь текущей системы (у каждого уважающего себя системного администратора — он обычно свой):
ekzorchik@srv-us2204a1a:~$ sudo apt-get install -y mercurial unzip net-tools curl apt-transport-https mc
Шаг №3:
Настраиваю локаль:
ekzorchik@srv-us2204a1a:~$ sudo rm -f /etc/localtime ekzorchik@srv-us2204a1a:~$ sudo ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime ekzorchik@srv-us2204a1a:~$ sudo locale-gen en_US.UTF-8 Generating locales (this might take a while)... en_US.UTF-8... done Generation complete. ekzorchik@srv-us2204a1a:~$ echo "LC_ALL="en_US.UTF-8"" | sudo -s tee /etc/default/locale LC_ALL=en_US.UTF-8 ekzorchik@srv-us2204a1a:~$ echo "LANG="en_US.UTF-8"" | sudo tee -a /etc/default/locale LANG=en_US.UTF-8 ekzorchik@srv-us2204a1a:~$ echo "LANGUAGE="en.US.UTF-8"" | sudo tee -a /etc/default/locale LANGUAGE=en.US.UTF-8 ekzorchik@srv-us2204a1a:~$ ekzorchik@srv-us2204a:~$ sudo reboot
После выполняю Logoff&Logon
для активации изменений настроек локали или перезагружаю систему.
Шаг №4:
Т.к. осуществлять резервное копирование буду только сетевое оборудование фирмы Mikrotik
, то на них всех нужно создать учетную запись и включить ее только в группу read.
ekzorchik@srv-us2204a:~$ ssh -l ekzorchik 172.35.35.100 [ekzorchik@ekzhome] > user add name=backup password=Aa1234567 group=read [ekzorchik@ekzhome] > quit ekzorchik@srv-us2204a:~$
Шаг №5:
Опираясь на заметку (Прозрачный вход по ssh с Ubuntu 22.04 на Mikrotik RB2011UiAS-2HnD
) вношу изменения в клиентскую часть сервиса ssh
чтобы взаимодействовать с сетевым оборудованием Mikrotik
через консоль командной строки:
ekzorchik@srv-us2204a:~$ sudo nano /etc/ssh/ssh_config Host 172.35.35.100 PubkeyAcceptedKeyTypes +ssh-rsa ekzorchik@srv-us2204a:~$ sudo service ssh restart
Шаг №6:
Устанавливаю в систему Ubuntu 22.04 Server amd64
пакеты необходимые для последующей работы сервиса Oxidized:
ekzorchik@srv-us2204a:~$ sudo apt-get install ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev build-essential -y
Шаг №7:
Установку сервиса Oxidized
будет вести не через дефолтные репозитарии системы, а буду скачивать/выкачивать пакет с git
—репозитария:
ekzorchik@srv-us2204a:~$ git clone https://github.com/ytti/oxidized.git Cloning into 'oxidized'... remote: Enumerating objects: 12110, done. remote: Counting objects: 100% (197/197), done. remote: Compressing objects: 100% (124/124), done. remote: Total 12110 (delta 108), reused 148 (delta 73), pack-reused 11913 Receiving objects: 100% (12110/12110), 2.16 MiB | 674.00 KiB/s, done. Resolving deltas: 100% (7458/7458), done. ekzorchik@srv-us2204a:~$ cd oxidized/ ekzorchik@srv-us2204a:~/oxidized$ sudo gem install bundler Fetching bundler-2.4.8.gem Successfully installed bundler-2.4.8 Parsing documentation for bundler-2.4.8 Installing ri documentation for bundler-2.4.8 Done installing documentation for bundler after 0 seconds 1 gem installed ekzorchik@srv-us2204a:~/oxidized$ ekzorchik@srv-us2204a:~/oxidized$ sudo rake install oxidized 0.28.0 built to pkg/oxidized-0.28.0.gem. oxidized (0.28.0) installed. ekzorchik@srv-us2204a:~/oxidized$
Шаг №8:
Формирую дефолтный конфигурационный файл для сервиса Oxidized:
ekzorchik@srv-us2204a:~/oxidized$ oxidized -d edit ~/.config/oxidized/config ekzorchik@srv-us2204a:~/oxidized$ ekzorchik@srv-us2204a1a:~/oxidized$ cd ~
Шаг №9:
Учтем опыт наработок при использовании Ubuntu 18.04 + Oxidized
и сделаем чтобы сервис oxidized
подключался к сетевому оборудованию по SSH
без указания пароля к логину, т.е. сделаем на основе авторизации через публичный ключ:
ekzorchik@srv-us2204a1a:~$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ekzorchik/.ssh/id_rsa): Created directory '/home/ekzorchik/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ekzorchik/.ssh/id_rsa Your public key has been saved in /home/ekzorchik/.ssh/id_rsa.pub The key fingerprint is: SHA256:fjSx0x8Ku2a8SNvQtLY9HPj/fsMD+lMMrcqwE/uOA3g ekzorchik@srv-us2204a1a The key's randomart image is: +---[RSA 3072]----+ | | | | | . . | | + . . | | . S B.. = | | . E *.*.= + | | . =.%o+.= | | . %=B+. +.| | o+X+o+oo*| +----[SHA256]-----+ ekzorchik@srv-us2204a1a:~$ ekzorchik@srv-us2204a1a:~$ cp ~/.ssh/id_rsa.pub idrsa ekzorchik@srv-us2204a1a:~$ scp idrsa ekzorchik@172.35.35.100:/
Шаг №10:
Подключаюсь по SSH
к своему Mikrotik
и скопированные выше публичный ключ на Mikrotik
предопределяю для пользователя backup
его использование, т.е. под пользователем backup
без указания ввода пароля будет происходить авторизация.
ekzorchik@srv-us2204a1a:~$ ssh ekzorchik@172.35.35.100 [ekzorchik@ekzhome] > user ssh-keys import public-key-file=idrsa user=backup [ekzorchik@ekzhome] > quit Connection to 172.35.35.100 closed. ekzorchik@srv-us2204a1a:~$
Шаг №11:
А теперь проверяю, могу ли я подключиться к Mikrotik(у)
из под учетной записи backup
от имени которой будет сниматься резервная копия конфигурации Mikrotik:
ekzorchik@srv-us2204a1a:~$ ssh backup@172.35.35.100 "system resource print" uptime: 6w3d15h46m26s version: 6.47.4 (stable) build-time: Sep/16/2020 11:32:37 free-memory: 94.4MiB total-memory: 128.0MiB cpu: MIPS 74Kc V4.12 cpu-count: 1 cpu-frequency: 600MHz cpu-load: 99% free-hdd-space: 106.5MiB total-hdd-space: 128.0MiB write-sect-since-reboot: 86595 write-sect-total: 410885 bad-blocks: 0.7% architecture-name: mipsbe board-name: RB2011UiAS-2HnD platform: MikroTik ekzorchik@srv-us2204a1a:~$
подключение проходит без каких-либо запросов на ввод пароля.
Шаг №12:
Создаю необходимые каталоги под конфигурационный файл сервиса oxidized:
ekzorchik@srv-us2204a1a:~$ mkdir ~/.config/oxidized/crashes ekzorchik@srv-us2204a1a:~$ mkdir ~/.config/oxidized/mikrotik
Шаг №13:
Перенастраиваю GIT
для устройств Mikrotik
бекапы которых будут хранится в репозитарии:
ekzorchik@srv-us2204a1a:~$ git config --global user.email oxidized@ekzorchik.ru ekzorchik@srv-us2204a1a:~$ git config --global user.name "oxidized" ekzorchik@srv-us2204a1a:~$ cd ~/.config/oxidized/ ekzorchik@srv-us2204a1a:~/.config/oxidized$ git init oxidized.git hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /home/ekzorchik/.config/oxidized/oxidized.git/.git/ ekzorchik@srv-us2204a1a:~/.config/oxidized$ git init devices.git hint: Using 'master' as the name for the initial branch. This default branch name hint: is subject to change. To configure the initial branch name to use in all hint: of your new repositories, which will suppress this warning, call: hint: hint: git config --global init.defaultBranch <name> hint: hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and hint: 'development'. The just-created branch can be renamed via this command: hint: hint: git branch -m <name> Initialized empty Git repository in /home/ekzorchik/.config/oxidized/devices.git/.git/ ekzorchik@srv-us2204a1a:~/.config/oxidized$ cd ~ ekzorchik@srv-us2204a1a:~$
Шаг №14:
Настраиваем конфигурационный файл для сервиса oxidized
под себя, за основу беру ранее опубликованную заметку связки Ubuntu 18.04 Server + Oxidized:
ekzorchik@srv-us2204a1a:~$ nano ~/.config/oxidized/config --- model: routeros resolve_dns: true interval: 3600 use_syslog: false debug: false threads: 30 timeout: 20 retries: 3 prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/ rest: 0.0.0.0:8888 next_adds_job: false vars: {} groups: {} models: {} pid: "/home/ekzorchik/.config/oxidized/pid" log: "/home/ekzorchik/.config/oxidized/log" crash: directory: "/home/ekzorchik/.config/oxidized/crashes" hostnames: false stats: history_size: 10 input: default: ssh debug: false ssh: secure: false map: name: 0 model: 1 ip: 2 port: 3 username: 4 verify_host_key: never utf8_encoded: true output: default: git git: user: oxidized email: oxidized@example.com repo: "/home/ekzorchik/.config/oxidized/oxidized.git" git: user: oxidized email: oxidized@ekzorchik.ru repo: "/home/ekzorchik/.config/oxidized/devices/devices.git" source: default: csv csv: file: "/home/ekzorchik/.config/oxidized/mikrotik/router.db" delimiter: !ruby/regexp /:/ map: name: 0 model: 1 ip: 2 port: 3 username: 4 password: 5 gpg: false model_map: mikrotik: routeros
После не забываем сохранить внесенные изменения в конфигурационный файл выше.
Шаг №15:
Теперь создаю файл подключения к оборудованию Mikrotik:
ekzorchik@srv-us2204a1a:~$ nano ~/.config/oxidized/mikrotik/router.db ekzhome:routeros:172.35.35.100:22:backup
Шаг №16:
Проверяю запуск сервиса oxidized
и соответственно на предмет каких-либо ошибок, препятствующих запуску:
ekzorchik@srv-us2204a1a:~$ oxidized ~/.config/oxidized/config oxidized-web not found: sudo gem install oxidized-web - \ or disable web support by setting "rest: false" in your configuration ekzorchik@srv-us2204a1a:~$
доустанавливаю пакет oxidized-web:
ekzorchik@srv-us2204a1a:~$ sudo gem install oxidized-web Fetching rack-protection-1.5.5.gem Fetching rack-test-0.7.0.gem Fetching tilt-2.1.0.gem Fetching rack-1.6.13.gem Fetching sinatra-1.4.8.gem Fetching multi_json-1.15.0.gem Fetching backports-3.24.0.gem Fetching sinatra-contrib-1.4.7.gem Fetching rb-fsevent-0.11.2.gem Fetching ffi-1.15.5.gem Fetching rb-inotify-0.10.1.gem Fetching htmlentities-4.3.4.gem Fetching sass-listen-4.0.0.gem Fetching sass-3.7.4.gem Fetching puma-3.11.4.gem Fetching temple-0.10.0.gem Fetching haml-5.2.2.gem Fetching charlock_holmes-0.7.7.gem Fetching emk-sinatra-url-for-0.2.1.gem Fetching oxidized-web-0.13.1.gem
Шаг №17:
Возвращаюсь к проверке запуска сервиса oxidized:
ekzorchik@srv-us2204a1a:~$ oxidized ~/.config/oxidized/config Puma starting in single mode... * Version 3.11.4 (ruby 3.0.2-p107), codename: Love Song * Min threads: 0, max threads: 16 * Environment: development * Listening on tcp://0.0.0.0:8888 Use Ctrl-C to stop
Прерываю выполнение работы oxidized
путем сочетания клавиш Ctrl + C
^C- Gracefully stopping, waiting for requests to finish === puma shutdown: 2023-03-22 11:33:25 +0300 === - Goodbye! ekzorchik@srv-us2204a1a:~$
и смотрю логи на предмет каких-либо ошибок:
ekzorchik@srv-us2204a1a:~$ tail ~/.config/oxidized/log I, [2023-03-22T11:32:29.367036 #9425] INFO -- : lib/oxidized/nodes.rb: Loading nodes I, [2023-03-22T11:32:29.474285 #9425] INFO -- : lib/oxidized/nodes.rb: Loaded 1 nodes W, [2023-03-22T11:32:31.807146 #9425] WARN -- : 172.35.35.100 raised Net::SSH::Authentication::KeyManagerError (rescued RuntimeError) with msg "the given identity is known, but the private key could not be loaded: OpenSSL::PKey::PKeyError (rsa#set_key= is incompatible with OpenSSL 3.0)" W, [2023-03-22T11:32:32.096658 #9425] WARN -- : /ekzhome status no_connection, retry attempt 1 W, [2023-03-22T11:32:32.579645 #9425] WARN -- : 172.35.35.100 raised Net::SSH::Authentication::KeyManagerError (rescued RuntimeError) with msg "the given identity is known, but the private key could not be loaded: OpenSSL::PKey::PKeyError (rsa#set_key= is incompatible with OpenSSL 3.0)" W, [2023-03-22T11:32:33.098081 #9425] WARN -- : /ekzhome status no_connection, retry attempt 2 W, [2023-03-22T11:32:33.517910 #9425] WARN -- : 172.35.35.100 raised Net::SSH::Authentication::KeyManagerError (rescued RuntimeError) with msg "the given identity is known, but the private key could not be loaded: OpenSSL::PKey::PKeyError (rsa#set_key= is incompatible with OpenSSL 3.0)" W, [2023-03-22T11:32:34.099440 #9425] WARN -- : /ekzhome status no_connection, retry attempt 3 W, [2023-03-22T11:32:34.585136 #9425] WARN -- : 172.35.35.100 raised Net::SSH::Authentication::KeyManagerError (rescued RuntimeError) with msg "the given identity is known, but the private key could not be loaded: OpenSSL::PKey::PKeyError (rsa#set_key= is incompatible with OpenSSL 3.0)" W, [2023-03-22T11:32:35.100859 #9425] WARN -- : /ekzhome status no_connection, retries exhausted, giving up ekzorchik@srv-us2204a1a:~$
Шаг №18:
Ага, в данном логе предыдущего шага говорится, что пакет net:ssh
не понимает созданный ключ ssh
, в этом случае нужно сгенерировать SSH
ключи в PEM
—формате, затем загрузить публичный ключ на Mikrotik
и связать учетную запись backup
с загруженным публичным ключом:
ekzorchik@srv-us2204a1a:~$ ssh -l ekzorchik 172.35.35.100 "file remove idrsa" ekzorchik@srv-us2204a1a:~$ ssh -l ekzorchik 172.35.35.100 "user ssh-keys print" ekzorchik@172.35.35.100's password: Flags: R - RSA, D - DSA # USER BITS KEY-OWNER 0 R backup 3072 ekzorchik@srv-us2204a1a ekzorchik@srv-us2204a1a:~$ ssh -l ekzorchik 172.35.35.100 "user ssh-keys remove numbers=0" ekzorchik@srv-us2204a1a:~$ rm -Rf ~/.ssh ekzorchik@srv-us2204a1a:~$ ssh-keygen -m PEM Generating public/private rsa key pair. Enter file in which to save the key (/home/ekzorchik/.ssh/id_rsa): Created directory '/home/ekzorchik/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ekzorchik/.ssh/id_rsa Your public key has been saved in /home/ekzorchik/.ssh/id_rsa.pub The key fingerprint is: SHA256:dX/XO5SEo7959DM0A00xrhDikVyOmjY7MwA8K9zCiTA ekzorchik@srv-us2204a1a The key's randomart image is: +---[RSA 3072]----+ | .ooo o.| | . .o= . o..| |E + o.o.ooo | |=.o + o. .oo+.o| |.* o . =S . .oo+| | o o o . .*o| | = .oo+| | + o+o| | o. o| +----[SHA256]-----+ ekzorchik@srv-us2204a1a:~$ ekzorchik@srv-us2204a1a:~$ cp ~/.ssh/id_rsa.pub idrsa ekzorchik@srv-us2204a1a:~$ scp idrsa ekzorchik@172.35.35.100:/ ekzorchik@172.35.35.100's password: idrsa 100% 577 85.3KB/s 00:00 ekzorchik@srv-us2204a1a:~$ ssh -l ekzorchik 172.35.35.100 "user ssh-keys import public-key-file=idrsa user=backup" ekzorchik@172.35.35.100's password: ekzorchik@srv-us2204a1a:~$
Шаг №19:
Возвращаюсь к проверке запуска сервиса oxidized:
ekzorchik@srv-us2204a1a:~$ oxidized ~/.config/oxidized/config
открываю браузер и обращаюсь через URL
-адрес к системе Ubuntu 22.04 Server
, т.е. http://IP&DNS:8888 (http://172.35.35.32:8888)
Если в строке узла нажать на колонке Actions
на первую иконку (отобразить текущий конфигурационный файл), то он предстанет у Вас в браузере:
(ниже часть моего конфига на сетевом оборудовании Mikrotik
)
Вторая иконка: Посмотреть историю изменений конфигурационного файла – это если было сделано несколько изменений в настройках Mikrotik
и был снят бекап.
Третья иконка: Это запуск процедуры снятия изменения в репозитарий
^C- Gracefully stopping, waiting for requests to finish === puma shutdown: 2023-03-22 11:50:18 +0300 === - Goodbye! ekzorchik@srv-us2204a1a:~$
Шаг №20:
Теперь нужно произвести настройка запуска oxidized
, как служба:
ekzorchik@srv-us2204a1a:~$ sudo cp /var/lib/gems/3.0.0/gems/oxidized-0.28.0/extra/oxidized.service /lib/systemd/system/oxidized.service ekzorchik@srv-us2204a1a:~$ sudo nano /lib/systemd/system/oxidized.service # Put this file in /etc/systemd/system. # # To set OXIDIZED_HOME instead of the default, # ~oxidized/.config/oxidized, uncomment (and modify as required) the # "Environment" variable below so systemd sets the correct # environment. [Unit] Description=Oxidized - Network Device Configuration Backup Tool After=network-online.target multi-user.target Wants=network-online.target [Service] ExecStart=/usr/local/bin/oxidized User=ekzorchik KillSignal=SIGKILL Environment="OXIDIZED_HOME=/home/ekzorchik/.config/oxidized" Restart=on-failure RestartSec=300s [Install] WantedBy=multi-user.target ekzorchik@srv-us2204a1a:~$ sudo systemctl enable oxidized.service Created symlink /etc/systemd/system/multi-user.target.wants/oxidized.service → /lib/systemd/system/oxidized.service. ekzorchik@srv-us2204a1a:~$ sudo systemctl start oxidized.service && sudo systemctl status oxidized.service | head -n 5 ● oxidized.service - Oxidized - Network Device Configuration Backup Tool Loaded: loaded (/lib/systemd/system/oxidized.service; enabled; vendor preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Wed 2023-03-22 11:54:07 MSK; 13ms ago Process: 9646 ExecStart=/usr/local/bin/oxidized (code=exited, status=217/USER) Main PID: 9646 (code=exited, status=217/USER) ekzorchik@srv-us2204a1a:~$
На заметку: Если вносите изменения в настройки сервиса, то после следует выполнить команду: sudo systemctl daemon-reload
ekzorchik@srv-us2204a1a:~$ sudo netstat -tulpn | grep :8888 tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 9801/puma 3.11.4 (t ekzorchik@srv-us2204a1a:~$
Итого делаю вывод, даже с учетом что операционная система уже не Ubuntu 18.04 Server
, у меня теперь есть заметка и для Ubuntu 22.04 Server
, в ней отражены изменения и если нужно настроить авторизацию к сервису, то обращаемся к предшествующей этой, выше в заметке ссылка присутствует. Но как по мне, это излишний сервер в моем подчинении, лучше скрипт резервного копирования и отрепетированная процедура восстановления.
На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik.