StackStorm — это технология, которая позволяет объединить множество инструментов админа в одном интерфейсе чата. Удобно, когда вся информация, системные операции, запуск тестов и отчеты об ошибках выводятся в одном окне, к тому же их здесь будут видеть все участники команды. Мы рассмотрим интеграцию на примере Slack, но на сайте Hubot ты можешь найти адаптеры для Telegram, Skype, Jabber и других мессенджеров, вплоть до китайского QQ.
 

Возможности StackStorm

Современная разработка программ совершенно не похожа на ту, что была еще десяток лет назад, когда все сидели в одной комнате и писали на одном языке. Сегодня в приложении используются несколько языков и фреймворков. Есть дополнительные технологии, автоматизирующие тестирование, сборку и деплой, добавим сюда набирающие популярность микросервисы. Все это знать нереально, а поэтому в процессе задействуется множество специалистов, часть из которых может привлекаться временно для отдельных тасков. Более того, нередко задача стоит на стыке специальностей, и для быстрого решения требуется или универсал, или работа нескольких специалистов. В команде могут быть разработчики с разных континентов, работающие по своим часовым поясам, и иногда, чтобы справиться с простой проблемой, уходит несколько часов. В итоге на первое место выходит согласованная и эффективная работа команды, что достигается в том числе и через автоматизацию и обмен информацией.

Автоматизация всего, начиная с тестирования и развертывания ПО, позволяет не только экономить время, но и, главное, решать большинство задач неспециалисту, который выполняет сложные операции буквально одной командой, не зная ничего во внутренностях. То есть, чтобы развернуть кластер в 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-скрипт, который сам выполнит все основные операции:

$ curl -sSL https://stackstorm.com/packages/install.sh | sudo bash -- --user=admin --password=p@ssw0rd

Этот вариант идеально подходит для быстрого знакомства в standalone-режиме на чистом сервере. Если на компьютере уже имеются некоторые приложения из перечисленных или порт занят, то следует устанавливать все самостоятельно из репозитория, но при этом часть операций по конфигурированию сервисов необходимо будет выполнить вручную. На сайте есть подробная документация, запутаться там очень сложно. Возможна простая установка StackStorm + Ansible + Slack, Hubot при помощи Vagrant, но, так как там запускаются две виртуальные машины, памяти на компьютере должно быть не менее 8 Гбайт. Для установки в продакшен лучше использовать плейбук для Ansible.

Все настройки StackStorm можно посмотреть в /etc/st2/st2.conf, в частности пароль для входа сохраняется в /etc/st2/htpasswd. Все файлы, в том числе и дополнительные пакеты, будут установлены в /opt/stackstorm.

Управлять можно при помощи консольной утилиты st2 или веб-интерфейса, доступного по адресу https://ip_address/. Все параметры смотри в справке st2 -h. Чтобы выполнять команды, необходимо сформировать токен:

$ export ST2_AUTH_TOKEN=`st2 auth -t -p p@ssw0rd admin`

Сразу генерируем API-ключ, он нам понадобится позже:

$ st2 apikey create -k
YzYwODMyZWI2YjQ1NDFkOWMyODdhN2EwMDk0YWNiYzE3YjJkNThjYzAzYjJjYzcxMmI0NTRhMzkwYTlmMmYzZQ

Некоторое время придется потратить, чтобы изучить все базовые возможности. Получим список доступных действий, правил и триггеров:

$ st2 action list --pack=core
$ st2 rule list
$ st2 trigger list
Смотрим список action, правил и триггеров
Смотрим список action, правил и триггеров

Данные по конкретному модулю:

$ st2 action get core.local_sudo
$ st2 run core.local_sudo --help
Подробная информация по выбранному action
Подробная информация по выбранному action

Информация по выбранному триггеру:

$ st2 trigger get core.st2.webhook    

Чтобы выполнить команду или скрипт, следует указать модуль, двойной дефис (--) или параметр cmd. В зависимости от ситуации нужно использовать разные модули.

$ st2 run core.local -- uname -a
$ st2 run core.local cmd="uptime"
$ st2 run core.remote hosts='localhost' -- uname -a
$ st2 run core.local_sudo -- apt update
Выполняем команды
Выполняем команды

Команда st2 execution list покажет список выполненных операций. Для более подробной информации по конкретной команде нужно взять в таблице его ID.

$ st2 execution get 58a04c451d41c843d8c5984e

Пакеты предназначены для подключения дополнительных функций. Обычно они организованы для поддержки конкретного продукта или сервиса. После установки доступно несколько пакетов (core, chatops, linux pack и другие), их список можно получить, введя

$ st2 pack list

Список подробных команд, реализованных пакетом, можно посмотреть так:

$ st2 pack get core

Информация по пакету
Информация по пакету

Установленные модули в веб-интерфейсе
Установленные модули в веб-интерфейсе

Команда st2 pack содержит возможность поиска. Искать можно по названию продукта, ключевому слову, автору или описанию. Например, нам нужно найти поддерживаемые чат-платформы:

