Table of Contents

Проба Oxidized

Вводная

“Oxidized is a network device configuration backup tool. It's a RANCID replacement!”, это действительно так, но в сравнении с Rancid в Oxidized есть пару моментов, которые недоступны прямо из коробки:

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

При это стоит отметить, что Oxidized сильно активнее развивается и у него есть активная публика которая сдаёт проблемы.
Rancid резилится раз в несколько лет, последний раз в 2025.
Поэтому хорошо освоенный oxidized всё равно предпочтительнее.

Варианты установки

В виде докер образа

Вариант хорошо подойдёт для быстрого запуска и ознакомления.
Ниже будет описание этого варианта установки, но в очень базовом виде:

Позже надо будет поставить angie перед oxidized для https и аутентификации, настроить ротирование логов в докере и собрать всё в docker-compose.

Как сервис на ВМ

Для прода планирую поставить на отдельную ВМ, т.к. скорее всего надо будет что-нибудь править в Ruby скриптах которые собирают конфиг с устройств.
В таком варианте проще будет сохранить изменения в скриптах, чем при использовании докер образа.
Этот вариант хорошо написан у человека тут,


Установка oxidized в виде докер образа

Официальная документация - https://github.com/ytti/oxidized/blob/master/docs/Docker.md

Базовая настройка и первый запуск

На хостовой ВМ создаём директорию, которую будет подключать к контейнеру для хранения конфигурации, ключей и внутреннего репозитория.
Задаем овнера и группу, 30000 это UID и GID из Dockefile контейнера.

root@4-docker1:~# mkdir -p /data/volume-oxidized2
root@4-docker1:~# chown -R  30000:30000 

root@4-docker1:~# ll /data/
total 8
drwxr-xr-x 4 30000 30000 4096 Aug 13 12:29 volume-oxidized2

Запускаем контейнер и делаем первичную инициализацию конфигов (“su - oxidized -c oxidized”).
После выполнения “su - oxidized -c oxidized” контейнер остановится.

root@4-docker1:/data# docker run -ti -d -v /data/volume-oxidized2:/home/oxidized/ -p 8888:8888/tcp -t oxidized/oxidized su - oxidized -c oxidized

В примонтированной директории появится начальный конфиг.

root@4-docker1:~# cd /data/volume-oxidized2/.config/oxidized

root@4-docker1:/data/volume-oxidized2/.config/oxidized# ll -a
total 12
drwxrwxr-x 2 30000 30000 4096 Aug 16 15:01 .
drwxrwxr-x 3 30000 30000 4096 Aug 16 15:01 ..
-rw-rw-r-- 1 30000 30000  697 Aug 16 15:01 config

Приводим файл config к виду.

---
resolve_dns: false
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 140
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
next_adds_job: false
remove_secret: true

extensions:
  oxidized-web:
    load: true
    # Bind to any IPv4 interface
    listen: 0.0.0.0
    # Bind to port 8888 (default)
    port: 8888

vars: {}
groups: 
  routers: {}
  switches: {}
models: {}
pid: "/home/oxidized/.config/oxidized/pid"

logger:
#  level: :trace
  appenders:
    - type: file
      level: info
      file: /home/oxidized/.config/oxidized/log
#    - type: file
#      level: trace
#      file: /home/oxidized/.config/oxidized/trace.log

crash:
  directory: "/home/oxidized/.config/oxidized/crashes"
  hostnames: false

stats:
  history_size: 10

source:
  default: csv
  csv:
    file: "/home/oxidized/.config/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      group: 0
      name: 1
      model: 2
      ip: 3
      port: 4
      username: 5
      password: 6
    gpg: false

input:
  default: ssh
  debug: false
  ssh:
    secure: false
  utf8_encoded: true

output:
  default: git
  git:
    user: oxidized
    email: oxidized@MYDOMAIN.ru
    single_repo: true
    repo: "/home/oxidized/.config/oxidized/devices.git"

C хостовой ВМ создаём файл router.db со списком оборудования.

root@4-docker1:~# touch /data/volume-oxidized2/.config/oxidized/router.db
root@4-docker1:~# chown 30000:30000 /data/volume-oxidized2/.config/oxidized/router.db
root@4-docker1:~# chmod 640 /data/volume-oxidized2/.config/oxidized/router.db

Добавляем в router.db первое оборудование.

root@4-docker1:/data/volume-oxidized2/.config/oxidized# cat router.db
#
routers:R11:junos:x.x.x.x:22:oxidized:Cakyiemweo...taphoonIb

Запускаем ещё раз контейнер, у oxidized уже есть конфигурация.

docker run -ti -d -v /data/volume-oxidized2:/home/oxidized/ -p 8888:8888/tcp -t oxidized/oxidized

