Ansible и ChatOps при помощи StackStorm, Slack и Hubot

Что такое ChatOps?


ChatOps все еще свежее и редкое явление в мире DevOps, когда работа с инфраструктурой переносится в общий чат. Вы можете запускать команды прямо из чата, при этом разработчики/сисадмины видят что происходит в режиме реального времени, могут просматривать историю изменений, запускать свои команды, поддерживать коммуникацию вокруг работы и даже обмениваться опытом. Таким образом информация и рабочий процесс принадлежит всей команде — а это несет в себе много преимуществ.

Можно придумать такие вещи как деплой кода или развертывание серверов из чата, просмотр графиков мониторинга, отправку SMS, управление кластерами или просто запуск shell команд. ChatOps может быть высокоуровневым представлением вашей действительно сложной CI/CD системы, неся простоту с помощью команды в чате вроде: !deploy <that thing>. Такой подход делает чудеса для улучшения видимости и снижения сложности вокруг процесса развертываний.


Улучшенный ChatOps


StackStorm — OpenSource проект с особым вниманием к автоматизации и ChatOps. Платформа связывает то огромное количество существующих DevOps инструментов вроде управления конфигурацией, мониторинга, графиков, оповещения итд. вместе, позволяя править всем из единого контрольного пункта. И это идеально с точки зрения ChatOps, — можно создавать и автоматизировать мыслимые и немыслимые рабочие процессы, контролируя любые наборы инструментов прямо из чата.

Недавно StackStorm добавили поддержку Ansible и дополнительные ChatOps возможности, открывая дорогу для реального применения ChatOps, не просто постинг фотографий забавных котиков с помощью бота. В этом материале мы расскажем как заставить работать ChatOps и Ansible с помощью StackStorm платформы.
Кстати, StackStorm как и Ansible декларативен, написан на Python и использует Yaml + Jinja, что позволит вам легче во всем разобраться.


План


Вначале мы собираемся установить контрольную машину, которая будет работать под Ubuntu. Затем мы настроим на ней StackStorm платформу, в том числе пакеты управления Ansible и ChatOps фреймворком Hubot. И наконец, мы подключим всю систему к Slack чату, и покажем несколько простых, но реальных примеров интерактивного использования Ansible.

Давайте начнем, а заодно проверим как далеко мы зашли и наступила ли технологическая сингулярность, давая root доступ каким-то чат ботам и позволяя им управлять нашими 100+ серверами или даже датацентрами (кстати RackSpace работают с ChatOps).

Шаг 0. Подготовка Slack


Как уже было сказано, мы будем использовать Slack.com как чат платформу (хотя доступны другие интеграции). Зарегистрируйте Slack аккаунт, если у вас его еще нет. Включите интеграцию Hubot в настройках.
Hubot — фреймворк бота от GitHub, созданный специально для ChatOps

Включите Hubot интеграцию в Slack
В итоге Slack выдаст вам API токен вроде:
HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu

Далее мы настроим StackStorm платформу, покажем реальные примеры использования, и конечно же, расскажем как создать собственные ChatOps команды.
Но подождите, есть простой способ!

Для самых ленивых


Для тех кто ленив (большинство DevOps разработчиков такие), есть специально подготовленный репозиторий с Vagrant, который установит все необходимое с помощью простейших bash скриптов, доставив вас с линии старта прямо на финиш, давая возможность после автоматической установки сразу запускать ChatOps команды из Slack чата showcase-ansible-chatops:
# Замените на свой токен
export HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu
git clone https://github.com/StackStorm/showcase-ansible-chatops.git
cd showcase-ansible-chatops
vagrant up

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

Шаг 1. Установка StackStorm


Установка проста. Всего 1 команда:
curl -s https://downloads.stackstorm.net/releases/st2/scripts/st2_deploy.sh latest | sudo bash

Имейте ввиду, это для демонстрационных целей. При развертывании продакшена используйте Ansible, сверяйте подписи и не доверяйте установочным командам в одну строчку!

