Система управления конфигурациями Oxidized

Система управления конфигурациями Oxidized.

Содержание

1 Общая информация

2 Установка

2.1 Необходимое программное обеспечение

  • Установите язык ruby:
    1dnf -y install ruby
    
  • Установите необходимые средства разработки:
    1dnf -y group install "Development Tools"
    2dnf -y install make cmake which sqlite-devel ruby gcc ruby-devel libicu-devel gcc-c++
    3dnf -y install openssl-devel
    
  • Установите git для хранения файлов:
    1dnf -y install git
    

2.2 Установка Oxidized

  • Добавьте пользователя oxidized:
    1useradd -c "oxidized system account" -m -d /home/oxidized -s /bin/bash oxidized
    
  • Устанавливаем Oxidized:
    1gem install oxidized
    2gem install oxidized-script oxidized-web
    

2.3 Обновление Oxidized

  • Логинимся под пользователем oxidized:
    1su - oxidized
    
  • Обновляем Oxidized:
    1gem update oxidized
    2gem update oxidized-script oxidized-web
    

3 Конфигурация

3.1 Конфигурация Oxidized

  • Документация: https://github.com/ytti/oxidized/blob/master/docs/Configuration.md
  • Запустите oxidized однократно для создания структуры каталогов и шаблона конфигурационного файла:
    1su - oxidized
    2oxidized
    
  • Отредактируйте шаблон файла конфигурации ~oxidized/.config/oxidized/config.
  • Oxidized использует формат YAML для конфигурационных файлов, поэтому все отступы должны быть выполнены пробелами, допускается два или четыре пробела на отступ.
  • Основные элементы файла конфигурации:
    • Задание имени пользователя и пароля по умолчанию для соединения с устройствами:

      1username: oxidized
      2password: Password
      
    • Указание типа устройства по умолчанию (например, Cisco):

      1model: ios
      
    • Зададим интервал создания копий данных в секундах (рекомендуется делать копии раз в сутки, что соответствует 86400 секундам):

      1interval: 86400
      
    • Для устройств со слабыми характеристиками и медленными каналами связи рекомендуется увеличить таймаут (здесь таймаут 60 секунд, три повторные попытки):

      1timeout: 60
      2retries: 3
      
    • Если вы не хотите, чтобы ваши резервные копии содержали чувствительные данные, такие как ключи и пароли, добавьте следующую опцию:

      1remove_secret: true
      
    • Раздел input отвечает за связь с устройствами (по умолчанию используются протоколы ssh и telnet, протокол telnet не безопасен, рекомендуется использовать только ssh):

      1input:
      2        default: ssh
      3        debug: false
      4        ssh:
      5          secure: false
      6        ftp:
      7          passive: true
      8        utf8_encoded: true
      
    • Раздел output определяет способ хранения собранной информации (будем использовать git для этой цели):

      1output:
      2        default: git
      3        git:
      4          user: oxidized
      5          email: oxidized@MYDOMAIN.ru
      6          repo: "/home/oxidized/.config/oxidized/devices.git"
      
    • Раздел source задаёт базу данных устройств (используем CSV-файл с двоеточием в качестве разделителя):

       1source:
       2        default: csv
       3        csv:
       4          file: "/home/oxidized/.config/oxidized/router.db"
       5          delimiter: !ruby/regexp /:/
       6          map:
       7            name: 0
       8            model: 1
       9            ip: 2
      10            port: 3
      11            username: 4
      12            password: 5
      13          gpg: false
      
      • Опция file задаёт путь к файлу с базой устройств.
      • Подсекция map определяет порядок параметров подключения к устройству в строке CSV-файла.
  • Весь файл конфигурации:
     1---
     2username: oxidized
     3password: Password
     4model: ios
     5resolve_dns: true
     6interval: 86400
     7use_syslog: false
     8debug: false
     9threads: 30
    10timeout: 140
    11retries: 3
    12prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
    13rest: 127.0.0.1:8888
    14next_adds_job: false
    15remove_secret: true
    16vars: {}
    17groups: {}
    18models: {}
    19pid: "/home/oxidized/.config/oxidized/pid"
    20log: "/home/oxidized/.config/oxidized/log"
    21crash:
    22  directory: "/home/oxidized/.config/oxidized/crashes"
    23  hostnames: false
    24stats:
    25  history_size: 10
    26input:
    27  default: ssh
    28  debug: false
    29  ssh:
    30        secure: false
    31  ftp:
    32        passive: true
    33  utf8_encoded: true
    34output:
    35  default: git
    36  git:
    37        user: oxidized
    38        email: oxidized@MYDOMAIN.ru
    39        repo: "/home/oxidized/.config/oxidized/devices.git"
    40source:
    41  default: csv
    42  csv:
    43        file: "/home/oxidized/.config/oxidized/router.db"
    44        delimiter: !ruby/regexp /:/
    45        map:
    46          name: 0
    47          model: 1
    48          ip: 2
    49          port: 3
    50          username: 4
    51          password: 5
    52        gpg: false
    53model_map:
    54  juniper: junos
    55  cisco: ios
    

