StackStorm. Управляем сервером на Ubuntu 16.04 из чата Slack и других мессенджеров
Современная разработка программ совершенно не похожа на ту, что была еще десяток лет назад, когда все сидели в одной комнате и писали на одном языке. Сегодня в приложении используются несколько языков и фреймворков. Есть дополнительные технологии, автоматизирующие тестирование, сборку и деплой, добавим сюда набирающие популярность микросервисы. Все это знать нереально, а поэтому в процессе задействуется множество специалистов, часть из которых может привлекаться временно для отдельных тасков. Более того, нередко задача стоит на стыке специальностей, и для быстрого решения требуется или универсал, или работа нескольких специалистов. В команде могут быть разработчики с разных континентов, работающие по своим часовым поясам, и иногда, чтобы справиться с простой проблемой, уходит несколько часов. В итоге на первое место выходит согласованная и эффективная работа команды, что достигается в том числе и через автоматизацию и обмен информацией.
Автоматизация всего, начиная с тестирования и развертывания ПО, позволяет не только экономить время, но и, главное, решать большинство задач неспециалисту, который выполняет сложные операции буквально одной командой, не зная ничего во внутренностях. То есть, чтобы развернуть кластер в AWS, не нужен сисадмин, достаточно выполнить плейбук Ansible. Все это лежит в основе идеологии Infrastructure as Code, заключающейся в том, чтобы описать инфраструктуру при помощи простых правил.
Для оперативного общения обычно используются чаты, и очень удобно, когда буквально вся информация, системные операции, запуск тестов и отчеты об ошибках выводятся в одном окне. Кроме прочего, это позволяет остальным видеть, как делают ту или иную операцию другие, и учиться, а в будущем выполнять те же действия самостоятельно. Это и послужило основой идеи, названной ChatOps (еще ее называют IFTTT for Ops — от if this, then that), впервые реализованной в GitHub в боте Hubot, релиз которого состоялся в 2011 году. Написанный в CoffeeScript на Node.js он из коробки позволяет выполнять и выводить результат некоторых системных команд прямо в окне чата. Поставляется Hubot с набором готовых скриптов для автоматизации популярных задач, со временем сами пользователи создали новые скрипты, еще больше расширяющие его базовые возможности. Идея постепенно становилась популярной, и сегодня есть уже больше десятка написанных на самых разных языках решений, позволяющих интегрировать самые разные инструменты и мессенджеры: Lita на Ruby, Errbot и StackStorm на Python, Nestor и Cog на JavaScript.
Проект StackStorm
StackStorm — платформа с открытым исходным кодом, которая связывает воедино инфраструктуру и приложения и позволяет автоматизировать повседневные задачи, приложения и процессы, реагировать на предопределенные события. Это может быть отправка сообщения о сбое, устранение неисправности (например, перезапуска сервиса), откат действий, перезапуск виртуальных машин на другой ноде, непрерывное развертывание и многое другое. Легко расширяемый и гибкий инструмент с большим количеством возможностей. StackStorm написан на Python, в настройках используются YAML и Jinja. Кто работал с Ansible, долго переучиваться не будет. Хотя в настройках могут использоваться и некоторые другие языки, например Python или bash.
Вся инфраструктура описывается через расширяемый набор правил, содержащих описания датчиков, триггеров и действий (actions). Датчики отслеживают входящую и исходящую информацию, при наступлении события срабатывает триггер. В простейшем случае это может быть веб-хук, предупреждение системы мониторинга Sensu, задача JIRA и так далее. Система аудита подробно регистрирует и сохраняет все действия, кто и когда что выполнил и с каким результатом. Поддерживается интеграция с системным журналом, Logstash, Splunk, statsd и другие. По умолчанию StackStorm практически не содержит никаких модулей, все расширения доступны в пакетах, которые легко устанавливаются (StackStorm предоставляет репозиторий) и интегрируются. Полный список пакетов можно найти в репозиториях: старом и новом. Их более 100, здесь и поддержка AWS, Azure, Ansible, Twitter, GitHub и Bitbucket, Nagios, Docker, Kubernetes, Jenkins, Windows и многого другого. Есть даже плагин для интеграции с IP-камерой. Модуль ChatOps официально поддерживает Yammer, IRC, HipChat, Cisco Spark, Slack и Hubot (посмотреть и настроить можно в /opt/stackstorm/chatops/st2chatops.env). Остальные необходимо подключать через внешний адаптер.
Для управления StackStorm предлагает CLI, веб-интерфейс и REST API. StackStorm распространяется по условиям Apache License, поддержка осуществляется сообществом. Кроме того, доступна коммерческая версия BWC, имеющая приоритетную поддержку, улучшенную систему контроля доступа, интеграцию с LDAP и конструктор рабочих процессов.
Установка в Ubuntu 16.04 LTS
Официально поддерживаются x64-версии Ubuntu и RHEL/CentOS. Минимально требуется сервер с Dual CPU, 2 Гбайт RAM и 10 Гбайт свободного места. Для продакшена требования чуть выше. Для работы StackStorm понадобится также nginx, MongoDB, RabbitMQ и PostgreSQL. Вариантов установки несколько. Можно использовать bash-скрипт, который сам выполнит все основные операции:
Этот вариант идеально подходит для быстрого знакомства в standalone-режиме на чистом сервере. Если на компьютере уже имеются некоторые приложения из перечисленных или порт занят, то следует устанавливать все самостоятельно из репозитория, но при этом часть операций по конфигурированию сервисов необходимо будет выполнить вручную. На сайте есть подробная документация, запутаться там очень сложно. Возможна простая установка StackStorm + Ansible + Slack, Hubot при помощи Vagrant, но, так как там запускаются две виртуальные машины, памяти на компьютере должно быть не менее 8 Гбайт. Для установки в продакшен лучше использовать плейбук для Ansible.
Все настройки StackStorm можно посмотреть в /etc/st2/st2.conf, в частности пароль для входа сохраняется в /etc/st2/htpasswd. Все файлы, в том числе и дополнительные пакеты, будут установлены в /opt/stackstorm.
Управлять можно при помощи консольной утилиты st2 или веб-интерфейса, доступного по адресу https://ip_address/ . Все параметры смотри в справке st2 -h . Чтобы выполнять команды, необходимо сформировать токен:
Сразу генерируем API-ключ, он нам понадобится позже:
Некоторое время придется потратить, чтобы изучить все базовые возможности. Получим список доступных действий, правил и триггеров:
Смотрим список action, правил и триггеров
Xakep #217. Сценарий для взломаДанные по конкретному модулю:
Подробная информация по выбранному action
Информация по выбранному триггеру:
Чтобы выполнить команду или скрипт, следует указать модуль, двойной дефис (--) или параметр cmd. В зависимости от ситуации нужно использовать разные модули.
Команда st2 execution list покажет список выполненных операций. Для более подробной информации по конкретной команде нужно взять в таблице его ID.
Пакеты предназначены для подключения дополнительных функций. Обычно они организованы для поддержки конкретного продукта или сервиса. После установки доступно несколько пакетов (core, chatops, linux pack и другие), их список можно получить, введя
Список подробных команд, реализованных пакетом, можно посмотреть так:
Информация по пакету Установленные модули в веб-интерфейсе
Команда st2 pack содержит возможность поиска. Искать можно по названию продукта, ключевому слову, автору или описанию. Например, нам нужно найти поддерживаемые чат-платформы:
В ответ получим irc, slack и cisco_spark. Кто предпочитает интерфейс, найти пакет может при помощи сервиса. Смотрим информацию по пакету:
При установке модуля некоторые сервисы st2 могут перезагружаться. Ставим пакеты:
Сразу установим алиасы. Команду для установки пакетов можно задавать через run packs.install :
Можно и просто указать конкретное правило, если все не нужны:
Файлы из репозитория можно использовать как основу для написания собственных правил. Смотрим список команд:
После установки можем запускать плейбуки Ansible.
Но самое интересное впереди.
Настройка Slack
Так как со Slack наиболее простая интеграция, будем рассматривать ее, тем более что это весьма распространенная платформа в небольших командах. Заводим аккаунт на сайте и подключаем Hubot. Для этого переходим в Apps & Integration, вводим в строке поиска Hubot и нажимаем Install. Вводим по запросу имя бота и сохраняем полученный токен, который потребуется для подключения к сервису. В самом низу будет информация о комнате, к которой подключается бот. Теперь заносим эту информацию в /opt/stackstorm/chatops/st2chatops.env. В файле несколько закомментированных секций, нужно просто внимательно пройтись по всем параметрам.
Сохраняем файл и перезапускаем сервис:
После этой команды в окне чата появится новый пользователь @xakepteam. Если все сделано правильно, его статус будет активен и ему можно отправить прямое сообщение, но он пока не подключен к общему чату. Отправляем приглашение:
Готово. Смотрим список доступных команд:
Фактически мы теперь можем отдавать серверу любые инструкции. В первую очередь это ad hoc команды Ansible. Узлы должны быть описаны в /etc/ansible/hosts.
Магии здесь никакой нет, если посмотреть в конфигурационный файл.
Собственно, все основное заключается в строке action_ref: "ansible.command_local", которая является встроенной командой модуля ansible. Для остальных алиасов, описанных далее, в подкаталоге actions содержится соответствующее описание.
Перезапускаем сервис на узле db:
Если посмотреть в actions/service_restart.yaml, то увидим такую строку:
В принципе, взяв за образец, можно очень просто написать команду для своей конкретной задачи.
Остальные алиасы также интересны. Например, смотрим статус DB-сервера и запросы в базе данных:
Смотрим версию nginx и обновляем ее на всех системах:
Из окна чата также можно ставить пакет StackStorm:
Вывод
Конечно, рассказать о таком приложении, как StackStorm, в рамках одной статьи просто невозможно. Это настоящий конструктор, который каждый настраивает под свои нужды. Конечно, некоторое время придется с ним повозиться, зато потом результат тебя не разочарует.