После завершения установки (а StackStorm тянет кучу Python пакетов, RabbitMQ, PostgreSQL, MongoDB, OpenStack), для простоты демонстрации отключите механизм StackStorm авторизации в файле: /etc/st2/st2/conf. Можно выставить в секции [auth] вручную enable = False, либо воспользоваться магическим хаком:
sudo sed -i '/^\[auth\]$/,/^\[/ s/^enable = True/enable = False/' /etc/st2/st2.conf

Далее перезагрузим StackStorm:
sudo st2ctl restart


Шаг 2. Установка StackStorm плагинов: Ansible и Hubot


Поставим необходимые плагины от StackStorm, связывающие Ansible и Hubot:
sudo st2 run packs.install packs=hubot,ansible register=all

Кроме самих пакетов, будет еще установлен и сам Ansible в Python virtualenv: /opt/stackstorm/virtualenvs/ansible/bin

Шаг 3. Установка Hubot


Установим Hubot и плагины: Slack и StackStorm, позволяющие запускать команды в Slack чате и перенаправлять их в st2. Цепочка выглядит так:
Slack -> Hubot -> StackStorm -> Ansible

Redis — место, где Hubot держит свои мозги. Понимайте как хотите, но мозги нам нужны:
sudo apt-get install build-essential redis-server

Hubot сделан на Nodejs, необходимая зависимость:
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -
sudo apt-get install nodejs

Установка самого Hubot:
sudo npm install -g hubot coffee-script yo generator-hubot

Создадим персональную hubot сборку из-под stanley linux юзера (он ранее был создан StackStorm). В будущем мы будем запускать бота с правами stanley:
sudo mkdir -p /opt/hubot
sudo chown stanley:stanley /opt/hubot
sudo -H -u stanley bash -c 'cd /opt/hubot && echo "n" | yo hubot --name=stanley --description="Stanley StackStorm bot" --defaults'

Установим npm плагины hubot-stackstorm и hubot-slack:
sudo -H -u stanley bash -c 'cd /opt/hubot && npm install hubot-slack hubot-stackstorm --save'

Для того чтобы hubot-stackstorm подгружался при старте бота, добавьте запись hubot-stackstorm в файл: /opt/hubot/external-scripts.json:
sed -i 's/.*\[.*/&\n  "hubot-stackstorm",/' /opt/hubot/external-scripts.json

И наконец, можно запускать бота (не забудьте заменить API токен на свой):
cd /opt/hubot && HUBOT_SLACK_TOKEN=xoxb-5187818172-I7wLh4oqzhAScwXZtPcHyxCu ST2_WEBUI_URL=http://chatops:8080 PORT=8181 bin/hubot --name "stanley" --adapter slack --alias !


Шаг 4. Первый ChatOps опыт


На данном этапе Stanley бот должен быть онлайн в чате. Чтобы пригласить его в определенную Slack комнату:
/invite @stanley

Получить список доступных команд:
!help

Наверняка вам понравится:
!ship it

Вдоволь наигравшись с существующими командами, займемся действительно серьезными вещами.

Шаг 5. Создание собственных ChatOps команд


Одна из возможностей StackStorm — это способность создавать простые алиасы/обертки вокруг команд, упрощая работу с ChatOps. Вместо того чтобы набирать длинную команду, вы можете просто забиндить ее на что-то более дружественное и легкое, синтаксический сахар.

Итак, создадим свой собственный StackStorm пак который будет содержать нужные нам команды. Форкните StackStorm template pack на GitHub. Наш первый action alias /aliases/ansible.yaml:
---
name: "chatops.ansible_local"
action_ref: "ansible.command_local"
description: "Run ansible command on local machine"
formats:
  - "ansible {{args}}"

Для справки: вышеуказанный алиас использует ansible st2 integration pack

Отправляем изменения в недавно созданный GitHub репозиторий и можно устанавливать наш пак. Для этого уже есть ChatOps алиас:
!pack deploy st2-ansible-aliases repo_url=armab/st2-ansible-aliases

где repo_url — ваш github репозиторий.

Теперь можно запускать простые Ansible ad-hoc команды прямо из Slack чата:
!ansible "uname -a"

