Pyzzle Agent

pyzzle_agent - отдельная программа для сбора данных с unix-серверов

Эта программа ставится на все сервера, с которым взаимодействует система Pyzzle.ISP и позволяет:

  • собирать данные для мониторинга
  • обрабатывать сырые netflow данные для детализации трафика
  • просматривать текущее состояние абонента на маршрутизаторе (доступность по ping/arping, скорость шейпера, наличие правил разрешающих доступ в сеть)
  • вызывать удаленно снифер

pyzzle_agent - демон который слушает сетевой порт и работает по протоколу HTTP, поэтому проверять работоспособность можно используя браузер.

Демон ставится из SVN репозитория https://svn.pyzzle.ru/pyzzle_agent. Рекомендуемый путь к инсталляции /opt/pyzzle_agent

Note

Команда установки pyzzle_agent

cd /opt/
svn co https://svn.pyzzle.ru/pyzzle_agent

Логин/пароль для репозитория на чтение pyzzle_agent/pyzzle_agent

Для работы агента нужно создать конфигурационный файл, проще всего скопировать файл pyzzle_agent.ini.sample и поправить его под нужды конкретного сервера

В секции [server:main] указывается, какой интерфейс и порт слушать, а также параметры логирования:

host = 0.0.0.0              # что слушать
port = 8000                 # какой порт
logfile = agent_pyzzle.log  # куда писать логи
loglevel = debug            # степень детальности логов, при отладке можно ставить debug, при эксплуатации error

В секции [app:main] указываются остальные настройки агента - как и какую информацию отдавать

ip_filter=127.0.0.1 91.206.14.5 список IP адресов, которые могут обращаться к агенту, тут нужно указать адреса серверов системы, а так же сервер pyzzle.ru, с которого может осуществляться независимый мониторинг сервера, в рамках поддержки информационной системы.

Для получения данных агенту могут понадобится административные права, агента можно запускать от root или от обычного пользователя. Если запускать от обычного пользователя, то нужно в sudo разрешить запуск определенных программ этому пользователю: hddtemp iptables du sensors, чтобы агент вызывал их через sudo, в конфигурационном файле нужно установить опцию use_sudo=Yes

Сбор статистики работы сервера

