zoukankan      html  css  js  c++  java
  • 运维机器人hubot,解放运维的神器

    背景

    以前看见过别人家的告警系统,基于企业微信 + zabbix 做的二次开发,有一个功能一直让我念念不忘。

    比如发出一条某个 Tomcat 内存溢出的告警,回复个 restart ,就会自动重启这个 Tomcat。就想到如果这个机器人可以交互,那就会方便很多了。

    可能有人会说,Zabbix 的 action 也可以做到,但毕竟是非交互的,不满足我们的需求。

    后来到处查资料,也没找到合适的,自己开发吧,咱也不会,于是就搁置了。

    今年在逛 github 的时候,无意间发现了一个 hubot 的项目,仔细看了下,这正是我苦苦追寻的可交互的运维机器人啊。

    经过一系列的配置,hubot 现在已经可以实现如下功能:

    • 代替我在服务器上执行 shell 脚本
    • 创建 jenkins 任务,执行构建任务操作
    • 从 grafana 获取某个当前图像

    这里的重点在于,当我__不在__电脑前面的时候,想执行点啥,通过手机就搞定了。

    这次只写如何执行 shell 脚本,下一篇写如何与 jenkins 交互

    安装

    安装 node.js 、npm

    node.js 建议版本在 10 以上

    wget https://mirrors.huaweicloud.com/nodejs/latest-v10.x/node-v10.22.0-linux-x64.tar.gz
    tar zxvf node-v10.22.0-linux-x64.tar.gz -C /usr/local/
    ln -s /usr/local/node* /usr/local/node

    cat <<'EOF'> /etc/profile.d/node.sh
    export NODE_HOME=/usr/local/node
    export PATH=$NODE_HOME/bin:$PATH
    EOF

    source /etc/profile
    # 换国内源
    npm config set registry http://mirrors.cloud.tencent.com/npm/
    安装 hubot
    npm install -g yo generator-hubot
    创建 hubot 实例

    建议使用普通用户进行安装,使用 root 会出现很多权限上的错误,是不是有点反人类?

    主要原因是它需要对于组有读写权限

    mkdir /data/hubot
    cd /data/hubot
    yo hubot

    然后会问你安装什么样的 adapter,手工输入 slack。

    ly@fsckzy:~/hubot$ yo hubot
    ? ==========================================================================
    We're constantly looking for ways to make yo better!
    May we anonymously report usage statistics to improve the tool over time?
    More info: https://github.com/yeoman/insight & http://yeoman.io
    ========================================================================== Yes
                         _____________________________
                        /                             
       //              |      Extracting input for    |
      ////    _____    |   self-replication process   |
     //////  /_____                                /
     ======= |[^_/\_]|   /----------------------------
      |   | _|___@@__|__
      +===+/  ///     \_
       | |_ /// HUBOT/\
       |___///      /  \
                   /   +---+
              \____/    |   |
               | //|    +===+
                //      |xx|

    ? Owner yangroupaomo
    ? Bot name hubot
    ? Description sa
    ? Bot adapter slack
       create bin/hubot
       create bin/hubot.cmd
       create Procfile
       create README.md
       create external-scripts.json
       create hubot-scripts.json
       create .gitignore
       create package.json
       create scripts/example.coffee
       create .editorconfig
                         _____________________________
     _____              /                             
                      |   Self-replication process   |
     |    |    _____    |          complete...         |
     |__\|   /_____        Good luck with that.    /
       |//+  |[^_/\_]|   /----------------------------
      |   | _|___@@__|__
      +===+/  ///     \_
       | |_ /// HUBOT/\
       |___///      /  \
                   /   +---+
              \____/    |   |
               | //|    +===+
                //      |xx|
    ......
    ......

    缺省安装的 hubot,会带上 heroku 和 redis,如果用不到的话,可以卸载掉:

    npm uninstall hubot-heroku-keepalive --save

    在 hubot 目录下的 external-scripts.json 文件中把有关 heroku 和 redis 的两行删掉就行了,否则老是会报几个警告。 然后,再把 hubot-scripts.json 删掉,目前我们暂时还用不到它:

    rm -f hubot-scripts.json

    好了,现在总算可以了。用一下看看吧:

    ./bin/hubot

    执行:

    hubot help
    hubot ping

    ctrl+c可以退出。

    连接 hubot 和 slack

    在 slack 上注册个账号,然后按照 hubot 插件,会自动生成一个 token,记录下来,启动机器人的时候命令如下:

    env HUBOT_SLACK_TOKEN=xoxb-1xxxxxx-xxxxx ./bin/hubot --adapter slack

    这时候 hubot 就启动起来,等待接收命令了。但是由于 hubot 缺省加入的是 slack 的 #general 频道,如果你改掉了频道名字,或者删掉了这个频道的话,你需要重新邀请小机器人进入一个新的频道,否则没法对话。

    现在你可以在 slack 的客户端和小机器人对话了,命令还是同上:

    hubot help

    让 hubot 保持在线

    但是如果这时候我们关掉 ssh 的话,机器人就掉线了,怎么办呢?可以用 nohup 的方法让它留在后台,也可以用 tmux:

    yum install tmux
    tmux new -s hubot

    在 tmux 里执行上面的命令,然后按ctrl+b,然后再按d退出。如果再想进去,可以执行:

    tmux a -t hubot

    让 hubot 执行 shell 脚本

    这还没有完,我们需要小机器人来执行一些 shell 脚本,所以我们需要安装:

    npm install hubot-script-shellcmd
    cp -R node_modules/hubot-script-shellcmd/bash ./

    修改一下 external-scripts.json ,添加上以下模块:hubot-script-shellcmd 。如果到此为止,你操作的步骤和我基本一样的话,你的 external-scripts.json 应该长的像这个样子:

    [
      "hubot-diagnostics",
      "hubot-help",
      "hubot-google-images",
      "hubot-google-translate",
      "hubot-pugme",
      "hubot-maps",
      "hubot-rules",
      "hubot-shipit",
      "hubot-script-shellcmd"
    ]

    接下来:

    cd bash/handlers

    这里面的 helloworld 就是个例子

    #!/bin/bash
    echo "Hello.."
    sleep 1s;
    echo "Sleepy World!"

    exit 0

    好了,现在你重启一下小机器人,在你的 slack 端对机器人说:

    hubot shellcmd hello

    发散一下思维,创建一个 any 的 shell 脚本

    #!/bin/bash

    ansible $1 -m shell -a "$2"

    我现在要查看 10.16.55.173 的空间使用率的咋办?在 slack 对机器人说:

    hubot shellcmd any 10.16.55.173 df -h

    可选操作

    由于每次启动hubot时,都需要执行以下一串长长的命令:

    env HUBOT_SLACK_TOKEN=xoxb-你的token ./bin/hubot --adapter slack

    如果你不想这么麻烦的话,可以在 .bashrc 添加环境变量

    export HUBOT_SLACK_TOKEN=xoxb-1273359736209-1270164306356-TtTMbchRgskUYfU9jmUhWngt

    这样启动机器的时候就这样启动就行了:

    ./bin/hubot --adapter slack

    同样,如果你嫌 shellcmd 太长的话,也可以加下这一句:

    export HUBOT_SHELLCMD_KEYWORD=run

    这样你以后再需要 hubot 帮你执行命令的时候,只要说这一句就行了:

    hubot run hello
  • 相关阅读:
    Jquery里live事件移除原因
    js委托事件-addEventListeners(冒泡方向)
    后端同同不肯给我算好的时间差给我,只好自己写了:
    js滚动到顶部底部代码
    浏览器地址栏运行HTML代码(谷歌)
    黑马vue---56-58、vue组件创建的三种方式
    黑马vue---46、vue使用过渡类名实现动画
    黑马vue---28、vue中全局过滤器的基本使用
    vue devtools无法使用
    红心点赞效果的实现
  • 原文地址:https://www.cnblogs.com/fsckzy/p/13597191.html
Copyright © 2011-2022 走看看