Ansible Slack module をラップして使う

この記事は、Ansible Blogger Advent Calendar 2018 の4日目の記事です。

いつも使っているslack moduleを使いやすくするtips

## サンプル

以下のレポジトリにサンプルを載せています。

https://github.com/yyoshiki41/ansible-library-slack-example

## ラップして使う

slack module に限らず、複数のパラメータが用意されています。
よく使うmoduleにはラッパーを用意して、使ったりするとプレイブックが少しだけ短く出来ます。

### e.g.) `library/slack/tasks/main.yml`

`library` ディレクトリに各パラメータを書き、`| default('')` 記法でデフォルト値を用意してきます。

```yaml
---

- name: Send notification message via Slack
  local_action:
    module: slack
    channel: "{{ channel | default('#ansible-notification') }}"
    color: "{{ color | default('normal') }}"
    icon_emoji: "{{ icon_emoji | default(':sunglasses:') }}"
    link_names: "{{ link_names | default(1) }}"
    msg: "{{ msg | default('message from ansible') }}"
    parse: "{{ parse | default('none') }}"
    token: "{{ lookup('env', 'SLACK_TOKEN') }}"
    username: "{{ username | default('Ansible') }}"
```

実行したい場合は以下のように`include`して、デフォルトではなく変更したいパラメータを`vars`で渡してあげます。(変数指定しなかったパラメータには、上記のデフォルト値が使われます。)

```yml
  tasks:
    - include: ./../library/slack/tasks/main.yml
      run_once: true
      vars:
        - channel: "#ansible-example"
        - color: "good"
        - msg: "hello"
```

---

ここからは、slack moduleに限らずのものです。

## token の管理

クレデンシャルの管理には、`ansible-vault`を使うのがてっとり早いかと思います。
上の例では、`lookup('env', 'SLACK_TOKEN')` で環境変数から取得しています。
(`lookup('file', '{{ playbook_dir }}/.secret/slack_token')`として、staticなファイルから読み込むことも可能です。）

## 一度だけ実行

複数ホストへのタスク実行時にも通知は１回にしたい場合
上の例ではタスクを`run_once: true`として、1度だけ実行されるようにしています。
その他にも、`delegate_to: localhost`でansibleコマンドを実行元のホスト上でだけ実行するのでも同様です。

## ドキュメントをみる

パラメータや例を確認したい場合、`ansible-doc` コマンドが便利です。
ブラウザを開かずに確認できます。

```bash
$ ansible-doc slack
```

```bash
# スニペットが見たい場合
$ ansible-doc -s slack
- name: Send Slack notifications
  slack:
      attachments:           # Define a list of attachments. This list mirrors the Slack JSON API. For more information, see also
                               in the (https://api.slack.com/docs/attachments).
      channel:               # Channel to send the message to. If absent, the message goes to the channel selected for the
                               `token'.
      color:                 # Allow text to use default colors - use the default of 'normal' to not send a custom color bar at
                               the start of the message
      icon_emoji:            # Emoji for the message sender. See Slack documentation for options. (if `icon_emoji' is set,
                               `icon_url' will not be used)
      icon_url:              # Url for the message sender's icon (default `https://www.ansible.com/favicon.ico')
      link_names:            # Automatically create links for channels and usernames in `msg'.
      msg:                   # Message to send. Note that the module does not handle escaping characters. Plain-text angle
                               brackets and ampersands should be converted to HTML entities (e.g.
                               & to &amp;) before sending. See Slack's documentation
                               (https://api.slack.com/docs/message-formatting) for more.
      parse:                 # Setting for the message parser at Slack
      token:                 # (required) Slack integration token.  This authenticates you to the slack service. Prior to 1.8, a
                               token looked like `3Ffe373sfhRE6y42Fg3rvf4GlK'.  In 1.8 and above,
                               ansible adapts to the new slack API where tokens look like
                               `G922VJP24/D921DW937/3Ffe373sfhRE6y42Fg3rvf4GlK'.  If tokens are in
                               the new format then slack will ignore any value of domain.  If the
                               token is in the old format the domain is required.  Ansible has no
                               control of when slack will get rid of the old API.  When slack does
                               that the old format will stop working.  ** Please keep in mind the
                               tokens are not the API tokens but are the webhook tokens.  In slack
                               these are found in the webhook URL which are obtained under the
                               apps and integrations. The incoming webhooks can be added in that
                               area.  In some cases this may be locked by your Slack admin and you
                               must request access.  It is there that the incoming webhooks can be
                               added.  The key is on the end of the URL given to you in that
                               section.
      username:              # This is the sender of the message.
      validate_certs:        # If `no', SSL certificates will not be validated. This should only be used on personally controlled
                               sites using self-signed certificates.
```

## 終わり

slack module 限定ではなく、他のmoduleをlibraryしておくと便利だったり。
また `ansible-doc` でのパラメータ確認は、ansible使いには嬉しい機能なので抑えておきたいですね！