Ansible とStackStorm でつくる ChatOps 環境

C0479b152c326746e911be790617f75b?s=47 katsuhisa_
April 26, 2018

Ansible とStackStorm でつくる ChatOps 環境

Ansible Night in Tokyo 2018.04 (https://ansible-users.connpass.com/event/84907/ ) で話した資料です。

C0479b152c326746e911be790617f75b?s=128

katsuhisa_

April 26, 2018
Tweet

Transcript

  1. Ansible とStackStorm でつくる ChatOps 環境 Ansible Night in Tokyo 2018.04

    株式会社スタディスト 北野 勝久
  2. すきなAnsible モジュール  lineinfile : @katsuhisa__

  3. 突然ですが、 こんなことありませんか?

  4. 監視ツール 「<ALERT> SERVER001 !!」 ぼく 「アラートきた」 Aさん 「なんだなんだ」 ある日のSlack でのコミュニケーション

  5. ぼく 「なんだこのアラートか」 Aさん 「なんだこのアラートか」 ぼく 「対応やっときますね」 Aさん 「よろしく」 ある日のSlack でのコミュニケーション

  6. ぼく がちゃがちゃ(対応作業) ぼく 「こんな感じでした〜」(実行結果共有) --- 数分後 --- 監視ツール 「【Resolved】<ALERT> SERVER001

    !!」 ぼく 「おつかれさまでした〜」 Aさん 「おつかれ〜」 ある日のSlack でのコミュニケーション
  7. すぐに状況確認して、すぐに実行結果を共有したい ➔実行結果を共有するために ➔Slack と作業環境を行き来するの面倒 なんなら初動対応と結果共有すべて自動化したい ※うちのSRE チームの名誉のために書いておくと、 ※こういう類のものは、現時点でも自動復旧できるようになっている箇所も多いです

  8. それ、StackStorm でできます

  9. StackStorm? Event-Driven Automation StackStorm is a powerful open-source automation platform

    that wires together all of your apps, services and workflows. It’s extendable, flexible, and built with love for DevOps and ChatOps
  10. StackStorm? Event-Driven Automation StackStorm is a powerful open-source automation platform

    that wires together all of your apps, services and workflows. It’s extendable, flexible, and built with love for DevOps and ChatOps ➔ IFTTT for Ops
  11. IFTTT ? めっちゃかんたん。 「もし、this なら、that する。」以上。

  12. IFTTT for Ops ? 例えば、こんな感じの世界になる IF THIS : もし、◦◦のアラートがきたら、 THEN

    THAT : Nginx を再起動して、PagerDuty にポスト
  13. 自動化できて幸せ

  14. 人の欲望には限りがない

  15. そこまでできるんだったら・・・ アドホックなコマンド以外も実行したくなる Ansible に実装されているあれこれが使いたいとか なんならそもそもPlaybook を実行したいとか

  16. それ、StackStorm でできます

  17. 検証してみた https://github.com/StackStorm/showcase-ansible-chatops

  18. Ansible の 実行結果が表示

  19. --- name: chatops.ansible_server_status action_ref: st2_chatops_aliases.server_status description: Show status for hosts

    (ansible ping module) formats: - display: "status <hosts>" representation: - "status {{ hosts }}" - "ping {{ hosts }}" result: format: | Here is your status for `{{ execution.parameters.hosts }}` host(s): {~} ```{{ execution.result.stdout }}``` extra: slack: color: "{% if execution.result.succeeded %}good{% else %}danger{% endif %}" fields: - title: Alive value: "{{ execution.result.stdout|regex_replace('(?!SUCCESS).', '')|wordcount }}" short: true - title: Dead value: "{{ execution.result.stdout|regex_replace('(?!UNREACHABLE).', '')|wordcount }}" short: true footer: "{{ execution.id }}" footer_icon: "https://stackstorm.com/wp/wp-content/uploads/2015/01/favicon.png" aliases/server_status.yaml エイリアス定義
  20. --- name: http_status_codes description: Show sorted http status codes from

    nginx logs runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts|replace('http://','')}} --become -m shell -a \"awk '{print \\$9}' /var/log/nginx/access.log |sort |uniq -c |sort -k1,1nr 2>/dev/null|column -t\"" hosts: description: "Ansible hosts" type: string required: true actions/http_status_codes.yaml 実行の内容
  21. --- name: http_status_codes description: Show sorted http status codes from

    nginx logs runner_type: local-shell-cmd entry_point: "" enabled: true parameters: sudo: immutable: true default: true kwarg_op: immutable: true cmd: description: "Command to run" type: string immutable: true default: "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts|replace('http://','')}} --become -m shell -a \"awk '{print \\$9}' /var/log/nginx/access.log |sort |uniq -c |sort -k1,1nr 2>/dev/null|column -t\"" hosts: description: "Ansible hosts" type: string required: true actions/http_status_codes.yaml 実行の内容 "/opt/stackstorm/virtualenvs/ansible/bin/ansible {{hosts|replace('http://','')}} --become -m shell -a \ "awk '{print \\$9}' /var/log/nginx/access.log |sort |uniq -c |sort -k1,1nr 2>/dev/null|column -t\""
  22. \Ansible でたのしいChatOps ライフを/