$ st2 pack search chat

В ответ получим irc, slack и cisco_spark. Кто предпочитает интерфейс, найти пакет может при помощи сервиса. Смотрим информацию по пакету:

$ st2 pack show slack
Поиск модуля
Поиск модуля

При установке модуля некоторые сервисы st2 могут перезагружаться. Ставим пакеты:

$ st2 pack install slack ansible github

Сразу установим алиасы. Команду для установки пакетов можно задавать через run packs.install:

$ st2 run packs.install packs=st2-chatops-aliases repo_url=armab/st2-chatops-aliases

Можно и просто указать конкретное правило, если все не нужны:

$ st2 rule create aliases/ansible.yaml

Файлы из репозитория можно использовать как основу для написания собственных правил. Смотрим список команд:

$ st2 rule list --pack=st2-chatops-aliases

После установки можем запускать плейбуки Ansible.

$ st2 run ansible.playbook playbook=/etc/ansible/playbooks/nginx.yml
$ st2 run ansible.command hosts=all args='hostname -i' verbose=vv

Но самое интересное впереди.

 

Настройка Slack

Так как со Slack наиболее простая интеграция, будем рассматривать ее, тем более что это весьма распространенная платформа в небольших командах. Заводим аккаунт на сайте и подключаем Hubot. Для этого переходим в Apps & Integration, вводим в строке поиска Hubot и нажимаем Install. Вводим по запросу имя бота и сохраняем полученный токен, который потребуется для подключения к сервису. В самом низу будет информация о комнате, к которой подключается бот. Теперь заносим эту информацию в /opt/stackstorm/chatops/st2chatops.env. В файле несколько закомментированных секций, нужно просто внимательно пройтись по всем параметрам.

$ sudo nano /opt/stackstorm/chatops/st2chatops.env 

# Bot name
export HUBOT_NAME=xakepteam
export HUBOT_ALIAS='!'

# StackStorm API key
export ST2_API_KEY=YzYwODMyZWI2YjQ1NDFkOWMyODdhN2EwMDk0YWNiYzE3YjJkNThjYzAzYjJjYzcxMmI0NTRhMzkwYTlmMmYzZQ

# ST2 credentials. Fill in to use any stackstorm account.
export ST2_AUTH_USERNAME="admin"
export ST2_AUTH_PASSWORD="p@ssw0rd"

# Configure Hubot to use Slack
export HUBOT_ADAPTER="slack"
# Прописываем полученный на Slack токен
export HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu

Сохраняем файл и перезапускаем сервис:

$ sudo service st2chatops restart

После этой команды в окне чата появится новый пользователь @xakepteam. Если все сделано правильно, его статус будет активен и ему можно отправить прямое сообщение, но он пока не подключен к общему чату. Отправляем приглашение:

/invite @xakepteam

Готово. Смотрим список доступных команд:

!help

Фактически мы теперь можем отдавать серверу любые инструкции. В первую очередь это ad hoc команды Ansible. Узлы должны быть описаны в /etc/ansible/hosts.

!ansible uname -a

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

$ nano st2_chatops_aliases/aliases/ansible.yaml

---
name: "chatops.ansible_local"
action_ref: "ansible.command_local"
description: "Run Ansible command on local machine"
formats:
- display: "ansible <command>"
    representation:
    - "ansible {{ args }}"
result:
format: |
    Ansible command `{{ execution.parameters.args }}` result: {~}
    {% if execution.result.stderr %}*Stdout:* {% endif %}
    ```{{ execution.result.stdout }}```
    {% if execution.result.stderr %}*Stderr:* ```{{ execution.result.stderr }}```{% endif %}
extra:
    slack:
color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}"

Собственно, все основное заключается в строке action_ref: "ansible.command_local", которая является встроенной командой модуля ansible. Для остальных алиасов, описанных далее, в подкаталоге actions содержится соответствующее описание.

Перезапускаем сервис на узле db:

!service restart "mysqld" on "db"

Если посмотреть в actions/service_restart.yaml, то увидим такую строку:

"/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts|replace('http://','')}} --become --module-name=service --args='name={{service_name}} state=restarted'"

В принципе, взяв за образец, можно очень просто написать команду для своей конкретной задачи.

Остальные алиасы также интересны. Например, смотрим статус DB-сервера и запросы в базе данных:

!show mysql processlist
!status 'db'

Смотрим версию nginx и обновляем ее на всех системах:

!show version 'nginx' on 'all'
!update 'nginx' on 'all'
!show nginx stats on 'all'

Из окна чата также можно ставить пакет StackStorm:

!pack install https://github.com/armab/st2_chatops_aliases
 

Вывод

Конечно, рассказать о таком приложении, как StackStorm, в рамках одной статьи просто невозможно. Это настоящий конструктор, который каждый настраивает под свои нужды. Конечно, некоторое время придется с ним повозиться, зато потом результат тебя не разочарует.

Оставить мнение