Vagrant + Ansible で環境管理する

やりたいこと

  1. Ansibleのplaybookを作りたい
  2. playbookの開発はVagrantで建てたVMでサクサクやりたい
  3. 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 provisionvagrant 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"