Makefileを使って、vagrant+ansibleで環境構築するのをちょっと楽する
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"]
を設定しています。
# -*- 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.cfg
と hosts
に ssh_config
情報を元に ansible は ssh 接続を行うように設定しています。
vagrant up
するたびに key の内容が異なるので毎回忘れず生成してください。
ここを忘れやすいので Makefile
で vagrant up
と同時に実行しています。
また、毎回生成するので gitignore しておきます。
vagrant ssh-config > ssh_config
その他
その他の playbook 等は特に変わったことしておらず、通常の ansible と同じです。
まとめ
Makefile というとビルドする時に使うイメージが強いですが、コマンドを並べるだけの簡単なスクリプトにも使えるので試してみてください。
ちなみに僕は docker とかでも同じように使っています。
追記:Gist にコード追加しました。
Discussion