В базовой установке Gearman в ubuntu 14.04 есть баг - инит-скрипт написан не правильно и в результате Gearman не реагирует наличие конфиг файла и запускается с настойками по умолчанию. Причем, на одном из серверов у меня проблемма после обновления усугубилась и он перестал запускаться даже с настройками по умолчанию.
Есть два варианта решения проблемы:
- Пропатчить инит-скрипт, как это сделать можно прочитать здесь
- Запускать его из под supervisord.
У меня все приложения крутятся под supervisor, так что я пошел этим путем.
Минимальный конфиг файл для супервизора:
[program:gearmand]
command=/usr/sbin/gearmand -L 127.0.0.1 --user=gearman --log-file=stderr
autorestart=true
autostart=true
-L 127.0.0.1
указано, во первых, что-бы gearman не биндился на внешние интерфейсы (там все закрыто фаирволом, но все же). Во вторых - если на машине включен ipv6, но не настроен, то gearman будет пытаться забиндиться и на ipv6 и падать.
З.Ы. инит для supervisord в 14.04 тоже кривой, но это уже другая история.
В жизни каждого человека настает момент когда ему становится лениво делать одно и то же на удаленных серверах и хочется автоматизации.
В решении этой тяжелой жизненной проблемы нам поможет R(?)ex.
Небольшой F.A.Q
Что это?
Это приложение для управления удаленными(и не очень) серверами и приложениями.
Я могу просто написать bash/perl/pithon/ruby/etc-скрипт и он сделает то же самое.
Несомненно, но это будет очередное изобретение велосипеда с колесами разной степеньи квадратности.
Почему не Puppet/Ansible?
Потому что здесь про Perl, но сравнение Rex и Ansible я еще сделаю.
Поехали
Во первых, Rex можно использовать для простого запуска команд на удаленном сервере:
rex -H "example.com example.ru" -e "say run 'uptime'"
Задачи выполняются последовательно, так что придется подождать пока опросятся все сервера, особенно если их много.
Запуск из консоли это вариант если надо что-то и единоразово посмотреть что там на серверах творится. Но постоянно набирать команды в консоли это решение для сильных духом и памятью.
Мы же как, настоящие программисты, будем осваивать командные файлы.
По умолчанию Rex использует файл под названием Rexfile (удивительное совпадение).
Попробуем сделать что-то полезное.
Создадим Rexfile который будет содержать команду deploy
. По этой команде Rex пойдет на удаленный сервер и сделает там git pull
для сайта. Простейшний вариант деплоя.
use Rex -feature => ['1.0'];
user "myuser";
private_key "/home/myuser/.ssh/id_rsa";
public_key "/home/myuser/.ssh/id_rsa.pub";
key_auth;
group myservers => "example.ru";
desc "Deploy the blog on example.ru";
task "deploy", group => "myservers", sub {
run "cd /srv/www/example.ru && git pull origin gh-pages";
};
Теперь можно сказать: rex deploy
Дальше Rex залогинится под пользователем "myuser" с использованием указанных ключей и выполнит команду указанную в опции run. Если пользователь на удаленном сервер совпадает с текущим - то первую секцию можно опустить. Будет использоваться текущий пользователь и его настройки ключей для ssh. Но если планируется использование команды через cron - то указывать надо обязательно, иначе ничего работать не будет.
Так же можно обновлять конфигурацию копируя на хосты необходимые файлы (вы же не храните авторизационные данные в Git, правда?)
приведем содержимое раздела task к виду:
run "cd /srv/www/example.ru && git pull origin gh-pages";
file "/srv/www/example.ru/test.conf",
source => "files/test.conf";
Теперь при выполнении rex deploy
будет выполнен pull
из репозитория на удаленном сервере, а затем туда будет скопирован файл files/test.conf
.
В принципе, этого совершенно достаточно для деплоя простого сайта не требующего перезапуска сервисов. Таким скриптом деплоится этот блог. Пошаговый мануал о том, как сделать настройку сервера с нуля до продакшена одной командой будет в следующей статье.
А те кому не хочется ждать - могут почитать официальную документацию, она весьма подробная и с хорошими примерами.