Запуск ansible команд - ChatOps
На низком уровне это тоже самое что:
/opt/stackstorm/virtualenvs/ansible/bin/ansible all --connection=local --args='uname -a' --inventory-file='127.0.0.1,'

Но давайте рассмотрим более полезные примеры интерактивного ChatOps.

Пример 1. Получаем статус серверов


У Ansible есть ping модуль который подключается к хостам и возвращает pong в случае успеха. Простой, но мощный пример, позволяющий понять состояние серверов прямо из чата за считанные секунды без необходимости заходить в терминал.

Для этого создадим в нашем паке action, запускающий реальную команду и action alias, являющийся синтаксическим сахаром для экшна и позволяющий создать такую ChatOps конструкцию:
!status 'web'

Action actions/server-status.yaml:
---
name: server_status
description: Show server status by running ansible ping ad-hoc command
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    description: "Run command with sudo"
    type: boolean
    immutable: true
    default: true
  kwarg_op:
    immutable: true
  cmd:
    description: "Command to run"
    type: string
    immutable: true
    default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts}} --module-name=ping"
  hosts:
    description: "Ansible hosts to ping"
    type: string
    required: true

Кстати, кроме bash скриптов, Action может работать с Python runner, — здесь вся гибкость использования.


Action alias aliases/server_status.yaml:
---
name: chatops.ansible_server_status
action_ref: st2-chatops-aliases.server_status
description: Show status for hosts (ansible ping module)
formats:
- "status {{hosts}}"

Убедитесь, что вы добавили нужные хосты в Ansible inventory файл: /etc/ansible/hosts

После отправки кода в репозиторий, не забудьте перезагрузить ваш пак из чата:
!pack deploy st2-chatops-aliases repo_url=armab/st2-chatops-aliases

Очень удобно что мы можем хранить все наши ChatOps настройки в виде st2 пака и подхватывать изменения из репозитория, — инфраструктура как код. Результат только что созданной команды в Slack:
Показать статус серверов - ChatOps

Это действительно удобно, даже ваш CEO может посмотреть статус не имея доступа к серверам! С таким подходом общение, развертывание и работа вокруг инфраструктуры может происходить прямо в чате: находитесь ли вы в офисе или работаете удаленно (некоторые из нас могут работать прямо с пляжа).

Пример 2. Перезагрузка сервисов


С вами когда-то случалось так, что простая перезагрузка сервиса помогала? Не идеальный способ, но зачастую быстрое решение просто необходимо. Давайте создадим ChatOps команду которая бы перегружала указанный сервис на определенных серверах.
Задача получить такую конструкцию:
!service restart "gearmand" on "MQ-server"

Для этого в уже существующем st2 паке создайте actions/service_restart.yaml:
---
name: service_restart
description: Restart service on remote hosts
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    description: "Run command with sudo"
    type: boolean
    immutable: true
    default: true
  kwarg_op:
    immutable: true
  cmd:
    description: "Command to run"
    type: string
    immutable: true
    default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts}} --become --module-name=service --args='name={{service_name}} state=restarted'"
  hosts:
    description: "Ansible hosts"
    type: string
    required: true
  service_name:
    description: "Service to restart"
    type: string
    required: true

ChatOps алиас aliases/service_restart.yaml:
---
name: chatops.ansible_service_restart
action_ref: st2-chatops-aliases.service_restart
description: Restart service on remote hosts
formats:
  - "service restart {{service_name}} on {{hosts}}"

Результат:
Перезагрузка MySQL сервиса на удаленных серверах - ChatOps
И знаете что? Благодаря мобильному приложению Slack вы можете перезагружать сервисы прямо с вашего телефона!

Пример 3. MySQL processlist


Мы хотим создать простую Slack команду, которая бы отображала список выполняемых SQL запросов на MySQL сервере:
!show mysql processlist

Action actions/mysql_processlist.yaml:
---
name: mysql_processlist
description: Show MySQL processlist
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    immutable: true
    default: true
  kwarg_op:
    immutable: true
  cmd:
    description: "Command to run"
    type: string
    immutable: true
    default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{ hosts }} --become --become-user=root -m shell -a \"mysql --execute='SHOW PROCESSLIST;' | expand -t 10\""
  hosts:
    description: "Ansible hosts"
    type: string
    default: db

