Go製のツール ( MackerelCPUAlertTool ) をAnsibleでEC2インスタンスにデプロイする
目的
Goで作成したインフラツールをAnsibleを使ってサーバにデプロイしたときの方法をまとめる。 今回デプロイするGoツールは以前に作成した以下のブログのものを利用する。
実行方法
- systemdでservice/timerを作成してmackerel-agentの監視間隔と同様に1分毎にGoツールを実行させる。
Slack_URL
とSlackチャンネル
は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をコンパイルしてサーバにデプロイするのが楽になりました。