codecamp

Ansible 发送 notification 到 Slack

Slack 是当前火红的线上通讯服务,在台湾业界 1 也有许多开发团队在使用。除了可以用它与内部成员沟通外,透过发送通知讯息 (notification)、聊天机器人 (Chatbot) 等的资讯整合后,更发展出 ChatOps 2 一词来形容这样子的生态系。这次就让冻仁分享一下 Ansible 整合 Slack 的小小心得。

automate_with_ansible_practice-21.jpg 

▲ 上图为 Ansible 发送 notification 到 Slack 的范例。

slack module 是什么?

slack module 是用来发送讯息到 Slack 上的通知模组 (notification modules),并借由整合 Slack Incoming Webhook 功能进行使用。

Ansible 怎么整合 Slack?

  1. 撰写发送 notification 到 Slack 的 Playbook:请依步骤 2 取得的参数设定 slack_domainslack_token 和 slack_channel 等变数,若要发送 notification 到某个 Channel,可改用 #channel_name

     $ vi send_notification_to_slack.yml
     ---
     - name: Send notification to Slack
       hosts: localhost
    
       vars:
         slack_domain: 'example.slack.com'
         slack_token: 'xxxxxxxxxxxxxxxxxxxxxxxx'
         slack_channel: "@username"
    
       post_tasks:
         - name: send notification to slack
           slack:
             domain: ""
             token: ""
             username: "ansible"
             channel: ""
             color: "normal"
             msg: "Send a notification with Ansible !"
    
     # vim: ft=ansible :
    
  2. 取得 Slack 的相关设定。

    1. 登入 Slack 后,进入 Mamage (管理) 界面。

      2016-12-16-ansible-slack-1.png

    2. 进入 Custom Integrations (自定整合),并找到 Incoming WebHooks。

      2016-12-16-ansible-slack-2.png

    3. 点击 Add Configuration 新增一个 WebHooks 给 Ansible 使用。

      2016-12-16-ansible-slack-3.png

    4. 新增好 WebHooks 后的画面如下。

      2016-12-16-ansible-slack-4.png

    5. 将页面往下卷至 Integration Settings (整合设定) 。

      2016-12-16-ansible-slack-5.png

    6. 设定 Post to Channel (预设发送频道) :可先用 @username 进行测试。

    7. 取得 Webhook URL:以底下的 URL 为例,其中的 CCCCCCCCCCCCCCCCCCCCCCCC 即为 slack module 中的 token,也就是 send_notification_to_slack.yml Playbook 里所缺少的 slack_token

      https://hooks.slack.com/services/AAAAAAAAA/BBBBBBBBB/CCCCCCCCCCCCCCCCCCCCCCCC

    8. 最后上传一张 Ansible 的图示以利辨识。

      2016-12-16-ansible-slack-6.png

  3. 执行 Playbook。

     $ ansible-playbook send_notification_to_slack.yml
    
     PLAY [Send notification to Slack] **********************************
    
     TASK [setup] *******************************************************
     ok: [localhost]
    
     TASK [send notification to slack] **********************************
     ok: [localhost]
    
     PLAY RECAP *********************************************************
     localhost      : ok=2    changed=0    unreachable=0    failed=0
    
  4. 在 Slack 接收从 Ansible 送出的 notification。

    2016-12-16-ansible-slack-7.png

  5. 现在我们的成功把 Ansible 和 Slack 整合好了!

顺带一提,若不想在每个 Playbooks 都重复宣告 slack_domainslack_token 和 slack_channel 等变数,可使用「Ansible 使用 Template 系统」一章提到的 vars_files 进行改写。

后话

让 Ansible 发送 notifications 到 Slack 后,我们除了可以提醒自己有哪些 Playbooks 完成外,更可便于其它成员追踪相关任务的进度和执行状态等。

相关连结

1. 冻仁之前任职的 commandp Inc. 即为 Slack 的商业用户之一。 ↩
2. ChatOps 一詞凍仁曾在「怎么部署 Ansible 环境?」一章有提过,相信已有不少公司会借由 Slack 这类的服务进行协同作业。 ↩


Ansible 在 Playbooks 使用 Handlers
Ansible 发送 notification 到 HipChat
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }