さて、前回StackStormのインストールを行ったので、今回は実際に何らかの処理を行わせてみる。
StackStormにはブラウザ経由での管理が行えるWebUI管理画面があるのだが、今回はCUIでの設定・操作をする。

まず、StackStormには以下の4つの要素がある。

  • Action → トリガーを受けて、対象のホストに対して処理を行う
  • Trigger → 何かしらの操作やエラー、フラグをトリガーとし、アクションを実行する
  • Sensor → トリガーを検知するセンサー
  • Rule → トリガーとアクションを組み合わせたもの

つまり、TriggerとActionをうまく組み合わせて処理を自動化させればいいということか。
これらはPack(プラグイン)として提供されているので、必要なTriggerやActionについては随時導入してやればいい。

なお、ActionとTriggerはインストール時からいくつか用意されている。
以下のコマンドで確認できる。

st2 action list # Actionの一覧
st2 trigger list # Triggerの一覧
[root@BS-PUB-STACKSTORM ~]# st2 action list
+---------------------------------+---------+---------------------------------+
| ref                             | pack    | description                     |
+---------------------------------+---------+---------------------------------+
| chatops.format_execution_result | chatops | Format an execution result for  |
|                                 |         | chatops                         |
| chatops.post_message            | chatops | Post a message to stream for    |
|                                 |         | chatops                         |
| chatops.post_result             | chatops | Post an execution result to     |
|                                 |         | stream for chatops              |
| core.announcement               | core    | Action that broadcasts the      |
|                                 |         | announcement to all stream      |
|                                 |         | consumers.                      |
| core.http                       | core    | Action that performs an http    |
|                                 |         | request.                        |
| core.local                      | core    | Action that executes an         |
|                                 |         | arbitrary Linux command on the  |
|                                 |         | localhost.                      |
| core.local_sudo                 | core    | Action that executes an         |
|                                 |         | arbitrary Linux command on the  |
|                                 |         | localhost.                      |
| core.noop                       | core    | Action that does nothing        |
| core.remote                     | core    | Action to execute arbitrary     |
|                                 |         | linux command remotely.         |
| core.remote_sudo                | core    | Action to execute arbitrary     |
|                                 |         | linux command remotely.         |
| core.sendmail                   | core    | This sends an email             |
| core.windows_cmd                | core    | Action to execute arbitrary     |
|                                 |         | Windows command remotely.       |
| linux.check_loadavg             | linux   | Check CPU Load Average on a     |
|                                 |         | Host                            |
| linux.check_processes           | linux   | Check Interesting Processes     |
| linux.cp                        | linux   | Copy file(s)                    |
| linux.diag_loadavg              | linux   | Diagnostic workflow for high    |
|                                 |         | load alert                      |
| linux.dig                       | linux   | Dig action                      |
| linux.file_touch                | linux   | Touches a file                  |
| linux.lsof                      | linux   | Run lsof                        |
| linux.lsof_pids                 | linux   | Run lsof for a group of PIDs    |
| linux.mv                        | linux   | Move file(s)                    |
| linux.netstat                   | linux   | Run netstat                     |
| linux.netstat_grep              | linux   | Grep netstat results            |
| linux.pkill                     | linux   | Kill processes using pkill      |
| linux.rm                        | linux   | Remove file(s)                  |
| linux.rsync                     | linux   | Copy file(s) from one place to  |
|                                 |         | another w/ rsync                |
| linux.scp                       | linux   | Secure copy file(s)             |
| linux.service                   | linux   | Stops, Starts, or Restarts a    |
|                                 |         | service                         |
| linux.traceroute                | linux   | Traceroute a Host               |
| linux.vmstat                    | linux   | Run vmstat                      |
| linux.wait_for_ssh              | linux   | Action which waits for a SSH    |
|                                 |         | server to become accessible. By |
|                                 |         | default, if no credentials are  |
|                                 |         | provided, this action will try  |
|                                 |         | to authenticate using the       |
|                                 |         | system user username and key    |
|                                 |         | file.                           |
| packs.check_auto_deploy_repo    | packs   | Check if a given branch in a    |
|                                 |         | ST2 Pack's Git repository       |
|                                 |         | should be auto deployed         |
| packs.delete                    | packs   | Deletes the pack from local     |
|                                 |         | content repository.             |
| packs.deploy                    | packs   | Deploy StackStorm Pack(s)       |
| packs.download                  | packs   | Downloads packs and places it   |
|                                 |         | in the local content            |
|                                 |         | repository.                     |
| packs.expand_repo_name          | packs   | For supplied ST2 pack Repo      |
|                                 |         | return the Git URL and if it    |
|                                 |         | has a subtree.                  |
| packs.info                      | packs   | Get currently deployed pack     |
|                                 |         | information                     |
| packs.install                   | packs   | Installs packs from st2-contrib |
|                                 |         | into local content repository.  |
|                                 |         | Will download pack, load the    |
|                                 |         | actions, sensors and rules from |
|                                 |         | the pack. Note that install     |
|                                 |         | require reboot of some st2      |
|                                 |         | services.                       |
| packs.load                      | packs   | Action that reloads all st2     |
|                                 |         | content.                        |
| packs.restart_component         | packs   | Action that restarts st2        |
|                                 |         | service.                        |
| packs.setup_virtualenv          | packs   | Set up virtual environment for  |
|                                 |         | the provided packs              |
| packs.uninstall                 | packs   | Uninstalls packs from local     |
|                                 |         | content repository. Removes     |
|                                 |         | pack and content from st2. Note |
|                                 |         | that uninstall require reboot   |
|                                 |         | of some st2 services.           |
| packs.unload                    | packs   | Unregisters all content from a  |
|                                 |         | pack.                           |
| packs.update_virtualenv         | packs   | Update / reinstall Python       |
|                                 |         | dependencies listed in          |
|                                 |         | requirements.txt inside the     |
|                                 |         | pack virtual environment        |
| packs.virtualenv_prerun         | packs   | Transformation step to conver   |
|                                 |         | packs_status to list of packs.  |
+---------------------------------+---------+---------------------------------+
[root@BS-PUB-STACKSTORM ~]# st2 trigger list
+---------------------------------+-------+---------------------------------+
| ref                             | pack  | description                     |
+---------------------------------+-------+---------------------------------+
| linux.file_watch.line           | linux | Trigger which indicates a new   |
|                                 |       | line has been detected          |
| core.st2.generic.actiontrigger  | core  | Trigger encapsulating the       |
|                                 |       | completion of an action         |
|                                 |       | execution.                      |
| core.st2.generic.notifytrigger  | core  | Notification trigger.           |
| core.st2.action.file_writen     | core  | Trigger encapsulating action    |
|                                 |       | file being written on disk.     |
| core.st2.key_value_pair.create  | core  | Trigger encapsulating datastore |
|                                 |       | item creation.                  |
| core.st2.key_value_pair.update  | core  | Trigger encapsulating datastore |
|                                 |       | set action.                     |
| core.st2.key_value_pair.value_c | core  | Trigger encapsulating a change  |
| hange                           |       | of datastore item value.        |
| core.st2.key_value_pair.delete  | core  | Trigger encapsulating datastore |
|                                 |       | item deletion.                  |
| core.st2.sensor.process_spawn   | core  | Trigger indicating sensor       |
|                                 |       | process is started up.          |
| core.st2.sensor.process_exit    | core  | Trigger indicating sensor       |
|                                 |       | process is stopped.             |
| core.st2.IntervalTimer          | core  | Triggers on specified           |
|                                 |       | intervals. e.g. every 30s,      |
|                                 |       | 1week etc.                      |
| core.st2.DateTimer              | core  | Triggers exactly once when the  |
|                                 |       | current time matches the        |
|                                 |       | specified time. e.g.            |
|                                 |       | timezone:UTC date:2014-12-31    |
|                                 |       | 23:59:59.                       |
| core.st2.CronTimer              | core  | Triggers whenever current time  |
|                                 |       | matches the specified time      |
|                                 |       | constaints like a UNIX cron     |
|                                 |       | scheduler.                      |
| core.st2.webhook                | core  | Trigger type for registering    |
|                                 |       | webhooks that can consume       |
|                                 |       | arbitrary payload.              |
+---------------------------------+-------+---------------------------------+

