Знакомьтесь — Salt!

Якобы вступление…

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

На самом деле, все придумано до нас — для этого существуют системы управления конфигурацией. К ним относятся — Puppet, chef, CFEngine  и Salt.

Так как меня в первую очередь интересует простота настройки и не очень нравится RUBY (из опыта работы, а именно на нем написаны Chef и Puppet), я решил остановиться на Salt (http://www.saltstack.com).

Данная утилита проста в настройке, установке и написана на моем любимом Python.

Salt является клиент-серверной системой, конфигурация описывается в файлах конфигурации, хранится на сервере и выполняется на клиентах, в зависимости от параметров запуска.

Как вы уже поняли, Salt состоит из двух составляющих:

— salt-master — это, собственно, серверное приложение;

— salt-minion — клиент(миньон, как в мультике «Гадкий я»).

122-620x420

Вот такие у нас работники)

Установка

Показываю на CentOS, так как наш проект базируется на «шляпных системах».

На сервер, который будет служить мастером, устанавливаем мастер и миньон ( мы же хотим вносить изменения и на сам сервер тоже?!) 🙂

sam@centos1:~:19/04/14-21:04$ sudo yum -y install salt-master.noarch salt-minion.noarch

На остальные ставим только миньонов:

sam@centos2:~:19/04/14-21:10$ sudo yum -y install salt-minion.noarch

Готово! Теперь нужно указать миньонам, кто их мастер.

Чуть-чуть настройки…

Для этого нужно отредактировать файл конфигурации миньона:

sam@centos2:~:19/04/14-21:22$ sudo vim /etc/salt/minion

Находим закомментированную строчку:

Безымянный

Мастером будет…

И указываем ip-адрес мастера.

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

sam@centos2:~:19/04/14-21:29$ sudo cat /etc/salt/minion_id
webserver-1
sam@centos2:~:19/04/14-21:29$ sudo /etc/init.d/salt-minion start
Starting salt-minion daemon:                               [  OK  ]

Предварительно изменив конфигурацию миньона, запускаем и мастера, и миньона на самом сервере мастера.

 Для связи между мастером и клиентом необходимо открыть порты 4505 и 4506.

j_Q9bdZohiA

Назови меня, по имени…

Подключаем и балуемся

Для работы осталось только подключить миньонов к мастеру, а-ля —  «зарегистрировать».

Смотрим, кто хочет с нами работать, для этого используем утилиту salt-key:

Безымянный

Видим двух желающих: собственно, миньон на мастере, и миньон на вебсервере1.

Осталось добавить их. Можно добавлять по одному (параметр -a <имя миньона>), а можно все сразу(параметр -A):

sam@centos1:~:19/04/14-21:43$ sudo salt-key -L
Accepted Keys:
Unaccepted Keys:
master
webserver-1
Rejected Keys:
sam@centos1:~:19/04/14-21:43$ sudo salt-key -a master
The following keys are going to be accepted:
Unaccepted Keys:
master
Proceed? [n/Y] Y
Key for minion master accepted.
sam@centos1:~:19/04/14-21:43$ sudo salt-key -L
Accepted Keys:
master
Unaccepted Keys:
webserver-1
Rejected Keys:
sam@centos1:~:19/04/14-21:43$ sudo salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
webserver-1
Proceed? [n/Y] Y
Key for minion webserver-1 accepted.
sam@centos1:~:19/04/14-21:43$ sudo salt-key -L
Accepted Keys:
master
webserver-1
Unaccepted Keys:
Rejected Keys:

Готово! Сейчас мы можем управлять этими двумя серверами.

Магия =)

Что мы теперь можем? Давайте выполним какую-нибудь команду на обоих серверах.

К примеру, сколько времени, мистер миньон?

sam@centos1:~:19/04/14-21:49$ sudo salt "*" cmd.run "date"
master:
    Sat Apr 19 21:49:43 YEKT 2014
webserver-1:
    Sat Apr 19 21:49:41 YEKT 2014

Как все просто:)

Синтаксис очень простой — salt <имя миньона(ов)> команда параметр.

Если мы хотим выполнить на всех серверах — указываем просто «звездочку», иначе имя, или регулярное выражение(к примеру, если есть два миньона с именами web-1 и web-2, то можно указать так — «web*»)

Далее указывается команда, в данном случае — cmd.run, которая позволяет выполнить команды удаленно.

Ну и сам параметр команды.

Ниже будет вывод выполнения команды на сервере.

Просто, не так ли?

На этом пока все, в следующих статьях я покажу, как я применяю salt для базовых операций, и с помощью него контролирую сервера.

Не жизнь, а сказка =)

Не жизнь, а сказка =)