Action alias для ChatOps: aliases/mysql_processlist.yaml:
---
name: chatops.mysql_processlist
action_ref: st2-chatops-aliases.mysql_processlist
description: Show MySQL processlist
formats:
  - "show mysql processlist {{hosts=db}}"

Заметьте, что мы сделали hosts параметр опциональным (db по умолчанию), так что эти две команды эквивалентны:
!show mysql processlist
!show mysql processlist 'db'

Показать список выполняемых SQL запросов - ChatOps
Ваш DBA будет счастлив!

Пример 4. Получаем HTTP статистику из nginx


Мы хотим получить массив HTTP статус кодов из nginx лога, отсортировать их в зависимости от количества и красиво отобразить в чате, чтоб понять как много 200 или 50x ошибок на веб серверах, находятся ли они в пределах нормы или нет:
!show nginx stats on 'web'

Для этого создадим action, который запускает bash команду, actions/http_status_codes.yaml:
---
name: http_status_codes
description: Show sorted http status codes from nginx logs
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    immutable: true
    default: true
  kwarg_op:
    immutable: true
  cmd:
    description: "Command to run"
    type: string
    immutable: true
    default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{ hosts }} --become -m shell -a \"awk '{print \\$9}' /var/log/nginx/access.log|sort |uniq -c |sort -k1,1nr 2>/dev/null|column -t\""
  hosts:
    description: "Ansible hosts"
    type: string
    required: true

Alias aliases/http_status_codes.yaml:
---
name: chatops.http_status_codes
action_ref: st2-chatops-aliases.http_status_codes
description: Show sorted http status codes from nginx on hosts
formats:
  - "show nginx stats on {{hosts}}"

Спасибо Brian Coca, Ansible core разработчику за великолепную идею!

Показать список nginx статус кодов на серверах - ChatOps
Все больше и больше это выглядит как контрольный центр управления полетами. Вы можете запускать целые цепочки команд на серверах прямо из чата и каждый может видеть результат в режиме реального времени. Отлично!

Пример 5. Security patching


Представьте что вам необходимо срочно устранить очередную критическую уязвимость вроде Shellshock. Для этого надо обновить bash на всех серверах. Ansible пожалуй идеальный инструмент для таких операций. Но вместо запуска однострочной ansible команды, давайте создадим добротный playbook:
playbooks/update_package.yaml:
---
- name: Update package on remote hosts, run on 25% of servers at a time
  hosts: "{{ hosts }}"
  serial: "20%"
  sudo: yes
  tasks:
    - name: Check if Package is installed
      command: dpkg-query -l {{ package }}
      register: is_installed
      failed_when: is_installed.rc > 1
      changed_when: no

    - name: Update Package only if installed
      apt: name={{ package }}
        state=latest
        update_cache=yes
      when: is_installed.rc == 0

Playbook обновит пакет только если он уже установлен, операция производится на 20% хостов за раз, те в 5 шагов. Полезно, когда надо обновить что-то более серьезное вроде nginx на действительно большом количестве серверов. Таким образом мы не отправляем весь веб кластер в даун. Дополнительно можно добавить отключение от балансировщика нагрузки группами. Пример из реальной жизни.

Видно, что playbook переменные {{hosts}} и {{package}} приходят откуда-то извне, а именно из экшена в нашем StackStorm паке actions/update_package.yaml:
---
name: update_package
description: Update package on remote hosts
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    immutable: true
    default: true
  kwarg_op:
    immutable: true
  timeout:
    default: 6000
  cmd:
    description: "Command to run"
    immutable: true
    # эта строчка
    default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible-playbook /opt/stackstorm/packs/${ST2_ACTION_PACK_NAME}/playbooks/update_package.yaml --extra-vars='hosts={{ hosts }} package={{ package }}'"
  hosts:
    description: "Ansible hosts"
    type: string
    required: true
  package:
    description: "Package to upgrade"
    type: string
    required: true

