Vagrant + Ansible で環境管理する
やりたいこと
- Ansibleのplaybookを作りたい
- playbookの開発はVagrantで建てたVMでサクサクやりたい
- playbookはそのままプロダクション環境のサーバにも適用させたい
- プロダクション環境のサーバはVagrantとは関係なく起動している状態
準備
playbookの開発ではvagrant up
したサーバにplaybookが適用したいので、vagrant-ansible
をインストール。
あとは簡単にrollback
できるようにsahara
を入れたり。
playbookの開発
playbook.yml
- hosts: '{{host}}' vars: host: 'vagrant' message: 'hoge' tasks: - shell: echo {{message}}
ansible_hosts
[vagrant] 192.168.192.168 [production] xxx.xxx.xxx.xxx
Vagrantfile
AGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.network :private_network, ip: "192.168.192.168" config.vm.provision :ansible do |ansible| ansible.playbook = "playbook.yml" ansible.inventory_file = "ansible_hosts" end end
こんな感じで必要なファイルを用意して、Vagrantfileに設定しておく。
これで、vagrant provision
でplaybook.ymlに書かれた内容がvagrant up
したVMに反映されるので、
あとはvagrant provision
→vagrant sandbox rollback
をループすれば良い。
ちなみにvagrant provision
の実行結果はこんな感じ。
[default] Running provisioner: ansible... PLAY [vagrant] **************************************************************** GATHERING FACTS *************************************************************** ok: [192.168.192.168] TASK: [shell echo hoge] ******************************************************* changed: [192.168.192.168] PLAY RECAP ******************************************************************** 192.168.192.168 : ok=2 changed=1 unreachable=0 failed=0
プロダクション環境への反映
第2の目的である、プロダクション環境のサーバにも同じplaybookで反映させることを考える。 playbookを書き換えたりプロダクション用のを用意するとかいうのは面倒なので、できればパラメータ指定程度で乗り切りたい。
ここで、playbook.ymlのhostsを変数で指定してあるので
ansible-playbook playbook.yml -i ansible_hosts --extra-vars "host=production"
こんな感じで実行時パラメータとしてホスト名を渡すと、デフォルトで設定されているvars.host = vagrant
が上書きされて対象サーバがproductionに変わる。
実行結果はこんな感じ。
PLAY [production] ***************************************************************** GATHERING FACTS *************************************************************** ok: [xxx.xxx.xxx.xxx] TASK: [shell echo hoge] ******************************************************* changed: [xxx.xxx.xxx.xxx] PLAY RECAP ******************************************************************** xxx.xxx.xxx.xxx : ok=2 changed=1 unreachable=0 failed=0
ちゃんと対象サーバが切り替わっていることが分かる。
まとめ
開発するときは
vagrant provision
正式に反映したいときは
ansible-playbook playbook.yml -i ansible_hosts --extra-vars "host=production"