ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

StackStormを動かしてみる

DevOpsリハビリ中の @udzura です。皆さんは、アジャイルとデブオプスを実現していますか?

今日は、「IFTTT for Ops」を標榜するイベントドリブンでルールベースな自動化ツール、StackStormをいじってみたので手順を残しておく。

stackstorm.com

インストールまで

StackStormの構成をきっちり用意するのはかなり手間がかかるようなので、公式のDockerfileたちを利用してComposeでバンと立ててみる。

github.com

最初に、手元のDockerに st2 という名前でベースイメージをわからせてあげないといけない。ビルドする。

ghq get https://github.com/StackStorm/st2-dockerfiles.git
cd /path/to/st2-dockerfiles
docker build \
  --build-arg ST2_VERSION="2.0.0-1" \
  --build-arg ST2_REPO="staging-stable" \
  -t st2 stackstorm/

環境変数の与え方に癖がある、というか staging-stable を明示してあげないとビルドできない...

続いて、READMEの手順で個々のイメージをビルドする。これはすぐ終わる(docker-compose buildで良さそうな気もするが、慎重派なんです)

docker build -t stackstorm/st2actionrunner:1.1.2 st2actionrunner/
docker build -t stackstorm/st2api:1.1.2 st2api/
docker build -t stackstorm/st2auth:1.1.2 st2auth/
docker build -t stackstorm/st2exporter:1.1.2 st2exporter/
docker build -t stackstorm/st2notifier:1.1.2 st2notifier/
docker build -t stackstorm/st2resultstracker:1.1.2 st2resultstracker/
docker build -t stackstorm/st2rulesengine:1.1.2 st2rulesengine/
docker build -t stackstorm/st2sensorcontainer:1.1.2 st2sensorcontainer/
docker build -t stackstorm/st2garbagecollector:1.1.2 st2garbagecollector/

最後に:

docker-compose up -d

これで、mongodbやrabbitmq含め一切が立ち上がった様子になる。

$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                                NAMES
500e2213ae45        st2dockerfiles_client            "/entrypoint.sh /bin/"   38 minutes ago      Up 38 minutes                                            st2dockerfiles_client_run_6
b1fa4036e78b        stackstorm/st2notifier           "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_notifier_1
3f344a2b0d85        stackstorm/st2sensorcontainer    "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_sensorcontainer_1
98a81c177266        stackstorm/st2garbagecollector   "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_garbagecollector_1
9c6eea839271        stackstorm/st2resultstracker     "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_resultstracker_1
ae5d57c57f9e        stackstorm/st2actionrunner       "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_actionrunner_1
95bf9c605e58        stackstorm/st2auth               "/entrypoint.sh"         About an hour ago   Up About an hour    9100/tcp                             st2dockerfiles_auth_1
b7286363de58        stackstorm/st2rulesengine        "/entrypoint.sh"         About an hour ago   Up About an hour                                         st2dockerfiles_rulesengine_1
1d72a0aa12f0        stackstorm/st2api                "/entrypoint.sh"         About an hour ago   Up About an hour    9101/tcp                             st2dockerfiles_api_1
97c9074178ee        rabbitmq                         "docker-entrypoint.sh"   About an hour ago   Up About an hour    4369/tcp, 5671-5672/tcp, 25672/tcp   st2dockerfiles_rabbitmq_1
136151654cf8        mongo                            "/entrypoint.sh mongo"   About an hour ago   Up About an hour    27017/tcp                            st2dockerfiles_mongo_1

st2 クライアントを叩くには

docker-composeに client というコンテナが含まれているので、それをそのようにします。

$ docker-compose run client st2 --version
Starting st2dockerfiles_data_1...
st2 2.0.0

連続で叩きたければ、 /bin/bash を立ち上げれば良さそう

$ docker-compose run client /bin/bash
Starting st2dockerfiles_data_1...
root@500e2213ae45:/# st2 --version
st2 2.0.0

ルールを登録するゾ

登録手順は こちらのサイト よろしく、takosan を叩いてみる。

core.local が実際に実行されるコンテナは stackstorm/st2actionrunner のコンテナなので、そこにあらかじめcurlを入れとく必要がある。

docker exec -ti st2dockerfiles_actionrunner_1 apt-get -y install curl

## in client container...

## TOKENを発行
## パスワードは... https://github.com/StackStorm/st2-dockerfiles/blob/master/client/config
$ st2 auth -t st2admin
Password: 
617f6a516e424dac8325c575d9fbb7a6
$ export ST2_AUTH_TOKEN=617f6a516e424dac8325c575d9fbb7a6

$ cat <<... > /var/lib/st2_sample_rule.yaml
---
    name: "st2_sample_rule_webhook_hit_takosan"
    pack: "examples"
    description: "Hit the takosan"
    enabled: true

    trigger:
        type: "core.st2.webhook"
        parameters:
            url: "takosan"

    criteria:

    action:
        ref: "core.local"
        parameters:
            cmd: "curl -d 'channel=#example' -d 'message=Hi, this message is from st2 :bomb:' takosan.your.host/notice"
...

$ st2 rule create /var/lib/st2_sample_rule.yaml
+-------------+--------------------------------------------------------------+
| Property    | Value                                                        |
+-------------+--------------------------------------------------------------+
| id          | 57e4f549bfaf6000077d422c                                     |
| name        | st2_sample_rule_webhook_hit_takosan                          |
| pack        | examples                                                     |
| description | Hit the takosan                                              |
| action      | {                                                            |
|             |     "ref": "core.local",                                     |
|             |     "parameters": {                                          |
|             |         "cmd": "curl -d ..."                                 |
|             |     }                                                        |
|             | }                                                            |
...
| uid         | rule:examples:st2_sample_rule_webhook_hit_takosan            |
+-------------+--------------------------------------------------------------+

## APIのLAN IPを事前に調べておく
$ curl http://172.17.0.4:9101/v1/webhooks/takosan -d '{}' -H 'Content-Type: application/json' -H "X-Auth-Token: $ST2_AUTH_TOKEN"
{}

$ st2 execution list
+--------------------------+------------+--------------+------------------------+-----------------------------+-------------------------------+
| id                       | action.ref | context.user | status                 | start_timestamp             | end_timestamp                 |
+--------------------------+------------+--------------+------------------------+-----------------------------+-------------------------------+
| 57e4f55f17e382000894de76 | core.local | stanley      | succeeded (1s elapsed) | Fri, 23 Sep 2016 09:26:55   | Fri, 23 Sep 2016 09:26:56 UTC |
|                          |            |              |                        | UTC                         |                               |
+--------------------------+------------+--------------+------------------------+-----------------------------+-------------------------------+

$ st2 execution get 57e4f55f17e382000894de76
id: 57e4f55f17e382000894de76
status: succeeded (1s elapsed)
parameters: 
  cmd: curl -d ...
result: 
  failed: false
  return_code: 0
  stderr: "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   101  100    39  100    62     76    122 --:--:-- --:--:-- --:--:--   127"
  stdout: 'Message sent successfully to #example'
  succeeded: true

f:id:udzura:20160923185354p:plain

WebhookからWebhookを叩いているのは渋いが、良さそう。


今後は幾つかアクションとトリガを試してみたい。Pythonをかければ自作できるそうな...

参考サイトなど

jedipunkz.github.io