Ansible Advent Calendar 2019 2日目ーーー
qiita.com
1日目は sky_jokerxx さんのこちらの記事でした。
sky-joker.tech
2018 の Ansible Advent Calendar ではこんな記事を書いていた。
rarirure.rip
モジュールを作った経緯
社内で使っているコンポーネントの管理を IaC にしたかった。
コンポーネントを作った人は Terraform のモジュールを提供されたけど、Ansible のモジュールを作って運用したかった。
Go で Ansible モジュール作るのは簡単
type Response struct { Msg string `json:"msg"` Changed bool `json:"changed"` Failed bool `json:"failed"` }
これを、json で標準出力に返せばいいだけ。
Failed じゃないなら os.Exit(0) で返せばいいし、Failed なら os.Exit(1) で返す。
バイナリを作る
僕は会社では Mac、家では Linux なのでバイナリは Linux と Darwin 向けに作る。
こんな感じの Makefile を用意しておく。
build-darwin: @GOOS=darwin go build -o ../library/hoge_node_darwin cmd/hoge/node/main.go @GOOS=darwin go build -o ../library/hoge_pool_darwin cmd/hoge/pool/main.go @GOOS=darwin go build -o ../library/hoge_monitor_darwin cmd/hoge/monitor/main.go @GOOS=darwin go build -o ../library/hoge_pool_member_darwin cmd/hoge/pool_member/main.go @GOOS=darwin go build -o ../library/hoge_vip_darwin cmd/hoge/vip/main.go @GOOS=darwin go build -o ../library/hoge_address_darwin cmd/hoge/address/main.go @GOOS=darwin go build -o ../library/hoge_address_set_darwin cmd/hoge/address_set/main.go @GOOS=darwin go build -o ../library/hoge_policy_darwin cmd/hoge/policy/main.go build-linux: @GOOS=linux go build -o ../library/hoge_node_linux cmd/hoge/node/main.go @GOOS=linux go build -o ../library/hoge_pool_linux cmd/hoge/pool/main.go @GOOS=linux go build -o ../library/hoge_monitor_linux cmd/hoge/monitor/main.go @GOOS=linux go build -o ../library/hoge_pool_member_linux cmd/hoge/pool_member/main.go @GOOS=linux go build -o ../library/hoge_vip_linux cmd/hoge/vip/main.go @GOOS=linux go build -o ../library/hoge_address_linux cmd/hoge/address/main.go @GOOS=linux go build -o ../library/hoge_address_set_linux cmd/hoge/address_set/main.go @GOOS=linux go build -o ../library/hoge_policy_linux cmd/hoge/policy/main.go build: $(MAKE) build-darwin $(MAKE) build-linux test-darwin: $(MAKE) build-darwin @cd .. && ansible-playbook -i inventory hoge_darwin.yml -vv test-linux: $(MAKE) build-linux @cd .. && ansible-playbook -i inventory hoge_linux.yml -vv
使う
--- tasks: - name: create node hoge_node_linux: name: unchi address: 10.194.4.32 port: 80 state: present
上記のタスクを用意したとき hoge_node_linux というファイル名のバイナリが ./library というディレクトリにあれば使える。
ただこれだと、Darwin でこのタスクは実行できないので、main.yml で分岐させる。
--- - name: get os command: uname delegate_to: 127.0.0.1 become: no register: executed_os - import_tasks: linux.yml when: executed_os.stdout == "Linux" - import_tasks: darwin.yml when: executed_os.stdout == "Darwin"
これは Go で作る上でしょうがないけど、まあ仕方ない。
最後に
少しでも Go が書けるなら Ansible モジュールも簡単に作れる。
あと、この記事の趣旨とは違うけど Ansible はよく ”VM にパッケージ入れたり設定するツール” という思い込んでる人がいるかもしれませんが
AWS を始めとした GCP や Azure などのパブリッククラウド、OpenStack や Proxmox のリソース自体も弄れることを知って欲しいです。
なんだったら、Alibaba にも対応してます。
パブリッククラウドは頻繁に新しいサービスがローンチされますが、Ansible は結構早めにそれに追従してくれてます(モジュールを作って PR 出せば良いだけ)。
リソース管理を Terraform じゃなくて、Ansible という手もアリだと思ってます。