Makefileを使って、vagrant+ansibleで環境構築するのをちょっと楽する

3 min read読了の目安(約2200字

ansible と vagrant で環境を構築する際、仮想環境を壊したり・作成したり・ansible 走らせたりでいくつかのコマンドを何回も打つことになります。
そういった時自分は Makefile を使ってちょっとだけ楽しているのでその方法を紹介します。

フォルダ構成

.
├── Makefile
├── Vagrantfile
├── ansible.cfg
├── hosts
├── ssh_config # gitignoreする
├── playbook.yml # ↓これ以下は普通のansibleと同じです
├── roles/
├── var_groups/
└── vars/

Makefile

冒頭で触れたように頻繁に打つコマンドをまとめています。
意外と引数は忘れがち(何回もvagrant destroy -f-fを忘れる)なので一行だけでも Makefile に入れるのと便利です。
shell でも同様のことができますが、手軽さ的に私はMakefileを使います。

Makefile は以下のようにしています。
適宜必要に応じて作成しましょう。

make help を実行すると、コマンド一覧が表示されます。
地味に便利です。

vup: ## 仮想環境起動
	vagrant up
	vagrant ssh-config > ssh_config

vdestroy: ## 仮想環境削除
	vagrant destroy -f

vinit: ## 仮想環境起動 + ansible実行
	make vup
	make play

play: ## ansible実行
	ansible-playbook -i hosts playbook.yml

check: ## ansible実行(チェック)
	ansible-playbook -i hosts playbook.yml --check

help: ## ヘルプを表示します
	 @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'

Vagrantfile

今回は awslinux に対して処理を行うことを想定しています。
Connection timeoutになるときがあるので、vbox.customize ["modifyvm", :id, "--cableconnected1", "on"]を設定しています。

https://qiita.com/chatii0079/items/b60abd6ab2822b49290a
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "mvbcoding/awslinux"

  config.vm.provider :virtualbox do |vbox|
    vbox.customize ["modifyvm", :id, "--cableconnected1", "on"]
  end

  config.vm.network "private_network", ip: "192.168.33.25"
end

ansible.cfg

ansible の ssh に vagrant を立ち上げるときに生成した ssh_config を指定します。

[ssh_connection]
ssh_args = -F ssh_config

hosts

こちらは host を default に指定しています。

[develop]
default ansible_host=default

ssh_config

ansible.cfghostsssh_config 情報を元に ansible は ssh 接続を行うように設定しています。
vagrant up するたびに key の内容が異なるので毎回忘れず生成してください。
ここを忘れやすいので Makefilevagrant up と同時に実行しています。

また、毎回生成するので gitignore しておきます。

vagrant ssh-config > ssh_config

その他

その他の playbook 等は特に変わったことしておらず、通常の ansible と同じです。

まとめ

Makefile というとビルドする時に使うイメージが強いですが、コマンドを並べるだけの簡単なスクリプトにも使えるので試してみてください。
ちなみに僕は docker とかでも同じように使っています。

追記:Gist にコード追加しました。

https://gist.github.com/orange634nty/44e1626933ce75f2c62f2c3a7080179e