| 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 добавляем секцию с описанием скрипта: |