My Note

自己理解のためのブログ

Go製のツール ( MackerelCPUAlertTool ) をAnsibleでEC2インスタンスにデプロイする

目的

Goで作成したインフラツールをAnsibleを使ってサーバにデプロイしたときの方法をまとめる。 今回デプロイするGoツールは以前に作成した以下のブログのものを利用する。

yhidetoshi.hatenablog.com

実行方法

  • systemdでservice/timerを作成してmackerel-agentの監視間隔と同様に1分毎にGoツールを実行させる。
  • Slack_URLSlackチャンネルはansibleの変数として渡す。
  • goのコンパイルMakefileにgoxコマンドを実行させて、クロスコンパイルする
  • アラート一覧にCPUアラート発生、かつ、自ホストIDが存在する場合にslackの障害通知チャンネルにcpu使用率の高い5つのプロセスリストとCPUメトリクス情報を投稿する。
  • mackerel-client-goを利用

検証環境

  • AWS EC2
    • Ubuntu16.04
  • ansibleバージョン
    • 2.7.1
  • 開発環境
    • Goland

Ansibleの構成とファイル(必要なところだけ抜粋)

vars

■ roles/mackerel/vars/main.yml

mackerel_alert_slack_url: "https://hooks.slack.com/services/XXXXXXXXXXXXX"
mackerel_alert_slack_channel: "alert"
admin_user: ubuntu

tasks

■ roles/mackerel/tasks/main.yml

- name: Install packages from apt
  apt:
    name:
      - golang-go
    state: latest
    update_cache: yes
    autoremove: yes
  become: yes


- name: make dir for compile go-tool
  file:
    path: ~/mackerel-tool
    state: directory
    owner: "{{ admin_user }}"
    group: "{{ admin_user }}"


- name: Copy mackerel cpu-alert-tool script
  template:
    src: mackerelCPUProcListTool.go.j2
    dest: ~/mackerel-tool/mackerelCPUProcListTool.go
    mode: 0744
  register: go_cpu_file


- name: Copy makefile for mackerel cpu-alert-tool
  template:
    src: Makefile.j2
    dest: ~/mackerel-tool/Makefile
    mode: 0744
  register: go_makefile


- name: Compile go code
  command: "{{ item }} chdir=~/mackerel-tool/"
  with_items:
  - make setup
  - make cross-build
  when: go_cpu_file.changed or go_makefile.changed


- name: Copy mackerel cpu-alert-tool service
  template:
    src: mackerel_cpu_alert.service.j2
    dest: /etc/systemd/system/mackerel_cpu_alert.service
  become: yes


- name: Copy hardware_alert timer
  template:
    src: mackerel_cpu_alert.timer.j2
    dest: /etc/systemd/system/mackerel_cpu_alert.timer
  become: yes


- name: Ensure start mackerel cpu-alert-tool timer
  systemd:
    state: started
    daemon_reload: yes
    enabled: yes
    name: mackerel_cpu_alert.timer
  become: yes

templates

■ roles/mackerel/templates/Makefile.j2

GOCMD=go
GOBUILD=$(GOCMD) build
GOGET=$(GOCMD) get

 .PHONY: setup
## Install dependencies
setup:
    $(GOGET) github.com/mitchellh/gox
    $(GOGET) github.com/tcnksm/ghr
    $(GOGET) -d -t ./...

 .PHONY: cross-build
## Cross build binaries
cross-build:
    rm -rf /path/to/mackerelCPUAlertList
    /home/ubuntu/go/bin/gox -os=linux -arch=amd64 -output=/path/to/mackerelCPUProcList

■ roles/mackerel/templates/mackerel_cpu_alert.service.j2

[Unit]
Description=mackerel cpu alert to slack
After=network.target

[Service]
ExecStart=/path/to/mackerelCPUProcList
Type=oneshot

[Install]
WantedBy=multi-user.target

■ roles/mackerel/templates/mackerel_cpu_alert.timer.j2

[Unit]
Description=Check mackerel_cpu_alert every 1 minutes.

[Timer]
OnBootSec=10min
OnUnitActiveSec=1min

[Install]
WantedBy=timers.target

■ roles/mackerel/templates/mackerelCPUProcListTool.go.j2

https://github.com/yhidetoshi/mackerelAlerProcListTool/blob/master/main.go

まとめ

GolandでコーディングしたGoのインフラツールをAnsibleでEC2インスタンスにデプロイする方法をまとめました。 Makefileとgoxの利用するとGoをコンパイルしてサーバにデプロイするのが楽になりました。