Table of Contents
Проба Oxidized
Вводная
“Oxidized is a network device configuration backup tool. It's a RANCID replacement!”, это действительно так, но в сравнении с Rancid в Oxidized есть пару моментов, которые недоступны прямо из коробки:
- В oxidized нельзя временно отключить сбор конфигурации с одной конкретной железки, нет параметра “down” в списке оборудования.
Железку можно только удалить из списка оборудования и, если не стоит “clean_obsolete_nodes = false”, конфиг в следующий сбор тоже удалится.
Навскидку неудобное сделано, или надо будет терпеть уведомления о том, что конфиг не собрался или аккуратно удалять и обратно добавлять железку в список. - Нельзя полностью удалить железку из списка оборудования и при этом оставить её конфиг для истории в быстром доступе.
В Rancid такие конфигурации помечаются как “dead” и в отдельном разделе в веб-интерфейсе на них можно посмотреть в любой момент. - Нельзя отправить письмо из oxidized с диффом конфигурации, из коробки можно отправить в слак или в xmpp-мессенджеры.
Письмом можно оповестить о невозможности снять конфигурацию.
Письмо с диффом надо отправть из github\gitlab\gitea. - Нет совсем простого способа, прямо из терминала ВМ с oxidized, посмотреть собранные конфиги в виде файлов.
Конфиги, сложенные во “встроенный” git-репозиторий, надо смотреть через web-интерфейс. Связанно с тем, что oxidized работает с репозиторием не через “git cli”, а напрямую через “rugged/libgit2” (https://github.com/ytti/oxidized/issues/3275). Чтобы увидеть конфиги в виде файлов, “встроенный” git репозиторий надо хуком отправить на github\gitlab\gitea. Отправить в локальный git на той же машине пока не получается. - Нет возможности одновременно хранить в самом oxidized конфиги в файлах и во “встроенном” git-е.
Проблемы не смертельные, можно и надо будет придумать как их решить.
Сейчас получается, что полностью автономномно oxidized работать не может, ему нужна небольшая обвязка.
При это стоит отметить, что Oxidized сильно активнее развивается и у него есть активная публика которая сдаёт проблемы.
Rancid резилится раз в несколько лет, последний раз в 2025.
Поэтому хорошо освоенный oxidized всё равно предпочтительнее.
Варианты установки
В виде докер образа
Вариант хорошо подойдёт для быстрого запуска и ознакомления.
Ниже будет описание этого варианта установки, но в очень базовом виде:
- Запускаем oxidized в докере.
- Добавляем пару железок в разные группы.
- Настраиваем хук для отправки конфигурации в github.
Позже надо будет поставить 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.