StackStorm — Tutorial

Douglas Lira
4 min readSep 12, 2019

--

Se você não leu o post anterior, sugiro dar uma lida apenas para entender o que me motivou a escrever este tutorial.

Afinal o que é StackStorm?

O StackStorm é uma plataforma orientada a eventos do OpenSource para automação de runbook. Ele suporta a abordagem de infraestrutura como código para a automação do DevOps e foi comparado com o SaltStack e o Ansible, ele se concentra principalmente em fazer coisas ou executar fluxos de trabalho com base em eventos. (Wikipedia)

Por sua vez, sempre que falamos de StackStorm, muitas outras ferramentas vem acompanhada para que possamos integrar e ciar um sistema de automação bastante interessante.

O que vamos fazer?

Neste tutorial vamos integrar o StackStorm com Slack e Ansible com o objetivo de executar um playbook básico através de um workflow. Não tenho interesse em entrar no detalhe de cada ferramenta Ansible, Docker e Slack.

Instalando o StackStorm

Vamos utilizar o StackStorm com o Docker. Segue os comandos abaixo:

git clone https://github.com/stackstorm/st2-docker
cd st2-docker
make env
docker-compose up -d

Pronto! Com o StackStorm funcionando com docker, vamos iniciar a brincadeira.

1 — Acessando o docker:

docker exec -it <dockerNameOrId> bash

2 — Com acesso ao Docker e com os serviços devidamente funcionando, é uma boa prática atualizar o sistema e após atualizar, instalar o pacote de integração com o Slack. Esses pacotes podem ser visualizados pelo StackStorm Exchange que nada mais é do que um repositório com vários outros packs para serem utilizados.

# apt update
# st2 pack install slack
For the "slack" pack, the following content will be registered:rules | 0
sensors | 1
triggers | 0
actions | 143
aliases | 0
Installation may take a while for packs with many items. [ succeeded ] download pack
[ succeeded ] make a prerun
[ succeeded ] install pack dependencies
[ succeeded ] register pack
+-------------+-------------------------+
| Property | Value |
+-------------+-------------------------+
| name | slack |
| description | Slack Chat integrations |
| version | 0.12.8 |
| author | StackStorm, Inc. |
+-------------+-------------------------+

Excelente!! Sistema atualizado e Pack instalado.

Criando pack, rules, action e workflow

Agora que temos o pack do Slack devidamente instalado. Vamos criar um pack customizado para armazenar nosso workflow.

# cd /opt/stackstorm/packs
# mkdir nyxjs
# cd nyxjs
# mkdir -p actions/workflows rules

Rules

Vamos criar uma regra no StackStorm para interceptar um core.ask e notificar o Slack, sempre que este evento for executado. Crie um arquivo dentro do diretório rule com o nome “notify.yaml” com o conteúdo:

“/opt/stackstorm/packs/nyxjs/rules/notify.yaml”

name: "notify"
pack: "nyxjs"
description: Notify an Inquiry action
enabled: true
trigger:
type: core.st2.generic.inquiry
action:
ref: slack.post_message
parameters:
channel: "#nyxjs"
message: 'Inquiry {{trigger.id}} is awaiting an approval action'

Action

Próximo passo é criar uma action que é a peça fundamental para dar inicio ao nosso workflow. Vá até o diretório actions e crie o arquivo “question.yaml” com o conteúdo:

“/opt/stackstorm/packs/nyxjs/actions/question.yaml”

name: question
description: A workflow with consecutive inquiries.
pack: nyxjs
runner_type: orquesta
entry_point: workflows/question.yaml
enabled: true

Workflow

Com a action definida iremos definir o nosso workflow. Vá até o diretório workflows e crie o arquivo “question.yaml” com o conteúdo:

“/opt/stackstorm/packs/nyxjs/actions/workflows/question.yaml”

version: 1.0
description: Consecutive inquiries.
tasks:
start:
action: core.echo message="Automation started."
next:
- when: <% succeeded() %>
do: get_approval
get_approval:
action: core.ask
input:
ttl: 1
route: developers
schema:
type: object
properties:
approved:
type: boolean
description: "Continue?"
required: True
next:
- when: <% succeeded() %>
do: get_confirmation
- when: <% failed() %>
do: stop
get_confirmation:
action: core.ask
input:
schema:
type: object
properties:
approved:
type: boolean
description: "Really?"
required: True
next:
- when: <% succeeded() %>
do: finish
- when: <% failed() %>
do: stop
finish:
action: core.echo message="Automation completed."
stop:
action: core.echo message="Automation stopped."
next:
- do: fail

Estamos quase lá! Vamos dar um reload no serviço do StackStorm para que ele reconheça nosso pack, rules, actions e workflows.

st2ctl reload

Pronto! Pack reconhecido e o próximo passo é configurar o pack do Slack dentro do StackStorm.

Criando um webhook no Slack

Para configurar um webhook e obter um URL, vá para https://[suaempresa].slack.com/services/new/incoming-webhook, selecione um canal no qual você gostaria que as mensagens fossem postadas e clique em “Adicionar entrada Integração WebHooks”.

Na sequência o Slack vai gerar automaticamente um link que deve ser inserido na configuração do nosso pack. Copie o link “Webhook Url”

Com esse link em mãos configure o StackStorm para utilizar o serviço criado.

Acesse o diretório “/opt/stackstorm/configs/” e crie o arquivo “slack.yaml” com o conteúdo:

post_message_action:
webhook_url: "https://hooks.slack.com/services/<replace-me>"
channel: "#nyxjs"
username: "ze-pequeno"
icon_emoji: ":panda_face:"
# Used for Slack sensor
sensor:
token: ""
strip_formatting: false

action_token: ""
admin:
admin_token: ""
organization: ""
set_active: true
attempts: 1
auto_join_channels:
- C0123456

Enjoy!!

Vamos atualizar as informações do StackStorm com o novo pack e testar!

# st2ctl reload
# st2 action list -p nyxjs
+----------------+--------+----------------------------------------+
| ref | pack | description |
+----------------+--------+----------------------------------------+
| nyxjs.question | nyxjs | A workflow with consecutive inquiries. |
+----------------+--------+----------------------------------------+

Com novo pack criado basta executar a action nyxjs.question

# st2 run nyxjs.question

Próximo passo… integrar, executar um playbook Ansible e detalhar cada etapa do StacoSktorm!

Até a próxima, abs!!

--

--