Action alias, дающий возможность запускать playbook в виде простой ChatOps команды,
aliases/update_package.yaml:
---
name: chatops.ansible_package_update
action_ref: st2-chatops-aliases.update_package
description: Update package on remote hosts
formats:
  - "update {{package}} on {{hosts}}"

Вот она:
!update 'bash' on 'all'


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

В завершение. Священная корова


Как вы знаете, у Ansible известная любовь к утилите cowsay. Давайте перенесем ее в ChatOps!

Установим для начала саму утилиту:
sudo apt-get install cowsay

Экшн actions/cowsay.yaml:
---
name: cowsay
description: Draws a cow that says what you want
runner_type: local-shell-cmd
entry_point: ""
enabled: true
parameters:
  sudo:
    immutable: true
  kwarg_op:
    immutable: true
  cmd:
    description: "Command to run"
    type: string
    immutable: true
    default: "/usr/games/cowsay {{message}}"
  message:
    description: "Message to say"
    type: string
    required: true

Alias aliases/cowsay.yaml:
---
name: chatops.cowsay
action_ref: st2-chatops-aliases.cowsay
description: Draws a cow that says what you want
formats:
  - "cowsay {{message}}"

Вызов священной ChatOps коровы:
!cowsay 'Holy ChatOps Cow!'

Священная ChatOps корова
Для справки: Все результаты выполнения команд можно посмотреть в панели управления StackStorm
http://www.chatops:8080/ логин: testu пароль: testp
(замените hostname на IP если не воспользовались Vagrant демо):


Не останавливайтесь на достигнутом!


Это были простые, но боевые примеры использования. Более сложные вещи когда несколько DevOps инструментов соединены в динамический рабочий процесс будут показаны в следующих статьях. Здесь StackStorm демонстрирует всю свою мощь, принимая решения в зависимости от ситуации: это называется событийно-ориентированной архитектурой вроде самовосстанавливающихся после инцидента систем.
Если не нашли нужного функционала в StackStorm, предложите идею или добавьте Pull Request на GitHub (Python наш основной язык). Так же есть коммьюнити где можно задать вопрос или поделиться своим опытом: публичный Slack канал (с предустановленным демо ботом) и IRC: #StackStorm на freenode.net.


Спасибо за внимание, надеюсь получилось осветить особенности этого достаточно нового подхода в мире DevOps.
А для каких случаев вы бы использовали ChatOps? Прошу делиться идеями в комментариях.