При сборе данных о состоянии сервера в ходе регулярного мониторинга система отдает:

  • статистику использования CPU и оперативной памяти. Эти данные отдаются всегда

  • статистику с сетевых интерфейсов, список интерфейсов можно перечислить в параметре stat_interfaces, по умолчанию будут все интерфейсы кроме ppp.

  • состояние жестких дисков (свободное место и кол-во обращений к диску), список точек монтирования можно указать в stat_hdd_mount, по умолчанию все диски, но из результатов всегда исключается все точки монтирования начинающиеся с /dev.

    Статистика обращения к собирается со всех дисков доступных в /proc/diskstats.

  • температуру жестких дисков. Данные собираются через вызов утилиты hddtemp, список дисков указывается в параметре hddtemp_list, по умолчанию статистика не собирается.

  • температуру, напряжение, и обороты вентиляторов. Данные собираются через вызов утилиты sensors, для работы нужно, чтобы сенсоры были настроены. и по команде sensors -uA отдавались данные. Сбор данных включается указанием в конфигурационном файле check_sensors=Yes.

    Дополнительно для определенных сенсоров можно переопределить граничные значение, при выходе за пределы будет генерироваться событие в мониторинге (alert). Для этого нужно добавить параметр вида <sensor_type>_<sensor_item>=<min>-<max>

    Для температуры по умолчанию значения 20-90, а для напряжения 3-12.

    Пример переопределения:

    temperature_Core_0=50-85
    
  • счетчики с определенной цепочки firewall (iptables). Для этого в параметре stat_net_chain_name нужно указать название цепочки, с которой собирать данные.

    Note

    Рекомендуемым вариантом сбора является заведение отдельной цепочки counter и перенаправление в эту цепочку всего трафика. В самой цепочке делать разные правила либо без действия вообще, либо с действием RETURN

    Пример:

    iptables -N counter
    iptables -I FORWARD -j counter
    iptables -A counter -p tcp --dport 80 # http трафик
    iptables -A counter -s 10.0.0.0/24 -j RETURN # трафик от сети 10.0.0.0/24
    iptables -A counter -s 10.0.0.0/16 # трафик от сети 10.0.0.0/24 кроме сети 10.0.0.0/24
  • статистику MySQL сервера. Для этого в параметре stat_sql_params нужно указать параметры доступа к базе данных (хост, логин, пароль) для пользователя, который сможет выполнить SQL команду SHOW GLOBAL STATUS

  • статистику Redis сервера. Для этого в параметре redis_opts нужно указать параметры соединения с redis сервером (хост и порт, если порт отличается от стандартного (6379) )

  • статистику rrdcached сервера. Для этого в параметре rrdcached_address нужно указать параметры соединения с rrdcached сервером (хост и порт, если порт отличается от стандартного (42217) )

  • кол-во места занимаемого определенным каталогом. Для этого нужно указать в параметре du_stat каталоги, которые нужно отслеживать. Каталоги перечисляются через пробел. Можно просто перечислить пути к каталогам, можно для каталога дополнительно указать граничное значение и alias.

    Пример:

    # просто собираем данные по двум каталогам
    du_stat=/opt/billing/log /var/lib/mysql
    
    # если занятое место превысит 2G, то в мониторинге будет создано событие (alarm)
    du_stat=/opt/billing/log|2G
    
    # в мониторинге каталог /opt/billing/log будет показываться как billing_log (а не просто log, как по умолчанию)
    # 0 означает что просто собирать данные без генерации событий
    du_stat=/opt/billing/log|0|billing_log
  • контролировать запущенные процессы. Для этого в конфигурационном файле нужно указать название процесса (то как видится командой ps) и нормальное количество.

    Пример:

    # генерировать событие если количество процессов redismonitoring_daemon не равно 60
    check_process_redismonitoring_daemon=60
    
    # генерировать событие если fastcgi_daemon не запущен, или процессов больше 15
    check_process_fastcgi_daemon=1-15
    
    # в процессе можно указывать полный путь или то, как она на самом деле отображается процесс
    # если программа так видится в ps
    check_process_/usr/bin/flow-capture=1
    check_process_nginx:=1-10
  • собирать статистику по конкретному процессу. Для этого в конфигурационном файле нужно указать путь к pid файлу этого процесса. Агент будет отдавать данные по использованию процессора и памяти указанным процессом в системе

    Пример:

    process_stat_mysql=/var/run/mysqld/mysqld.pid
    process_stat_flow-capture=/var/run/flows/flowcap.pid.2055
    process_stat_redis=/var/run/redis.pid
  • собирать статистику работы демонов системы Pyzzle.ISP (сколько объектов обработано, сколько времени ушло на обработку, сколько на ожидание новых заявок, сколько на выполнение SQL запросов, сколько на обращение к внешним устройствам (по snmp например)). Для этого нужно указать каталог с pid файлам системы и перечислить список демонов про которые нужно собирать данные.

    Пример:

    daemon_pid_dir = /opt/billing/run
    daemon_list = redismonitoring accounting snmpmanagement sms

Обработка Netflow для подробной детализации

В параметрах агента нужно перечислить корневые каталоги, в которых лежать netflow файлы.

netflow_dirs = /var/netflow

Тогда agent сможет обрабатывать запросы на детализацию - разбирать сырые файлы и отдавать статистику для определенного IP адреса. Для работы необходимо, чтобы на сервере стоял пакет flow-tools и в filter.cfg были настроены фильтры для классификации трафика (входящий,исходящий)

Вызов этой функции делается основной частью системы Pyzzle.ISP. В ней нужно указать адреса агентов, которые обрабатывают netflow файлы. Это настраивается на странице “Настройка” - “Системные параметры”, вкладка Netflow, параметр “URL netflow агента”, там нужно перечислить адреса всех агентов. Значение по умолчанию http://127.0.0.1:8000/ для случая, что все хранится на одном сервере.