Если всё хорошо, и oxidized смог снять кофниг с железке, то в рабочей директории появится “встроенный” репозиторий device.git.

root@4-docker1:/data/volume-oxidized2/.config/oxidized# ll
total 164
-rw-r--r-- 1 30000 30000   1652 Aug 16 15:18 config
-rw-r--r-- 1 30000 30000    693 Aug 16 15:31 crash
drwxr-xr-x 2 30000 30000   4096 Aug 16 15:31 crashes
drwxr-xr-x 6 30000 30000   4096 Aug 16 15:35 devices.git
-rw-r--r-- 1 30000 30000 119028 Aug 16 15:35 log
drwxr-xr-x 2 30000 30000   4096 Aug 16 15:20 logs
-rw-r--r-- 1 30000 30000      2 Aug 16 15:35 pid
-rw-r--r-- 1 30000 30000     64 Aug 16 15:35 router.db

Так же заработает веб-интерфейс на порту tcp/8888.

ВСТАВИТЬ КАРТИНКУ

Если что-то не поднялось, смотрим в файлы log и\или crash.


Сбор конфигураций оборудования в файлы

Если нужно собирать конфигурацию оборудования в виде файлов, то секцию output надо привести к виду ниже.

output:
  default: file
  file:
    directory: "/home/oxidized2/.config/oxidized/configs-as-file/"

Если оборудование в группе, то в “/home/oxidized2/.config/oxidized” будет создана папка с именем группы и туда положен файл с конфигурацией.
Если оборудование без группы, то файл с конфигом будет в рабочей директории “/home/oxidized2/.config/oxidized”, а не в директории указанной в “output”.

В веб-интерфейсе конфигурация будет видна, но не будет диффов.


Отправка конфигураций во внешние git репозитории

“Внутренний” репозиторий oxidized можно запушить в github/gitlab/gitea, в результате конфиг можно будет посмотреть в виде файлов.

ssh-ключи

На хостовой ВМ генерим ssh-ключ для пользователя контейнера “oxidized” (https://github.com/ytti/oxidized/blob/master/docs/Docker.md#store-the-ssh-keys-a-remote-git-repository).

Делаем директорию “.ssh” и задаём права.

root@4-docker1:~# mkdir /data/volume-oxidized2/.ssh
root@4-docker1:~# chmod 700 /data/volume-oxidized2/.ssh/
root@4-docker1:~# chown 30000:30000 /data/volume-oxidized2/.ssh/

Генерим ключ.

root@4-docker1:~# ssh-keygen -t ed25519 -f /data/volume-oxidized2/.ssh/id_ox_key -C oxidized_in_docker

Сканируем публичные ключи хранилища, в данном случае ключи github.com, без этого oxidized не будет пушить (https://github.com/ytti/oxidized/issues/2753).

root@4-docker1:~# ssh-keyscan github.com >> /data/volume-oxidized2/.ssh/known_host
# github.com:22 SSH-2.0-5ec3cafd
# github.com:22 SSH-2.0-5ec3cafd
# github.com:22 SSH-2.0-5ec3cafd
# github.com:22 SSH-2.0-5ec3cafd
# github.com:22 SSH-2.0-5ec3cafd

Ещё раз правим права для созданных файлов.

root@4-docker1:~# chown -R 30000:30000 /data/volume-oxidized2/.ssh/

root@4-docker1:~# ll /data/volume-oxidized2/.ssh/
total 12
-rw------- 1 30000 30000 411 Aug 16 21:33 id_ox_key
-rw-r--r-- 1 30000 30000 100 Aug 16 21:33 id_ox_key.pub
-rw-r--r-- 1 30000 30000 828 Aug 16 21:32 known_host

Репозиторий на github

На github заводим приватный репозиторий.

В настройках репозитория добавляем публичную часть ранее созданного ключа: “Settings” → “Deploy keys” → “Add deploy key” (ставим галку “Allow write access ”).

Из контейнера проверяем доступ к github.

root@4-docker1:~# docker exec -it -u 30000:30000 <container_id> /bin/bash
oxidized@63f75b7a022a:/$

oxidized@63f75b7a022a:/$ ssh -T -i ~/.ssh/id_ox_key git@github.com
The authenticity of host 'github.com (140.82.121.3)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Hi kostyana/ox! You've successfully authenticated, but GitHub does not provide shell access.

Правим конфигурацию oxidized

Дописываем в config секцию hooks.

hooks:
  push_to_remote:
    type: githubrepo
    events: [post_store]
    remote_repo: git@github.com:kostyana/ox.git
    publickey: /home/oxidized/.ssh/id_ox_key.pub
    privatekey: /home/oxidized/.ssh/id_ox_key

Перезапускаем контейнер, файл конфига появится в github.


Полезные ссылки