ローカルサーバでアクションを単体で実行する

とりあえず、アクションを単体で実行してみよう。
ローカルで任意のコマンドを実行するアクションは「core.local(root権限での実行はcore.local_sudo)」になるので、このコマンドを実行する。

st2 run core.local -- コマンド
[root@BS-PUB-STACKSTORM ~]# st2 run core.local -- hostname
.
id: 5802bd8f2e5b192da9fa8f31
status: succeeded
parameters:
  cmd: hostname
result:
  failed: false
  return_code: 0
  stderr: ''
  stdout: BS-PUB-STACKSTORM.BLACKNON.LOCAL
  succeeded: true

リモートサーバでアクションを実行する

当然、リモートサーバに対してもアクションを実行できる。

st2 run core.remote hosts='IPアドレスorホスト名' username='ユーザ名' @private_key='/home/stanley/.ssh/stanley_rsa' -- コマンド
[root@BS-PUB-STACKSTORM ~]# st2 run core.remote hosts='172.XXX.XXX.XXX' username='root' @private
_key='/home/stanley/.ssh/stanley_rsa' -- hostname
..
id: 5802c2d62e5b192da9fa8f37
status: succeeded
parameters:
  cmd: hostname
  hosts: 172.XXX.XXX.XXX
  private_key: '********'
  username: root
