てくなべ (tekunabe)

ansible / network automation / 学習メモ

StackStorm 経由で Slack に投稿する(準備 ~ st2 run編)

■ はじめに

StackStorm には Slack と連携するための Pack が用意されています。 この記事では、環境の準備と、簡単な動作確認としてSlackへの手動投稿を試します。


■ 環境の準備

StackStorm 本体のインストール

今回は 以下の方法でインストールします。 tekunabe.hatenablog.jp 2.7.2 というバージョンがインストールされました。

Slack Pack のインストール

まず st2 login コマンドでログインします。

[ec2-user@ip-172-31-4-147 ~]$ st2 login testu
Password:
Logged in as testu

Note: You didn't use --write-password option so the password hasn't been stored in the client config and you will need to login again in 24 hours when the auth token expires.
As an alternative, you can run st2 login command with the "--write-password" flag, but keep it mind this will cause it to store the password in plain-text in the client config file (~/.st2/config).

続いて st2 pack install slack コマンドで Slack Pack をインストールします。

[ec2-user@ip-172-31-4-147 ~]$ st2 pack install slack

For the "slack" pack, the following content will be registered:

rules     |  0
sensors   |  1
triggers  |  0
actions   |  113
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 | st2 content pack containing slack integrations |
| version     | 0.10.0                                         |
| author      | StackStorm, Inc.                               |
+-------------+------------------------------------------------+

Slack Pack の内容確認

Slack Pack がインストールされたことを確認します。

[ec2-user@ip-172-31-4-147 ~]$ st2 pack show slack
+-------------+---------------------------------------------------------+
| Property    | Value                                                   |
+-------------+---------------------------------------------------------+
| name        | slack                                                   |
| description | st2 content pack containing slack integrations          |
| author      | StackStorm, Inc.                                        |
| content     | {                                                       |
|             |     "sensors": {                                        |
|             |         "count": 1,                                     |
|             |         "resources": [                                  |
|             |             "SlackSensor"                               |
|             |         ]                                               |
|             |     },                                                  |
|             |     "actions": {                                        |
|             |         "count": 113,                                   |
|             |         "resources": [                                  |
|             |             "dnd.endSnooze",                            |
(略)
|             |             "post_message",                             |
|             |             "dnd.info",                                 |
|             |             "team.billableInfo",                        |
|             |             "channels.replies",                         |
|             |             "groups.setPurpose",                        |
|             |             "channels.list",                            |
|             |             "groups.rename",                            |
|             |             "im.replies",                               |
|             |             "im.list",                                  |
(略)
|             |             "stars.add"                                 |
|             |         ]                                               |
|             |     }                                                   |
|             | }                                                       |
| email       | info@stackstorm.com                                     |
| keywords    | [                                                       |
|             |     "slack",                                            |
|             |     "chat",                                             |
|             |     "messaging",                                        |
|             |     "instant messaging"                                 |
|             | ]                                                       |
| ref         | slack                                                   |
| repo_url    | https://github.com/StackStorm-Exchange/stackstorm-slack |
| version     | 0.10.0                                                  |
+-------------+---------------------------------------------------------+

多くのActionがあるようです。

メッセージを投稿するには、 slack.post_message という Action を利用すればよさそうなので、slack.post_message のヘルプを参照します。

[ec2-user@ip-172-31-4-147 ~]$ st2 action get slack.post_message
+-------------+--------------------------------------------------------------+
| Property    | Value                                                        |
+-------------+--------------------------------------------------------------+
| id          | 5b0b5b446fb12304dc0e0199                                     |
| uid         | action:slack:post_message                                    |
| ref         | slack.post_message                                           |
| pack        | slack                                                        |
| name        | post_message                                                 |
| description | Post a message to the Slack channel.                         |
| enabled     | True                                                         |
| entry_point | post_message.py                                              |
| runner_type | python-script                                                |
| parameters  | {                                                            |
|             |     "username": {                                            |
|             |         "required": false,                                   |
|             |         "type": "string",                                    |
|             |         "description": "Bot username."                       |
|             |     },                                                       |
|             |     "disable_formatting": {                                  |
|             |         "default": false,                                    |
|             |         "required": false,                                   |
|             |         "type": "boolean",                                   |
|             |         "description": "Disable formatting, don't parse the  |
|             | message and treat it as raw text"                            |
|             |     },                                                       |
|             |     "icon_emoji": {                                          |
|             |         "required": false,                                   |
|             |         "type": "string",                                    |
|             |         "description": "Bot icon"                            |
|             |     },                                                       |
|             |     "webhook_url": {                                         |
|             |         "required": false,                                   |
|             |         "type": "string",                                    |
|             |         "description": "Optional Webhook url"                |
|             |     },                                                       |
|             |     "message": {                                             |
|             |         "required": true,                                    |
|             |         "type": "string",                                    |
|             |         "description": "Message to send."                    |
|             |     },                                                       |
|             |     "channel": {                                             |
|             |         "required": false,                                   |
|             |         "type": "string",                                    |
|             |         "description": "Optional channel to post to. Note    |
|             | channel must contain leading #"                              |
|             |     }                                                        |
|             | }                                                            |
| notify      |                                                              |
| tags        |                                                              |
+-------------+--------------------------------------------------------------+

