По многочисленным просьбам моих подписчиков к ставшим востребованным приватным заметкам моих блогов (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)

Сервис Oxidized успешно подключился к Mikrotik через учетную запись backup с использованием ssh-ключей

Если в строке узла нажать на колонке Actions на первую иконку (отобразить текущий конфигурационный файл), то он предстанет у Вас в браузере:

(ниже часть моего конфига на сетевом оборудовании Mikrotik)

ниже часть моего конфига на сетевом оборудовании 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.