3.2 Хранение в git

3.2.1 Конфигурация сохранения в git

  • Здесь используется интерфейс libgit2 (не работают хуки).
  1. Репозиторий без групп

    • Конфигурация имеет вид:
      1output:
      2  default: git
      3  git:
      4        user: Oxidized
      5        email: o@example.com
      6        repo: "/home/oxidized/.config/oxidized/devices.git"
      
  1. Репозитории с группами

    • Конфигурация имеет вид:
      1output:
      2  default: git
      3  git:
      4        user: Oxidized
      5        email: o@example.com
      6        repo: "/home/oxidized/.config/oxidized/git-repos/default.git"
      
    • Oxidized создаст репозиторий для каждой группы в том же каталоге, что и репозиторий default.git.
    • Если вы хотите использовать группы и один репозиторий, вы можете принудительно сделать это с помощью конфигурации single_repo:
      1output:
      2  default: git
      3  git:
      4        single_repo: true
      5        repo: "/home/oxidized/.config/oxidized/devices.git"
      

3.2.2 Просмотр файлов устройств

  • Перейдите в правильный репозиторий git для необходимого устройства и получите список устройств:
    1git ls-files -s
    
  • Посмотрите содержимое файла:
    1git cat-file -p <object id>
    

3.2.3 Удалить отключённое устройство

  • Очистить сохранённую конфигурацию устройства:
    1git rm --cached <object id>
    

3.3 Файл описания оборудования

  • Создадим файл: /home/oxidized/.config/oxidized/router.db:
    1sw01:ios:10.10.10.1
    2sw02:ios:10.10.10.10:22:test:PASSWORD
    
  • Структура полей: наименование, тип оборудования, IP-адрес, порт, логин, пароль.
  • Если значения отсутствуют, то используются значения по умолчания.

3.4 Службы запуска

  • Запустим oxidized:
    1systemctl enable --now oxidized.service
    

4 Подключение к LibreNMS

4.1 Общая информация

  • Интеграция LibreNMS с Oxidized дает следующие преимущества:
    • Просмотр конфигурации: «Текущая», «История» и «Различия» на вкладке «Конфигурации» каждого устройства.
    • Автоматическое добавление устройств в Oxidized: включая фильтрацию и группировку для упрощения управления учетными данными.
    • Поиск конфигурации.

4.2 Порядок действий

  • Установить Oxidized.
  • Подключить Oxidized к web-интерфейсу LibreNMS.
  • Чтобы устройства добавлялись автоматически, вам необходимо настроить извлечения их из LibreNMS.
  • LibreNMS автоматически сопоставит ОС с именем модели Oxidized, не нужно использовать параметр конфигурации model_map в Oxidized.

4.3 SELinux

  • Необходимо разрешить httpd исходящие подключения к сети:
    1setsebool -P httpd_can_network_connect 1
    

4.4 Подключение Oxidized к web-интерфейсу LibreNMS

  • Активируйте подключение к Oxidized/
    • Подключить можно в web-интерфейсе:

      https://<ваш URL-адрес librenms>/settings/external/oxidized

    • Подключить можно в командной строке:

      1lnms config:set oxidized.enabled true
      2lnms config:set oxidized.url http://127.0.0.1:8888
      
  • Подключите управление версиями конфигурации (работает с модулем вывода git).
    • Подключить можно в web-интерфейсе:

      https://<ваш URL-адрес librenms>/settings/external/oxidized

    • Подключить можно в командной строке:

      1lnms config:set oxidized.features.versioning true
      

4.5 Информация о группах

  • Oxidized поддерживает различные способы использования учётных данных для входа на устройства.
  • Вы можете указать глобальное имя пользователя и пароль в Oxidized, имя пользователя и пароль на уровне группы или для каждого устройства.
  • При синхронизации с LibreNMS можно делать только конфигурации для групп.
  • LibreNMS поддерживает отправку групп в Oxidized, чтобы вы могли затем определить учётные данные группы в Oxidized. Чтобы включить эту поддержку, включите «Включить возврат групп в Oxidized».
    • Подключить можно в web-интерфейсе:

      https://<ваш URL-адрес librenms>/settings/external/oxidized

    • Подключить можно в командной строке:

      1lnms config:set oxidized.group_support true
      
  • Можно установить группу по умолчанию (все устройства попадут в эту группу):
    • Подключить можно в web-интерфейсе:

      https://<ваш URL-адрес librenms>/settings/external/oxidized

    • Подключить можно в командной строке:

      1lnms config:set oxidized.default_group default
      

