DevOpsリハビリ中の @udzura です。皆さんは、アジャイルとデブオプスを実現していますか?
今日は、「IFTTT for Ops」を標榜するイベントドリブンでルールベースな自動化ツール、StackStormをいじってみたので手順を残しておく。
インストールまで
StackStormの構成をきっちり用意するのはかなり手間がかかるようなので、公式のDockerfileたちを利用してComposeでバンと立ててみる。
最初に、手元の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
WebhookからWebhookを叩いているのは渋いが、良さそう。
今後は幾つかアクションとトリガを試してみたい。Pythonをかければ自作できるそうな...