flow-tools, как не распарсить вывод.

Понадобилось найти статистику по адресам, статистики в nfsen не было.
В общем получил два таких файла:
[gg@localhost ~]$ ls ft-v05.2014-01-29.123001+0400
ft-v022014-01-29.12232001+0400
[tarasko@localhost ~]$ ls ft-v05.2012-01-29.122020+0400
ft-v05.2014-01-22124000+0400
Эта стата собиралась с помощью flow-tools, и посмотреть её можно тоже с помощью flow-tools
flow-cat – Concatenate flow files, обрабатывает данные в flow формате.
flow-nfilter – фильтрует потоки (flow)
flow-print – печатает в удобоваримом виде.
Фильтры для nfilter можно настроить здесь:
cat /etc/flow-tools/cfg/filter.cfg
filter-primitive gray-prefix //название первого условия
type ip-address-prefix //фильтруем по префиксу
permit 10.20.0.0/15 //определяем сам префикс
default deny //остальное запретить

filter-primitive mail //название второго условия
type ip-address //тип – ip-адрес
permit 94.100.180.150 //применяем к адресу
permit 217.69.139.150 //и к этому

filter-definition icf //название фильтра
match ip-source-address gray-prefix //фильтруем по источнику
match ip-destination-address mail //фильтруем по назначению.

Результирующая строка должна выглядеть следующим образом:

flow-cat /home/gg/ft-v05.2012-01-29.124000+0200 |flow-nfilter -F icf | flow-print -f5 //”-F icf – имя фильтра” “-f5 – время начала и конца flow”

Правда у меня такая конструкция не заработала, возможно я неправильно описал фильтр. Буду разбираться дальше.

Ansible, Mikrotik. Часть первая

Продолжаю мучть ansible. Начало здесь.
Пробовал сегодня делать шаблоны. Пока не всё получается, но всё же опишу то, что удалось сделать.
Во первых, для будущего проекта создам роль, ансибл будет смотреть в директории этой роли. Следуя документации получается следующая иерархия:
Домашняя директория:
ansible# pwd
/etc/ansible
Создаю директорию role:
mkdir roles
cd roles
В ней:
roles]# ls -R
.:
router //пока единственная роль router

./router:
site.yml  tasks  templates  vars

./router/tasks:
main.yml

./router/templates:
hotspot.j2

./router/vars:

site.yml – “главный” файл, отсюда запускаю генератор шаблонов.
[root@localhost router]# cat site.yml

– name: Generate configuration files
vars_files: #файлы с переменными
– vars/hotspots
– vars/ap-1
hosts: localhost #где запускаю сценарий

roles: # какие включаю роли.
– router

tasks/main.yml – отсюда запускаю собственно генератор:
[root@localhost router]# cat tasks/main.yml

– name: Generate configuration files
template: src=hotspot.j2 dest=/home/tarasko/”{{ hostname }}”.src //Двойные кавычки нужны для экранирования специального символа {

templates/hotspot.j2 – здесь расположен сам шаблон:
cat templates/hotspot.j2
set [ find default-name=wlan1 ] adaptive-noise-immunity=ap-and-client-mode \
band=2ghz-b/g/n channel-width=20/40mhz-Ce country=”united states” \
default-forwarding=no disabled=no distance=indoors frequency={{ freq }} \
frequency-mode=superchannel hw-protection-mode=rts-cts hw-retries=15 mode=\
ap-bridge radio-name=”” scan-list=2400-2500 ssid={{ ssid_name }} tx-power={{ tx_power }} \
tx-power-mode=card-rates wireless-protocol=802.11
/interface bridge
add mtu=1500 name={{ wifi_bridge }} protocol-mode=none
/ip neighbor discovery
set ether1 discover=no
set ether2 discover=no
set ether3 discover=no
set ether4 discover=no
set ether5 discover=no
set wlan1 discover=no
set wifi discover=no
/interface vlan
add interface={{ uplink_interf }} name={{ wifi_vlan_name }} vlan-id={{ wifi_vlan_id }}
add interface={{ uplink_interf }} name={{mgmt_vlan_name}} vlan-id={{ mgmt_vlan_id }}
/ip neighbor discovery
set public_wifi discover=no
/interface wireless security-profiles
set [ find default=yes ] supplicant-identity=MikroTik
/ip ipsec proposal
set [ find default=yes ] enc-algorithms=3des
/snmp community
set [ find default=yes ] read-access=no
add addresses={{snmp_server_1}},{{snmp_server_2}} name={{ snmp_community }}
/system logging action
set 3 bsd-syslog=yes remote={{ syslog_server }} src-address=10.230.5.14 \
syslog-facility=local3
/interface bridge port
add bridge=wifi interface=public_wifi
add bridge=wifi interface=wlan1
/ip address
add address={{ip_address}}/{{mask}} interface={{ mgmt_vlan_name }} network={{ network }}
/ip route
add distance=1 gateway={{ gateway }}
/ip service
set telnet disabled=yes
set ftp disabled=yes
set www disabled=yes
set ssh address={{ mgmt_address }}
set api disabled=yes
set winbox address={{ mgmt_address }}
/snmp
set enabled=yes location={{hostname}}
/system clock
set time-zone-autodetect=no
/system clock manual
set time-zone={{ time_zone }}
/system identity
set name={{hostname}}
/system logging
add action=remote topics=wireless
/system ntp client
set enabled=yes primary-ntp={{ ntp1 }} secondary-ntp={{ ntp2 }}

В {{}} распологаются переменные.