4.5.1 Задание разделения на группы

  • Группы для Oxidized никак не связаны с группами LibreNMS.
  • Чтобы вернуть переопределение в Oxidized, вы можете сделать это, предоставив ключ переопределения, затем сопоставив поиск хоста (или хостов) и, наконец, определив само значение переопределения.
  • LibreNMS не проверяет достоверность этих атрибутов, а передает их в Oxidized в соответствии с определением.
  • Сопоставление хостов можно выполнить с помощью hostname, sysname, os, location, sysDescr, hardware, purpose, notes.
  • Порядок соответствия следующий:
    • hostname
    • sysName
    • sysDescr
    • hardware
    • os
    • location
    • ip
    • purpose
    • notes
  • Пример:
    1lnms config:set oxidized.maps.group.os.+ '{"match": "ios", "value": "cisco"}'
    2lnms config:set oxidized.maps.group.os.+ '{"match": "vrp", "value": "huawei"}'
    3lnms config:set oxidized.maps.group.os.+ '{"match": "asa", "value": "asa"}'
    4lnms config:set oxidized.maps.group.os.+ '{"match": "bdcom", "value": "bdcom"}'
    

4.5.2 Конфигурация в Oxidized

  • При необходимости вы можете указать учетные данные для групп, используя следующее в вашей конфигурации Oxidized:
    1groups:
    2  <groupname>:
    3        username: <user>
    4        password: <password>
    
  • Например:
     1groups:
     2  cisco:
     3        username: user1
     4        password: password1
     5  asa:
     6        username: user2
     7        password: password2
     8  huawei:
     9        username: user3
    10        password: password3
    11  bdcom:
    12        username: user5
    13        password: password5
    14        vars:
    15          enable: enpassword5
    16  default:
    17        username: user4
    18        password: password4
    

4.6 Автоматическое добавление устройств в Oxidized

  • Нужно настроить учётные данные по умолчанию для ваших устройств в конфигурации Oxidized:

     1source:
     2  default: http
     3  debug: false
     4  http:
     5        url: https://<ваш URL-адрес librenms>/api/v0/oxidized
     6        map:
     7          name: hostname
     8          model: os
     9          group: group
    10        headers:
    11          X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed'
    12        vars_map:
    13          ssh_port: ssh_port
    14          telnet_port: telnet_port
    
    • Токен можно создать в меню Шестерёнка > API > API Settings:

      https://<ваш URL-адрес librenms>/api-access

    • Проверить взаимодействие можно из командной строки:

      1curl -H 'X-Auth-Token: YOUR_AUTH_TOKEN' https://<ваш URL-адрес librenms>/api/v0/oxidized
      
  • LibreNMS может перезагружать список узлов каждый раз, когда устройство добавляется в LibreNMS.

    • Подключить можно в web-интерфейсе:

      https://<ваш URL-адрес librenms>/settings/external/oxidized

    • Подключить можно в командной строке:

      1lnms config:set oxidized.reload_nodes true
      

