インフラ運用管理ツール
と
Golang
TIS株式会社
池田 大輔
Hello!
I am Daisuke IKEDA (@ike_dai)
TIS Inc. OSS Promotion Office.
Zabbix Specialist
Golang?
Ref. https://golang.org/
Googleが開発するOSSのプログラミング言語
Shellスクリプトで運用のための処理プログラム作ったり
e.g.
AWS操作用スクリプト
DBバックアップ用スクリプト
That happens
・スクリプトを動かすためにツール等が必要
・Shellスクリプトでの処理の面倒さ
 (JSONやXMLのパースとか)
What’s concern?
Golangってどうよ?
1
One binary file
Golang builds one binary file.
Easy build
$ go build sample.go
$ ls -lh
-rwxr-xr-x 1 ike_dai staff 2.2M 4 19 23:35 sample
-rw-r--r-- 1 ike_dai staff 77B 4 19 23:35 sample.go
$ ./sample
Hello World
$ go run sample.go
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
※都度buildしなくてもgo runで即時実行可
2
Cross platform
The same code for Linux, Windows, MacOS
Cross Compile
$ GOOS=linux GOARCH=amd64 go build sample.go
Linux
Windows
MacOS
$ GOOS=windows GOARCH=amd64 go build sample.go
$ GOOS=darwin GOARCH=amd64 go build sample.go
3
Various library
Golang have so many efficient libraries.
[Golang標準ライブラリ]
flag : コマンドライン引数処理
log : ログ出力
net: ネットワーク通信関連処理
time: 時刻処理
encoding/json : JSON形式のデータ処理
encoding/xml : XML形式のデータ処理
等
Golang library
[Zabbix]
Zabbix API library
https://github.com/AlekSi/zabbix
Zabbix Sender
https://github.com/AlekSi/zabbix-sender
Golang library
[AWS]
AWS API library (AWS official)
https://github.com/aws/aws-sdk-go
Golang library
なければ作ればいい
[JobScheduler]
JobScheduler API library
https://github.com/ike-dai/go-jobscheduler
Golang library
Go Doc
GitHubにコミットすれば
自動的にコメントの内容や
メソッド、構造体をもとに
ドキュメントサイトが生成
https://godoc.org/github.com/ike-dai/go-jobscheduler/jobscheduler
4
Rich compiler
Golang compiler is so kind.
Go Compiler
単純に動く動かないの構文チェックだけじゃなく
 ・使っていないパッケージをimportしていることを指摘とか
 ・使っていないのに変数定義していることを指摘とか
Code Build result
package main
import "fmt"
func main() {
sample_var := "test"
fmt.Println("Hello World")
}
$ go build sample.go
# command-line-arguments
./sample.go:6: sample_var declared and
not used
5
Easy Parallel processing
Go routine and channel architecture.
Go routine & channel
関数にgoつけて実行するだけで非同期並列処理化
並列処理間のデータ連携にはchannelで送受信
package main
import "fmt"
func main() {
fmt.Println("Hello World")
ch := make(chan int)
go backend_process(ch)
receive := <-ch
fmt.Println(receive)
}
func backend_process(ch chan int) {
fmt.Println("Backend Process")
ch <- 1
}
$ go run sample.go
Hello World
Backend Process
1
Go routine & channel
関数にgoつけて実行するだけで非同期並列処理化
並列処理間のデータ連携にはchannelで送受信
package main
import "fmt"
func main() {
fmt.Println("Hello World")
ch := make(chan int)
go backend_process(ch)
receive := <-ch
fmt.Println(receive)
}
func backend_process(ch chan int) {
fmt.Println("Backend Process")
ch <- 1
}
$ go run sample.go
Hello World
Backend Process
1
複数処理を並行で
バックエンド処理させるのが簡単
I tried!
ZabbixでAWSの状況を監視するテンプレート
AWSとZabbixとの連携処理をGolangで実装
1コマンドで処理可能
・EC2インスタンスの情報取得
・CloudWatchの情報取得
・Zabbix Senderプロトコルを話してZabbixに連携
ZAWS (Zabbix AWS monitoring template)
https://github.com/ike-dai/zaws
Case
運用管理系ツール展開のHashicorp社のGolangツール
・Serf
・Consul
・Terraform
・Otto
・Nomad
DockerもGolang製
Conclusion
Let’s try together!
ノウハウ等、まだ少ないところはあるが可能性は十分あり
さくっと試して日頃の業務を改善するには便利
作ったものを配布、敷居低く試してもらうにはもってこい!
Thanks!
Any questions?
You can find me at @ike_dai & dai.ikd123@gmail.com

インフラ運用管理ツールとGolang OSS運用管理勉強会LT