result:
  172.XXX.XXX.XXX:
    failed: false
    return_code: 0
    stderr: ''
    stdout: BS-PUB-CENT7-01.blacknon.local
    succeeded: true

なお、実行時は以下のようにパスワード認証でも実行させることができる。

st2 run core.remote hosts='IPアドレスorホスト名' username='ユーザ名' password='パスワード' -- コマンド
[root@BS-PUB-STACKSTORM ~]# st2 run core.remote hosts='172.XXX.XXX.XXX' username='root' password='password' -- uname -a
..
id: 5802c52b2e5b192da9fa8f40
status: succeeded
parameters:
  cmd: uname -a
  hosts: 172.XXX.XXX.XXX
  password: '********'
  username: root
result:
  172.XXX.XXX.XXX:
    failed: false
    return_code: 0
    stderr: ''
    stdout: 'Linux BS-PUB-CENT7-02.blacknon.local 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux'
    succeeded: true

トリガーとアクションを関連づけてルールを作成し自動化してみる

センサーの設定

さて、それではStackStormの本来の使い方といってもいい、特定の事象をトリガーとしたアクションの自動実行処理を設定してみよう。
デフォルトでは「linux.FileWatchSensor(ファイルの変動を検知するセンサー)」が入っているので、今回はこれを使ってみよう。

[root@BS-PUB-STACKSTORM ~]# st2 sensor list
+-----------------------+-------+-------------------------+---------+
| ref                   | pack  | description             | enabled |
+-----------------------+-------+-------------------------+---------+
| linux.FileWatchSensor | linux | Sensor which monitors   | True    |
|                       |       | files for new lines     |         |
+-----------------------+-------+-------------------------+---------+
[root@BS-PUB-STACKSTORM ~]# cat /opt/stackstorm/packs/linux/config.yaml
file_watch_sensor:
  file_paths:

「/opt/stackstorm/packs/linux/config.yaml」へ監視対象となるファイルPATHを以下のように記述し、reloadする。
今回は、テスト用に作った「/work」というディレクトリ配下のファイルを対象にする。

file_watch_sensor:
    file_paths: "/work/st2_test.txt"

設定ファイルを編集したら、以下のコマンドでreloadする。

st2ctl reload

ルールの作成

センサーの設定が完了したら、ルールを作成する。
ルールの作成は、内容を記述したyamlファイルを読み込ませることで行える。

そこで、以下のようなyamlファイルを作成した。

●test.yaml

---
    name: "st2_testrule"
    description: "StackStorm Test Rule"
    enabled: true

    trigger:
        ref: "linux.file_watch.line"
        type: "linux.file_watch.line"

    criteria:
        trigger.line:
            type: "matchregex"
            pattern: "abc"

    action:
        ref: "core.local"
        parameters:
            cmd: "echo \"$(date +%Y%m%d) test line\" >> /work/test_output2.txt"

上記yamlファイルを読み込んでRuleを作成する。

st2 rule create test.yaml
[root@BS-PUB-STACKSTORM ~]# st2 rule create test.yaml
+-------------+--------------------------------------------------------------+
| Property    | Value                                                        |
+-------------+--------------------------------------------------------------+
| id          | 58030da32e5b190deeeb7bd7                                     |
| name        | st2_testrule                                                 |
| pack        | default                                                      |
| description | StackStorm Test Rule                                         |
| action      | {                                                            |
|             |     "ref": "core.local",                                     |
|             |     "parameters": {                                          |
|             |         "cmd": "echo "$(date +%Y%m%d) test line" >>          |
|             | /work/test_output2.txt"                                      |
|             |     }                                                        |
|             | }                                                            |
| criteria    | {                                                            |
|             |     "trigger.line": {                                        |
|             |         "pattern": "abc",                                    |
|             |         "type": "matchregex"                                 |
|             |     }                                                        |
|             | }                                                            |
| enabled     | True                                                         |
| ref         | default.st2_testrule                                         |
| tags        |                                                              |
| trigger     | {                                                            |
|             |     "type": "linux.file_watch.line",                         |
|             |     "ref": "linux.file_watch.line",                          |
|             |     "parameters": {}                                         |
|             | }                                                            |
| type        | {                                                            |
|             |     "ref": "standard",                                       |
|             |     "parameters": {}                                         |
|             | }                                                            |
| uid         | rule:default:st2_testrule                                    |
+-------------+--------------------------------------------------------------+

これで、「/work/st2_test.txt」というファイルに「abc」というキーワードを含む行が挿入されたら、「/work/test_output.txt」ファイルに書き込みが行われるようになった。
うまく動かない場合は、Sensorの動きがおかしい可能性があるので、以下のコマンドで再度Sensorのみリロードしてみるといいだろう。

st2ctl reload --register-sensors