4.7 Переименование устройства

  • Чтобы история конфигурационных файлов осталась вместе с устройством, необходимо переписать историю git.

  • Для переписывания истории используется скрипт https://gist.github.com/emiller/6769886:

      1#!/bin/bash
      2#
      3# git-mv-with-history -- move/rename file or folder, with history.
      4#
      5# Moving a file in git doesn't track history, so the purpose of this
      6# utility is best explained from the kernel wiki:
      7#
      8#   Git has a rename command git mv, but that is just for convenience.
      9#   The effect is indistinguishable from removing the file and adding another
     10#   with different name and the same content.
     11#
     12# https://git.wiki.kernel.org/index.php/GitFaq#Why_does_Git_not_.22track.22_renames.3F
     13#
     14# While the above sucks, git has the ability to let you rewrite history
     15# of anything via `filter-branch`. This utility just wraps that functionality,
     16# but also allows you to easily specify more than one rename/move at a
     17# time (since the `filter-branch` can be slow on big repos).
     18#
     19# Usage:
     20#
     21#   git-rewrite-history [-d/--dry-run] [-v/--verbose] <srcname>=<destname> <...> <...>
     22#
     23# After the repsitory is re-written, eyeball it, commit and push up.
     24#
     25# Given this example repository structure:
     26#
     27#   src/makefile
     28#   src/test.cpp
     29#   src/test.h
     30#   src/help.txt
     31#   README.txt
     32#
     33# The command:
     34#
     35#   git-rewrite-history README.txt=README.md  \     <-- rename to markdpown
     36#                       src/help.txt=docs/    \     <-- move help.txt into docs
     37#                       src/makefile=src/Makefile   <-- capitalize makefile
     38#
     39#  Would restructure and retain history, resulting in the new structure:
     40#
     41#    docs/help.txt
     42#    src/Makefile
     43#    src/test.cpp
     44#    src/test.h
     45#    README.md
     46#
     47# @author emiller
     48# @date   2013-09-29
     49#
     50
     51function usage() {
     52  echo "usage: `basename $0` [-d/--dry-run] [-v/--verbose] <srcname>=<destname> <...> <...>"
     53  [ -z "$1" ] || echo $1
     54
     55  exit 1
     56}
     57
     58[ ! -d .git ] && usage "error: must be ran from within the root of the repository"
     59
     60dryrun=0
     61filter=""
     62verbose=""
     63repo=$(basename `git rev-parse --show-toplevel`)
     64
     65while [[ $1 =~ ^\- ]]; do
     66  case $1 in
     67    -d|--dry-run)
     68      dryrun=1
     69      ;;
     70
     71    -v|--verbose)
     72      verbose="-v"
     73      ;;
     74
     75    *)
     76      usage "invalid argument: $1"
     77  esac
     78
     79  shift
     80done
     81
     82for arg in $@; do
     83  val=`echo $arg | grep -q '=' && echo 1 || echo 0`
     84  src=`echo $arg | sed 's/\(.*\)=\(.*\)/\1/'`
     85  dst=`echo $arg | sed 's/\(.*\)=\(.*\)/\2/'`
     86  dir=`echo $dst | grep -q '/$' && echo $dst || dirname $dst`
     87
     88  [ "$val" -ne 1  ] && usage
     89  [ ! -e "$src"   ] && usage "error: $src does not exist"
     90
     91  filter="$filter                            \n\
     92    if [ -e \"$src\" ]; then                 \n\
     93      echo                                   \n\
     94      if [ ! -e \"$dir\" ]; then             \n\
     95        mkdir -p ${verbose} \"$dir\" && echo \n\
     96      fi                                     \n\
     97      mv $verbose \"$src\" \"$dst\"          \n\
     98    fi                                       \n\
     99  "
    100done
    101
    102[ -z "$filter" ] && usage
    103
    104if [[ $dryrun -eq 1 || ! -z $verbose ]]; then
    105  echo
    106  echo "tree-filter to execute against $repo:"
    107  echo -e "$filter"
    108fi
    109
    110[ $dryrun -eq 0 ] && git filter-branch -f --tree-filter "`echo -e $filter`"
    
    Распечатка 1: /home/oxidized/bin/git-mv-with-history
    • Поместим его в файл /home/oxidized/bin/git-mv-with-history.
  • Полный скрипт взят со страницы: https://github.com/ytti/oxidized/issues/1449:

     1#!/bin/bash
     2## https://github.com/ytti/oxidized/issues/1449
     3#echo "Call rename-host host_old host_new huawei"
     4
     5OLD_NAME=$1
     6NEW_NAME=$2
     7HARD_TYPE=$3
     8
     9sudo systemctl stop oxidized
    10
    11sudo -u oxidized git config --global --add safe.directory "*"
    12## can't commit without setting email
    13sudo -u oxidized git config --global user.email "oxidized@rudn.su"
    14## can't commit without setting name
    15sudo -u oxidized git config --global user.name "Oxidized"
    16
    17rm -rf /tmp/devices.git.clone
    18sudo -u oxidized mkdir -p /tmp/devices.git.clone && cd /tmp/devices.git.clone ;\
    19    git clone /home/oxidized/.config/oxidized/devices.git; \
    20    cd devices ; \
    21    /home/oxidized/bin/git-mv-with-history ${HARD_TYPE}/${OLD_NAME}=${HARD_TYPE}/${NEW_NAME} ; \
    22    git push --force
    23rm -rf /tmp/devices.git.clone
    24cd
    25sudo -u librenms /usr/local/bin/lnms device:rename -vv ${OLD_NAME} ${NEW_NAME}
    26sudo systemctl start oxidized
    
    Распечатка 2: ~/bin/rename-host

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

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие