Stackdriver와 slackbot으로 서비스 자동 복구

18526 단어 stackdriverslackbot

했던 일





계기



이전부터이 손의 이야기는 팀 내에서 쵸이 쵸이 했지만, 동료가 뭔가 재미있을 것 같은 것을
시도했기 때문에 俺も俺も! 라고 하는 것이 계기입니다.
  • Stackdriver에는 슬랙 알림 기능이 있습니다
  • slack bot에서 놀았던 일이 있었다
  • ansible을 실무로 사용하고 있었다
    ⇒이 사고 과정에서 シンプルで簡単に自動起動できそうじゃね 와 뇌즙이 나온 것이 계기입니다.

  • 덧붙여서, 동료의 기사는 이쪽입니다.
    htps : // 코 m / 히로키 사콘 주 / ms / 7f0084 d9 a7 df777에서 95

    stackdriver의 설정이나 ansible의 환경 설정등은↑의 기사에 맡기도록
    slackbot을 중심으로 쓰고 싶습니다.

    bot 시작



    <환경>
    python3.6
    slackbot pip3 install slackbot
    기본 설정은 생략합니다. 아래의 기사를 알기 쉽습니다.
    Python의 slackbot 라이브러리로 Slack 봇 만들기
    이전에 참고하였습니다

    bot 소환



    my_mention.py
    # coding: utf-8
    from slackbot.bot import respond_to
    from slackbot.bot import listen_to
    from slackbot.bot import default_reply
    
    @default_reply()
    def default_func(message):
        message.reply("もあぁぁぁい")
    



    라고…일단 성공(우치의 완코와 모아이가……슈·슈르…)

    Stack driver의 알림



    GCP의 GCE 프로세스(nginx)를 감시하고, down하면 slackdriver에 다음과 같이 통지가 옵니다.


    up는 이런 느낌.


    어떻게 데리러 갈 수 있을까



    여기가 조금 빠졌습니다 ... 보통 텍스트라면 어려움없이 픽업할 수 있습니다만, 풍부한 attachments의 내용을 픽업할 필요가 있습니다.

    my_mention.py
    @listen_to(r'[\s\S]*')
    def listen_func(message):
        msg = message.body
        print(msg)
        if 'attachments' in msg:
            if "web001_nginx" in msg["attachments"][0]["fallback"]:
                if "Process count for xxxxx-xxxxx-xxxxx web001 is below the threshold of 1 with a value of 0." in msg["attachments"][0]["text"]:
                    message.send("落ちたもあぁぁぃ、ansible起動もぁぁぃ!")
                elif "Process count for xxxxx-xxxxx-xxxxx web001 has returned to normal with a value of 1.000." in msg["attachments"][0]["text"]:
                    message.send("起動したもぁぁぃ")
            else:
                print("for add host")
        else:
            print("no attachment")
    

    3,4행째로 body 전체를 취득해 표시하면 이런 느낌이었습니다. (다운시)
    {'text': 'Incident <https://app.google.stackdriver.com/incidents/0.xxxxxxxxxxxxxproject=xxxxx-xxxxx-xxxxx|#0.xxxxxxxx> started', 'username': 'Google Cloud Monitoring', 'icons': {'image_48': 'https://s3-us-west-2.amazonaws.com/slack-files2/bot_icons/2017-01-21/130004243825_48.png'}, 'bot_id': 'XXXXXXXX', 'attachments': [{'fallback': 'web001_nginx', 'text': 'Process count for xxxxx-xxxxx-xxxxx web001 is below the threshold of 1 with a value of 0.', 'pretext': 'Process Health on Instance (GCE) web001_nginx', 'title': 'web001_nginx', 'id': 1, 'title_link': 'https://app.google.stackdriver.com/policy-advanced/xxxxxxxxxxxxxxxxxxxxproject=xxxxx-xxxxx-xxxxxx', 'color': 'a30200'}], 'type': 'message', 'subtype': 'bot_message', 'team': 'XXXXXXXX', 'channel': 'XXXXXXXXX', 'event_ts': 'XXXXXXXXXXXXX', 'ts': 'XXXXXXXXXXXXX'}
    

    up시
    {'text': 'Incident <https://app.google.stackdriver.com/incidents/xxxxxxxxxproject=xxxxxx-xxxxxx-xxxxx|#0.xxxxxxx> stopped', 'username': 'Google Cloud Monitoring', 'icons': {'image_48': 'https://s3-us-west-2.amazonaws.com/slack-files2/bot_icons/2017-01-21/130004243825_48.png'}, 'bot_id': 'XXXXXXXX', 'attachments': [{'fallback': 'web001_nginx', 'text': 'Process count for xxxxx-xxxxxx-xxxxxx web001 has returned to normal with a value of 1.000.', 'pretext': 'Process Health on Instance (GCE) web001_nginx', 'title': 'web001_nginx', 'id': 1, 'title_link': 'https://app.google.stackdriver.com/policy-advanced/xxxxxxxxxxxxxxxxxxxxxxxxxproject=xxxxx-xxxxxx-xxxxxx', 'color': '2eb886'}], 'type': 'message', 'subtype': 'bot_message', 'team': 'XXXXXXXX', 'channel': 'XXXXXXXXX', 'event_ts': 'xxxxxxxxxxxx', 'ts': 'xxxxxxxxxxxxxxxxx'}
    

    취득할 수 있는 것을 알면 후에는 자유롭게.

    후에는 적당히 커맨드를 두드리도록 완성입니다.
    def cmd(path, command):
        os.chdir(path)
        result = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        stdout, stderr = result.communicate()
        return (stdout, stderr)
    

    시작도





    ansible 기동도 ぁぁぃ! 해 주었습니다.

    좋은 웹페이지 즐겨찾기