Slack Pack の 設定

予め 投稿したい先の Slack の着信WebフックのURLを控えておきます。 f:id:akira6592:20180528183246p:plain

続いて、 st2 pack config slack コマンドで Slack Pack の設定を行います。 いくつか対話形式で設定項目が聞かれます。

今回は以下の値にして、他はデフォルトのままにしました。

設定項目 備考
post_message_action.username akira6592 任意の名前
post_message_action.webhook_url (先ほど控えた着信WebフックのURL)
post_message_action.icon_emoji :smiley: 投稿時のアイコン。省略時は :panda:
admin.organization admin 任意の名前

途中、以下のように聞かれますのでエンターを押します。

Do you want to preview the config in an editor before saving? [y]:

設定内容がテキストとしてエディタで開かれるので、確認後エディタを終了します。

最後に

Do you want me to save it? [y]: 

と聞かれるのでエンターを押します。

設定が完了すると以下のように、設定内容が出力されます。

+----------+--------------------------------------------------------------+
| Property | Value                                                        |
+----------+--------------------------------------------------------------+
| id       | 5b0b5b466fb12304dc0e01c3                                     |
| pack     | slack                                                        |
| values   | {                                                            |
|          |     "action_token": "********",                              |
|          |     "admin": {                                               |
|          |         "organization": "admin",                             |
|          |         "attempts": 1,                                       |
|          |         "admin_token": "",                                   |
|          |         "auto_join_channels": null,                          |
|          |         "set_active": true                                   |
|          |     },                                                       |
|          |     "sensor": {                                              |
|          |         "strip_formatting": false,                           |
|          |         "token": ""                                          |
|          |     },                                                       |
|          |     "post_message_action": {                                 |
|          |         "username": "akira6592",                             |
|          |         "webhook_url": "https://hooks.slack.com/services/xxx |
|          | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",                  |
|          |         "icon_emoji": ":smiley:",                            |
|          |         "channel": null                                      |
|          |     }                                                        |
|          | }                                                            |
+----------+--------------------------------------------------------------+

設定内容は /opt/stackstorm/configs/slack.yaml に保存されています。

[ec2-user@ip-172-31-4-147 ~]$ cat /opt/stackstorm/configs/slack.yaml
action_token: null
admin:
  admin_token: ''
  attempts: 1
  auto_join_channels: null
  organization: admin
  set_active: true
post_message_action:
  channel: null
  icon_emoji: ':smiley:'
  username: akira6592
  webhook_url: https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
sensor:
  strip_formatting: false
  token: ''


■ StackStorm から Slack への投稿

それでは実際に StackStorm から Slack へ投稿してみます。 手動での投稿は st2 run slack.post_message コマンドを利用し、 message オプションで投稿したいテキストを指定します。

[ec2-user@ip-172-31-4-147 ~]$ st2 run slack.post_message message="Hello, St2! :tada:"
.
id: 5b0bca1b6fb12304dc0e01d4
status: succeeded
parameters:
  message: 'Hello, St2! :tada:'
result:
  exit_code: 0
  result: true
  stderr: 'st2.actions.python.PostMessageAction: INFO     Message successfully posted
    '
  stdout: ''

無事、以下のようにSlackに投稿されました。 f:id:akira6592:20180528183318p:plain


■ まとめ

StackStorm と Slack を連携するための準備と、手動でSlackに投稿するところまで確認できました。 Notification先として便利そうです。 また、 slack.SlackSensor というセンサーも含まれているようなので、今度こちらも試してみたいと思います。