Управляющая консоль Xentaur
Материал из Xgu.ru
- Автор: Игорь Чубин
- Короткий URL: xentaur/console
< Xentaur
Управляющая консоль Xentaur — автоматизированный механизм управления устройствами через их стандартный интерфейс.
Этот механизм нужен для того, чтобы упростить, ускорить и унифицировать процесс настройки устройств. Не важно, виртуальных или реальных — интерфейс для управления устройствами не отличается. В любом случае это консоль.
Механизм позволяет автоматизировать процесс начальной настройки систем. Как правило, этот процесс содержит много рутинных операций, которые всегда хочется переложить на компьютер. Например, настройку IP-адресов, маршрутизации, начальных учётных записей, паролей для доступа к ним, различных интерфейсов для сетевого доступа и множество других.
Вариант с сохранением и последующей загрузкой конфигурации систем не очень хорош: конфигурация системы может меняться в зависимости от смены топологии, а смена топологии неизбежна (в противном случае придётся хранить по одной копии конфигурации каждого устройства для каждого варианта топологии).
Для примера рассмотрим простейшую задачу.
Мы хотим развернуть виртуальную сеть,
заданной топологии, состоящую из нескольких
маршрутизаторов, различной архитектуры (пусть это будет
несколько виртуальных маршрутизаторов Cisco
и несколько систем quagga, работающих под управлением
Linux или FreeBSD). Для того чтобы сделать задачу
более общей, пусть сеть состоит не только из виртуальных
устройств, но в её состав входит ещё и несколько
реальных устройств.
Мы описываем топологию сети. Дальше она должна быть создана.
У всех устройств должны быть настроены IP-адреса на интерфейсах. IP-адреса должны подчиняться какому-то простому функциональному или табличному закону. Между всеми устройствами должна быть поднята динамическая маршрутизация. На всех устройствах должны быть установлены имена.
Все операции достаточно просты,
но утомительны, если их выполнять
вручную для большого количества устройств.
В Xentaur используется следующий подход. Консоли всех устройств подключаются через оконный менеджер screen. Каждая консоль занимает одно окно screen. Управляющая консоль, фактически представляющая собой интерпретатор ipython, с загруженными модулями Xentaur, тоже работает в одном из окон screen. Управление происходит с её помощью.
Команды Xentaur это просто функции python, доступные из интерпретатора ipython. Фактически, управление средой происходит прямо изнутри её: администратор попадает прямо внутрь программы и вызывает её функции, оперируя с её объектами.
Команды консоли можно разделить на две группы:
* команды по управлению собственно виртуальной сетью; * команды по настройке виртуальных устройств.
Команды для управления топологией, воздействуют на состояние узлов и связей.
Виртуальные машины:
- Создание
- Удаление
- Перезагрузка
- Изменение конфигурации
Связи:
- Создание
- Удаление
- Изменение свойств (задержка, потери)
- Запись трафика
Команды по управлению устройствами воздействуют на управляющие консоли устройств.
При выполнении внутри консоли ipython команд для управления устройствами генерируются текстовые последовательности, передающиеся screen, который в свою очередь передает их в консоли устройств.
Такой подход не зависит от природы устройств (то есть, от того, являются ли они реальными или виртуальными), а также от того, каким образом к ним осуществляется доступ (xm console, minicom, ssh, telnet).
Использование ipython для управления имеет несколько преимуществ:
- гибкость (можно выполнять любые действия с машинами и соединениями, которые только можно описать на языке python);
- полный доступ к структурам данных (управление происходит изнутри системы, поэтому пользователю доступны все структуры данных и код, доступный изнутри самого приложения);
- простота развития (в ходе экспериментов могут быть выработаны удачные программные конструкции, которые впоследствии можно интегрировать в код Xentaur или его модулей, и тем самым расширить его функционал);
- богатство инструментария, доступное из ipython (базы данных, статистический анализ и прочий математический аппарат python);
- Мягкая кривая изучения (использование языка python позволяет обойтись без изучения нового языка конфигурирования).
Такой подход обладает следующими преимуществами:
- гибкость (можно выполнять любые действия с машинами и линками, которые только можно описать на языке python)
- простота развития (в ходе экспериментов могут быть выработаны удачные программные конструкции, которые впоследствии можно интегрировать в код Xentaur или его модулей и тем самым расширить его функционал)
Содержание |
[править] Приёмы работы с ipython
[несколько слов об ipython]
[править] Объекты
Каждому объекту сети сопоставлен программный, объект, при помощи которого происходит управление объектом сети.
Список узлов сети называется nodes, а мостов -- bridges.
Просмотреть эти списки можно, если просто ввести их названия в приглашение.
In [1]: bridges Out[1]: ['br1', 'br2', 'br3', 'br4', 'br5', 'br6', 'cat1', 'cat2'] In [2]: nodes Out[2]: ['qua1', 'qua2', 'dyn3', 'qua4', 'qua5', 'dyn6', 'cisco1', 'linux1', 'windows1', 'mac1']
Объекты узлов доступны по имени n_имя, где имя --- это имя соответствующего узла.
Объекты мостов доступны по имени b_имя.
Операции, которые можно выполнить с соответствующим объектом, доступны как методы этого объекта. Просмотреть их список можно, если набрать имя объекта, поставить . и нажать табуляцию.
In [6]: b_br2.<Tab> b_br2.__class__ b_br2.down b_br2.is_real b_br2.__doc__ b_br2.dump_start b_br2.is_turned_down b_br2.__init__ b_br2.graphviz_line b_br2.name b_br2.__module__ b_br2.is_cross b_br2.show b_br2.a b_br2.is_hidden b_br2.up
Выполнить какую-либо операцию можно если набрать её имя полностью и нажать Enter. Обязательно в конце вызова нужно поставить символы (), даже если операция не требует аргументов.
In [7]: b_br2.down() Bridge br2 is turned down already
[править] Работа с узлами
[править] Запуск, останов и перезапуск узлов
[править] Создание новых узлов
[править] Работа с виртуальной сетью
[править] Работа с мостами
Здесь service0 — имя моста, с которым выполняются операции.
In [1]: b_service0.show() 272: service0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff In [2]: b_service0.down() In [3]: b_service0.show() 272: service0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff In [4]: b_service0.up() In [5]: b_service0.show() 272: service0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
[править] Работа с интерфейсами
- int_disconnect(domain, int_number) — отключить подключённый интерфейс
- int_connect(domain, int_number, bridge) — подключить ранее отключённый
- int_reconnect(domain, int_number, bridge) — переподключить подключённый интерфейс к новому мосту
- show_int(domain, int_number) — вернуть имя моста, к которому подключен интерфейс
In [6]: vbridges_table Out[6]: {'dyn1': ['vlan101', 'vlan102'], 'dyn2': ['vlan101', 'vlan103'], 'dyn3': ['vlan102', 'vlan103', 'vlan104'], 'qua4': ['vlan105', 'vlan106', 'vlan111'], 'qua5': ['vlan110', 'vlan111'], 'qua6': ['vlan109', 'vlan110'], 'qua7': ['vlan108', 'vlan109'], 'qua8': ['vlan107', 'vlan108'], 'qua9': ['vlan106', 'vlan107']} In [7]: int_disconnect('dyn1',0) In [8]: vbridges_table Out[8]: {'dyn1': ['', 'vlan102'], 'dyn2': ['vlan101', 'vlan103'], 'dyn3': ['vlan102', 'vlan103', 'vlan104'], 'qua4': ['vlan105', 'vlan106', 'vlan111'], 'qua5': ['vlan110', 'vlan111'], 'qua6': ['vlan109', 'vlan110'], 'qua7': ['vlan108', 'vlan109'], 'qua8': ['vlan107', 'vlan108'], 'qua9': ['vlan106', 'vlan107']} In [9]: int_connect('dyn1', 0, 'vlan107') In [10]: vbridges_table Out[10]: {'dyn1': ['vlan107', 'vlan102'], 'dyn2': ['vlan101', 'vlan103'], 'dyn3': ['vlan102', 'vlan103', 'vlan104'], 'qua4': ['vlan105', 'vlan106', 'vlan111'], 'qua5': ['vlan110', 'vlan111'], 'qua6': ['vlan109', 'vlan110'], 'qua7': ['vlan108', 'vlan109'], 'qua8': ['vlan107', 'vlan108'], 'qua9': ['vlan106', 'vlan107']}
[править] Запись трафика на мосту
- bridge.dump_start(filter, port) — записать трафик, передающийся через мост bridge. Необязательный параметр filter (в формате Berkeley Packet Filter) указывает, какой именно трафик должен быть записан. При его отсутствии записывается весь трафик, передающийся через мост
In [1]: b_service0.dump_start() Writing dump... (press Ctrl-C to stop) Done. Dump is written to xentaur.dump Out[1]: 0
Записанный трафик можно впоследствии проанализировать с помощью wireshark:
%# wireshark -r xentaur.dump
Можно просматривать трафик непосредственно в реальном времени, как изнутри системы, на которой выполняются виртуальные системы, так и удалённо.
Запись трафика для просмотра по сети начинается командой:
In [1]: b_service0.dump_start(port=3020) Writing dump... (press Ctrl-C to stop) Done. Out[1]: 0
Перехваченный трафик будет доступен на порту 3020.
Теперь на компьютере-клиенте запускается wireshark, который показывает перехваченный трафик (здесь dom0 это IP-адрес или доменное имя хост-системы):
%$ nc dom0 3020 | wireshark -k -i -
[править] Работа с консолью устройств
- ctrl-x d -- Выйти из консоли и перейти в Unix-shell
Для того чтобы вернуться обратно:
screen -r
[править] Автоматизированная настройка устройств из управляющей консоли xentaur
Пример 1. Установить имя хоста равное имени домена.
for i in [1,2,3,4,5,6]: write_to(i,"\nena\nconf t\nhostname "+domains[i-1]+"\nend\n")
Пример 2. Включить оба ethernet-интерфейса.
faX_up=""" ena conf t int fa0/0 no shutdown exit int fa1/0 no shutdown exit exit exit """ for i in [1,2,3,4,5,6]: write_to(i,faX_up)
Пример 3. Установить адреса на интерфейсах
cisco_set_ip_on_int=""" int fa%s/0 no ip address ip address %s 255.255.255.0 exit """ i=0 for dom in domains: i+=1 write_to(i,"\nena\nconf t\n") j=0 for br in vbridges_table[dom][1:]: write_to(i,cisco_set_ip_on_int % (j, "192.168.%s.%s"%(bridges.index(br),i))) j+=1 write_to(i,"\nend\n")
Пример 4. Включение OSPF для сети 192.168.0.0/26
write_to(domains,"\nena\nconf t\nrouter ospf\nnetwork 192.168.0.0 0.0.255.255 area 0\nend\n")
Возможности расширенного управления
(удобный интерфейс для использования традиционных инструментов с целью управления)
|
---|