Переменные определяю в
/etc/ansible/group_vars/hotspots //здесь переменные для группы
/etc/ansible/host_vars/ap-1 //здесь переменные для хоста
Переменные для группы будут перезаписаны одинаковыми переменными для хоста.

cat ap-1

hostname: NewStreet_Bar
ip_address: 10.10.5.110
mask: 24
uplink_interf: ether1

[root@localhost router]# cat /etc/ansible/group_vars/hotspots

ntp1: 10.10.8.200
ntp2: 10.10.8.201
mgmt_vlan_id: 149
wifi_vlan_id: 170
mgmt_vlan_name: public_wifi_mgmt
wifi_vlan_name: public_wifi
wifi_bridge: wifi
uplink_interf: ether1
ssid_name: Operator_FREE
default_route: 0.0.0.0/0
default_gateway: 10.10.5.1
tx_power: 27
freq: 2422
snmp_community: strongcommunity
snmp_server_1: 10.10.8.2
snmp_server_2: 10.10.8.3
syslog_server: 10.10.8.24
network: 10.10.5.0
mask: 24
gateway: 10.10.5.1
mgmt_address: 10.10.8.0/24
time_zone: +03:00

Запускаю site.yml
[root@localhost router]# ansible-playbook site.yml

PLAY [Generate configuration files] *******************************************

GATHERING FACTS ***************************************************************
ok: [localhost]

TASK: [router | Generate configuration files] *********************************
changed: [localhost]

PLAY RECAP ********************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=0

Конфиг записывается в соответствующий файл, указанный в таске.
Что сделать дальше:
-научиться делать циклы в шаблоне.
-генерация файлов с переменными в шаблоне с помощью сторонних скриптов, или тем же ансиблом.
-научиться собирать данные из БД.

Ansible, Mikrotik, Начало.

Давно хотел попробовать ansible – инструмент по автоматизации. Вообще сейчас он заточен больше под управление серверами, но плюсом является то, что на управляемой системе не нужен клиент, что естественно важно для сетевых устройств (маршрутизаторы, коммутаторы и т.д.)

И так получилось, что встала передо мной задача по настройке 16 микротиков в одной подсети управления, на которых должна быть однотипная конфигурация. В общем я решил что это хороший повод немножко уменьшить количество рутины:)
Устанавливаю ansible:
yum install ansible

Настраиваю хосты, которыми буду управлять:
ansible]# cat /etc/ansible/hosts
[local]
localhost    ansible_connection=local
[hotspots]
10.10.5.2    anisble_connection=paramiko    ansible_ssh_user=ansible
10.10.5.3    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.4    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.5    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.7    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.9    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.10    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.11    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.12    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.14    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.15    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.16     anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.18    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.19    anisble_connection=paramiko     ansible_ssh_user=ansible
10.10.5.20    anisble_connection=paramiko     ansible_ssh_user=ansible

paramiko – либа для питона, микротики только с ней отрабатывают нормально по SSH. Дальше пришлось поработать руками – добавить на микротики ssh-ключ и создать пользователя ansible, а также обновить routeros, без этого ключ импортироваться не хотел. Как создать ключ можно посмотреть в инете.
Дальше необходимо написать playbook. Playbook – набор сценариев на языке YAML.
cat /etc/ansible/mikrotik.yml
– – –
– name: Test
hosts: hotspots #Имя группы хостов
serial: 1 #количество систем, котоые будут обрабатываться одновременно
connection: paramiko #тип соединения, по идее уже указан в hosts
user: ansible #пользователь, тоже указан в hosts
gather_facts: no # Перед работой с хостом ансибл собирает с него инфу с помощью питона, естественно на микротике это работать не будет, так что эту фичу выключаем
tasks: #Выполняем нашу задачу
– name: enable our community
raw: /snmp community add addresses=10.100.10.2,10.100.10.3 name=somestrongcommunity #включаю нужное комьюнити. raw – “чистая строка”
– name: disable public
raw: /snmp community set public read-access=no write-access=no #выключаю паблик на чтение и запись
– name: enable snmp
raw: /snmp set enabled=yes #Включаю snmp

Ну и запускаем наш сценарий:
$ ansible-playbook -v /etc/ansible/mikrotik.yml
-v – verbose mode

PLAY RECAP ********************************************************************
10.10.5.10                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.11                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.12                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.14                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.15                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.18                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.19                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.2                 : ok=6    changed=0    unreachable=0    failed=0
10.10.5.20                : ok=6    changed=0    unreachable=0    failed=0
10.10.5.3                 : ok=6    changed=0    unreachable=0    failed=0
10.10.5.4                 : ok=6    changed=0    unreachable=0    failed=0
10.10.5.5                 : ok=6    changed=0    unreachable=0    failed=0
10.10.5.7                 : ok=6    changed=0    unreachable=0    failed=0
10.10.5.9                 : ok=6    changed=0    unreachable=0    failed=0

Так же здесь выводится некий плохо читаемый аутпут, над этим надо поработать.
В общем это начало, надо научиться писать сложные сценарии с условиями и генерировать конфиги.Дальше в планах запилить конфигуратор шаблонов для этих хотспотов, а так же сделать проверку настроек.

p.s.Так же считаю что нужно сделать контроль за изменениями – проверка параметров перед изменениями – изменение – проверка изменений – запись в change log на гитхаб например.

p.p.s. что там с телнетом я не знаю, может ли ансибл с ним работать то же хз. Во всяком случае работать с ключами удобнее, правда в IOS ключи поддерживаются с 15 версии.