598 | | На данном этапе у нас настроен переход сервера из резерва в активное состояние по единственному критерию - недоступности мастера, определяемой по протоколу VRRP. Теперь добавим сюда контроль работоспособности !FreeSwitch. Для этого создаем следующий скрипт: |
599 | | |
600 | | {{{#!perl |
601 | | #!/usr/bin/perl |
602 | | |
603 | | my $password = "secret"; |
604 | | my @required = ("internal"); |
605 | | |
606 | | my %saw = (); |
607 | | open(my $in, "-|") || exec("/usr/bin/fs_cli", "-p$password", "-x", "sofia xmlstatus"); |
608 | | while ( defined(my $line = <$in>) ) |
609 | | { |
610 | | if ( $line =~ m|<name>(.*)</name>|o ) |
611 | | { |
612 | | $saw{$1} = 1; |
613 | | } |
614 | | } |
615 | | close($in); |
616 | | |
617 | | foreach my $profile ( @required ) |
618 | | { |
619 | | if ( ! $saw{$profile} ) |
620 | | { |
621 | | exit(1); |
622 | | } |
623 | | } |
624 | | |
625 | | exit(0); |
626 | | }}} |
627 | | |
628 | | где "secert" заменяем на пароль доступа к event-socket !FreeSwitch-сервера, а массиву "@required" присваиваем имена SIP-профилей, наличие которых необходимо контролировать. Теперь, если все перечисленные в @required профили запущены, скрипт вернет 0, иначе - 1. Проверпим его функционирование, запустив вручную. Если все хорошо, укажем keepalived проверять работоспособность !FreeSwitch каждые 10 секунд. Для этого в /etc/keepalived/keepalived.conf добавляем секцию с описанием скрипта: |
| 598 | На данном этапе у нас настроен переход сервера из резерва в активное состояние по единственному критерию - недоступности мастера, определяемой по протоколу VRRP. Теперь добавим сюда контроль работоспособности !FreeSwitch. Для этого создаем скрипт /etc/keepalived/ka-status.sh: |
| 599 | |
| 600 | {{{#!sh |
| 601 | #!/bin/sh |
| 602 | |
| 603 | password="secret"; |
| 604 | profiles="internal internal6"; |
| 605 | |
| 606 | # Если виртуальный адрес еще не поднят, возвращаем успех. |
| 607 | arping -q -c3 -W0.1 192.168.0.63 || exit 0 |
| 608 | |
| 609 | # Если виртруальный адрес поднят, проверяем работоспособность FreeSwitch |
| 610 | RESULT=`/usr/bin/fs_cli -p$password -x "sofia xmlstatus"` |
| 611 | |
| 612 | for P in $profiles; do |
| 613 | echo $RESULT | grep -q "<name>$P</name>" || exit 1 |
| 614 | done |
| 615 | |
| 616 | exit 0; |
| 617 | }}} |
| 618 | |
| 619 | где "secert" заменяем на пароль доступа к event-socket !FreeSwitch-сервера, а переменной {{{profiles}}} присваиваем имена SIP-профилей, наличие которых необходимо контролировать. Теперь, если все перечисленные в {{{profiles}}} профили запущены, скрипт вернет 0, иначе - 1. |
| 620 | |
| 621 | Если требуется контролировать только один профиль, скрипт можно сделать более лаконичным: |
| 622 | |
| 623 | {{{#!sh |
| 624 | #!/bin/sh |
| 625 | |
| 626 | password="secret"; |
| 627 | profile="internal"; |
| 628 | |
| 629 | # Если виртуальный адрес еще не поднят, возвращаем успех. |
| 630 | arping -q -c3 -W0.1 192.168.0.63 || exit 0 |
| 631 | |
| 632 | # Если виртруальный адрес поднят, проверяем работоспособность FreeSwitch |
| 633 | /usr/bin/fs_cli -p$password -x "sofia xmlstatus" | grep -q "<name>${profile}</name>" || exit 1 |
| 634 | |
| 635 | exit 0; |
| 636 | }}} |
| 637 | |
| 638 | arping в начале скрипта нужен для разрешения проблемы яйца и курицы: keepalived не перейдет в состояние MASTER и не поднимет на сетевом интерфейсе виртуальный адрес, пока наш скрипт не вернет 0, в то же время профиль !FreeSwitch не сможет стартовать, пока в сети не поднят виртуальный адрес, так как именно этот адрес используется для подключения к базе данных. Благодаря строчке с arping при включении первого из двух серверов, когда виртуального адреса еще нет, скрипт вернет 0, keepalived успешно перейдет в состояние MASTER и активирует виртуальный адрес. |
| 639 | |
| 640 | Проверим функционирование скрипта, запустив его вручную. Если все хорошо, укажем keepalived проверять работоспособность !FreeSwitch каждые 10 секунд. Для этого в /etc/keepalived/keepalived.conf добавляем секцию с описанием скрипта: |