Если же netflow файлы занимаю много места и не умещаются на одном сервере, то можно как угодно распределить файлы по серверам, поставить на сервера pyzzle_agent. Переносить файлы можно как угодно, система будет запрашивать данные у всех агентов, и если у агента нет данных за требуемые промежуток времени или IP адрес, то агент быстро сообщит об этом, а система суммирует данные полученные со всех агентов.

Просмотр состояние абонента (IP адреса)

Агент позволяет получать данные про определенный IP адрес:

  • доступность по ping

    Агент может выполнить команду nmap для просмотра доступности конкретного IP адреса или списка, это используется основной системой при открытии страницы абонента (таблица с IP адресами клиента) или при рисовании карты дома. Настраивается это параметрами status_nmap_ping_cmd и status_nmap_ping_status_re, но значения по умолчанию вполне подходят и менять их нужно только если nmap изменит синтаксис аргументов командой строки или формат вывода.

  • доступность по arping

    Агент может выполнить команду arping2 чтобы проверить доступность IP адреса на ARP уровне. Это может использоваться при открытии страницы абонента. Для этого сервер с которого производиться сканирование должен находится в том же broadcast домене. Это может быть маршрутизатор, или выделенный сервер мониторинга, в который все абонентские VLAN заведены специально для этой цели. Определение интерфейса через который нужно делать arping выполняется автоматически.

  • определение параметров шейпинга.

    Агент может определить параметры шейпинга для конкретного IP адреса, и вернуть данные по ограничению скорости и текущей загрузки трубы.

    Чтобы определить в какой трубе шейпится нужный IP адрес агент вызовет iptables в поисках правила CLASSIFY для этого IP. Потом агент вызовет tc для просмотра состояния трубы.

    В рамках настройки этой функции нужно указать в конфигурационном файле:

    # интерфейс, где ставятся правила шейпинга входящего трафика (интерфейс к абонентам), по умолчанию eth0
    cur_speed_interface_in=eth0
    # интерфейс где ставятся правила шейпинга входящего трафика (интерфейс к интернету), по умолчанию eth1
    cur_speed_interface_out=eth1
    # что показывать в качестве скорости. по умолчанию rate, возможный вариант ceil
    tc_show_item=rate
    

    Эта функция используется на главной странице абонента, в таблице с IP адресами.

  • определение пропуска IP адреса в интернет

    Агент может проверить наличии абонента в ipset это используется на главной странице абонента, в таблице с IP адресами.

    Настройками можно гибко указать в каких set нужно проверять.

    Параметр ipset_access указывает set в котором должен присутствовать абонент если доступ в интернет ему открыт.

    Если адресное пространство у провайдера сделано так, что в одном set все абоненты не помещаются, то дополнительно в конфигурационном файле, можно указать более детально какие подсети в каких set смотреть. Делается это установкой параметра ipset_access_X_Y, где X и Y первые числа IP адреса.

    Например:

    ipset_access=inet_access
    ipset_access_10_0=inet_access_10_0
    ipset_access_10_1=inet_access_10_1
    

    В примере адрес 10.0.14.14 будет проверятся в set inet_access_10_0, адрес 10.1.2.3 в inet_access_10_1, а адрес 192.168.1.1 в inet_access. Причем у провайдера inet_access_10_0 и inet_access_10_1 это set типа ipmap, а inet_access типа iphash. Так сделано для достижения максимальной производительности.

    Дополнительно можно указать другие set, которые по логике работы firewall перекрывают основной set.

    В параметре ipset_access_force_no можно указать set, так что если IP в нем находится, то доступ однозначно закрыт (проверка в основном set даже не будет делаться). Это может использоваться если есть set в который блокируются вирусные IP адреса.

    В параметре ipset_access_force_yes можно указать set, так что если IP в нем находится, то доступ однозначно открыт. Это может использоваться если есть set в котором перечисляются адреса доступ в интернет которым открывается минуя биллинг, или биллингом но по специальным правилам. (Например IP телефония должна работать даже если услуга доступ в интернет заблокирована).

Запуск Pyzzle Agent

Запускается агент командой:

cd /opt/pyzzle_agent
./pyzzle_agent_daemon.py config_file.ini

Для перезапуска можно остановить агента командой:

killall pyzzle_agent