Комментарии (19)


  1. auine
    26.06.2015 10:42
    +2

    Да slack в последнее время не перестает удивлять :)


    1. armab Автор
      26.06.2015 11:02

      Можно порулить много еще откуда:

      • IRC
      • HipChat (чат от Atlassian)
      • Skype (!)
      • Jabber (!)
      • Gtalk
      • Gitter
      • Campfire

      Весь список Hubot адаптеров


      1. alfss
        27.06.2015 03:31
        +1

        Нельзя Skype. На странице проекта отмечено, что MS закрыли API и нету гарантии работоспособности адаптера. Последний коммит 1 год назад!


        1. armab Автор
          28.06.2015 16:00

          MS поломали Skype ;(


  1. armab Автор
    26.06.2015 11:23
    +1

    В связи с Jabber внезпано пришла такая сумасшедшая вещь вроде умного дома:
    — Поднимаем собственный Jabber сервер
    — Настраиваем систему и команды
    — Управляем домом из Jabber как с удаленного терминала
    — Заставляем Jabber слать нам уведомления в зависимости от событий: «В доме выключили воду», «Кот запрыгнул на елку», «Позвонили в дверь в 15:32».

    Можно собирать данные с сенсоров, вешать свои обработчики событий if -> then -> else, все на легко читаемом Python-e.
    Потом дополнительно в веб-панель все завернуть, но терминал все равно надо оставить.

    А если интернет временно не доступен на мобильном — как только появится, сообщение с Jabber-a все равно прийдет.

    Есть такие паки для всякой электроники и IoT (интернета вещей):



    Вплоть до какой-то промыленной автоматизации.


    1. r00tGER
      29.06.2015 09:02
      +1

      Конечно, идея прекрасная. Но, справедливости ради, она не нова.
      И даже, давно проработана.


      1. armab Автор
        29.06.2015 15:28

        Не удивительно, — очень много одинаковых идей но с разной реализацией.
        Можно кстати вкратце, какие-то примеры/ссылки, тк. я от электроники отошел лет 6 назад. Совсем не слежу, но интересно.

        Я не думаю что мы пооффтопим здесь, речь об автоматизации.
        Кстати есть человек который умный дом построил, взяв за контрольный центр st2 (те вся обработка событий построена на этой платформе, что фактически Yaml + Python). Камеры повсюду, сенсоры, админка для доступа извне, https, ключи авторизации (слышал еще пугает заходящих на территорию котов включением автополива газона, что тоже не ново).


  1. mvs
    26.06.2015 14:16
    +4

    Чат на node.js с NoSQL БД для управлению консолью, в которой запускается Ansible Playbook на Python, который управляет серверами по SSH, выполняя команды в их консоли. Брр, это уже какой-то перебор.
    Я только ЗА Ansible — штука чертовски удобная для управления «зоопарком» серверов, но я категорически против 100500 новых точек отказа, горы потенциальных уязвимостей и отсутствующей непонятно какой безопасности доступа к такому чатику.
    image


    1. armab Автор
      26.06.2015 15:35
      +2

      Да, вполне справедливый комментарий.
      На самом деле много споров на эту тему в западном сегменте, есть аргументы как за так и против.

      За:

      • Есть RBAC/Auth Hubot плагин.
      • Можно разрешить определенную группу команд кому надо, запретить кому не надо — очень эффективное и гибкое решение.
      • Можно ли сказать: вот я вам даю ключи и root, пожалуйста выполняйте только 3 команды. С ChatOps так можно сделать.
      • В чат-сервисах вроде Slack можно выставить 2-х факторную аутентификацию. Это значительно повышает безопасность. Учитывая что SSH ключи могут увести, — иногда ChatOps с 2х факторной бывает даже более безопасным решением на практике.

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

      Против:
      • Чат сервис могут взломать. Но скорее всего вы об этом узнаете в новостях и вероятность что взломают Slack чтоб выполнять команды у вас на серверах — очень мала
      • Много прокладок и посредников (кстати интересно какая будет шумиха если взломают GitHub)
      • Насчет против думаю вы меня еще дополните. Вопрос интересный, хочется взглянуть со всех сторон.


      Как безопасно приготовить ChatOps — это пожалуй целая тема для отдельной статьи.


      1. armab Автор
        30.06.2015 00:16

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

        В Slack enterprise версия «coming soon in 2015».

        Скорее всего есть и другие сервисы с hosted версией.


    1. l0rda
      27.06.2015 05:32

      Категорически согласен. Помимо кучи точек отказа, это просто игрушка. Решить серьезную проблему таким образом нельзя, а попытки ее решить таким образом отнимут много времени. Игрушка подойдет для саппорта, чтобы перезагружать сервисы. Каких-то других вменяемых кейсов я не вижу. Ansible — да, штука хорошая и приятная. Но это явно перебор. В последнее время растет количество каких-то неадекватных технологий. Люди сами стараются усложнять себе жизнь.


      1. armab Автор
        27.06.2015 18:44

        Люди стараются упрощать себе жизнь, и это получается.
        Вот более серьезный пример: Autoscaling showcase (можно запустить на Vagrant).

        Что происходит:

        • Начинается все с ChatOps команды: !asg create name=test domain=domain.com min_nodes=1 expand_by=1
        • Создается Autoscaling группа с серверами в облаке (тут цепочка действий)
        • Платформа слушает состояние серверов через NewRelic API (заменить на свой мониторинг)
        • Дальше происходит интересное, если какой-то сервер в группе падает:
          • 1. система получает триггер из NewRelic что какой-то из серверов упал
          • 2. убирает сервер из Autoscaling группы
          • 3. заменяет его на другой только что поднятый сервер

        • Система сама себя вылечила, вы спите спокойно. Profit!

        Видео на английском (листать на 5 минуту, где начинается интересное).

        Кстати человек бывший GitHub-овец. Можно конечно «обидить хужожника» и сказать что GitHub, Rackspace, Puppet labs, Box итд просто фигней занимаются с этим ChatOps, но коммьюнити сейчас делится на тех, кто это использует и тихонько получает c этого выгоду, и всех остальных.


      1. astlock
        29.06.2015 10:03
        +1

        Вот гитхаб с вами не согласится. Они с помощью бота не боятся управлять такими вещами как репликация mysql или роутинг.


  1. armab Автор
    26.06.2015 21:12
    +1

    Кстати, кто из крупных компаний точно использует ChatOps:

    • Github (сами придумали, — сами и используют)
    • RackSpace Сloud
    • Puppet Labs
    • Box.com
    • HP
    • много средних стартапов вроде 500px.com, Pagerduty, VictorOps итд.

    Вероятно много других компаний используют или хотя бы пробуют в различных подразделениях (но не разглашают), потому что когда скорость реакции, производительность команды увеличивается в х3-х10 раз — это огромные для такого уровня бизнеса деньги.


  1. Ingtar
    26.06.2015 22:06
    +1

    Очень необычная идея, но вот практическая составляющая мне не понятна…
    Коллега на работе рассказывал про возможность прикрутить к Астериску возможность запускать рандомные скрипты по добавочным номерам. Можно позвонить на номер фирмы, набрать добавочный код и выкатить новую ветку в продакшен :)))


    1. armab Автор
      27.06.2015 18:50

      Интересная идея!

      Вот более сложный/реальный пример с созданием из чата Autoscaling группы и авто-заменой упавших серверов на живые:
      habrahabr.ru/post/260917/#comment_8479121


  1. Xelonic
    27.06.2015 11:35
    +2

    Ребята, а как вы страхуетесь от выполнения неверной команды или скрипта, которая может на каком то из узлов что-нибудь испортить?
    Как вы отлаживаете сценарии?


    1. armab Автор
      28.06.2015 01:34
      +1

      Хороший вопрос.

      Отладка ChatOps команд и сценариев вручную:
      Тестируем и хорошо проверяем в Vagrant и Docker: st2workroom, st2express ну и Code reviews, как обычно. Благо, благодаря декларативному подходу и вынесению высокоуровневой логики в Yaml файлы — читать и разбираться легче.

      Автоматическое тестирование сценариев и команд:
      Есть st2tests, дополнительные Acceptance тесты, когда платформа тестирует некоторые части самой себя с помощью самой себя (картинка выше напомнила). К примеру, вот тест, который проверяет процесс установки/удаления паков. Все это поставляется в виде отдельного пака, те тесты могут быть установлены из внешнего репозитория и запущены как обычный пак (плагин/расширение).

      ^^ Так же можно поступать для собственных сценариев, тестируя их своими же автоматическими тестами.
      Итого, если делать все серьезно для продакшна, может получится 2 репозитория/пака: 1 с вашими командами и сценариями и 1 опциональный с тестами.

      И последнее,
      реальные команды — они чаще всего состоят из цепочек действий и условий (если случилось 1 -> значит делаем 2, потом 3, потом 4), те что-то массивное складывается в единую ChatOps команду. Чаще всего на продакшене таких команд немного, перепутать — трудно. Самое популярное — это деплой/развертывание.
      То что указано в примере с uname -a из чата, когда можно выполнить любую shell конструкцию из чата — это только для простоты демонстрации. Обычно мало смысла такое ставить в продакшн.


  1. armab Автор
    02.07.2015 01:03

    Чтобы лучше понимать ChatOps.
    Вот короткое (20 мин.), но очень энергичное видео о ChatOps опыте в GitHub (на английском):

    ChatOps: Методология и Философия

    Освещает такие вопросы:

    • Преимущества ChatOps
    • Использование в реально большой организации
    • C чего начать
    • Примеры из жизни
    • Вопросы безопасности
    • Что стоит делать с помощью ChatOps, а что нет