Vagrant + DigitalOcean + Ansibleで環境構築

ものすごく今更ながら、実践Vagrantを見ながら、Vagrantを試してる。

実践 Vagrant

実践 Vagrant

ついでに気になってたDigitalOceanも試したかったので、 VagrantとSSDなVPS(Digital Ocean)で1時間1円の使い捨て高速サーバ環境を構築する - Glide Note - グライドノート を参考に、DigitalOceanにVagrant+Ansibleで環境を構築する方法を試したので、メモ。

Vagrantのインストール

Download Vagrant - Vagrantからバイナリをダウンロード。

Ansibleのインストール

プロビジョニングには今回Ansibleを使用。インストールはpipから。

pip install ansible

DigitalOcean Pluginのインストール

標準のproviderではDigitalOceanは存在しないが、Pluginが既にあるので、インストール。

https://github.com/smdahlen/vagrant-digitalocean

vagrant plugin install vagrant-digitalocean

MacだとDigital OceanのAPIを叩くためには追加で下記をインストールする必要があるみたい。

 brew install curl-ca-bundle

インストール後、.zshrc等に環境変数をセット

export SSL_CERT_FILE=/usr/local/opt/curl-ca-bundle/share/ca-bundle.crt

DigitalOceanのアカウント作成

DigitalOceanからアカウントを作成。

アカウント作成後、管理画面からssh keyの登録とAPI keyの発行を行う。

ssh keyの登録

API keyの発行

Vagrantfileの作成

インスタンスは最小プラン(512MB)、RegionはSingaporeの構成で作成する想定。 注意点としては、「provider.client_id」、「provider.api_key」、「provider.ssh_key_name 」をssh keyの登録やAPI keyの発行で確認したものにきちんと設定すること。

# -*- mode: ruby -*-
# vi: set ft=ruby :


Vagrant.configure('2') do |config|

  config.vm.hostname = "digital-ocean-test"

  config.vm.provider :digital_ocean do |provider, override|
    override.ssh.private_key_path = '~/.ssh/id_rsa'
    override.vm.box = 'digital_ocean'
    override.vm.box_url = "https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box"

    provider.client_id = 'API key発行時に確認したClient ID'
    provider.api_key = 'API key発行時に確認したAPI key'

    provider.region = 'Singapore 1'
    provider.size = '512MB'
    provider.ssh_key_name = 'ssh key登録時に登録したssh key name'
  end

  config.vm.provision :ansible do |ansible|
    ansible.playbook = "provision_vagrant.yml"  # playbookファイル名
    ansible.host_key_checking = false
  end
end

playbookの作成

ansibleでprovisionするためにplaybookを作成。 provisoningの内容は、実践Vagrantの例の通り。

  1. Apacheをインストール。
  2. /var/wwwを/vagrantのsymlinkにする

playbookのファイル名は「provision_vagrant.yml」で作成。

- hosts: default
  user: root
  tasks:
      - apt: pkg=apache2 update_cache=yes state=latest
      - file: path="/var/www" state=absent
      - file: src="/vagrant" dest="/var/www" state=link

DigitalOceanではユーザ名がrootで作成されるので、「user」を「root」にすること。

Ansibleでは通常provisoning先をINVENTORY FILEに記載する必要があるが、DigitalOcean等、ローカル以外の環境に作成する場合は、IPアドレスが作成後に決まる為、事前にINVENTORY FILEを用意することができない。

Vagrantではこの問題を解消するために、INVENTORY FILEを指定しない場合は、自動でINVENTORY FILEを作成し、それを使用してprovisioningを行ってくれる。*1

vm名をVagrantfileで指定しない場合は、「default」で生成されるので、「hosts」についても「default」を指定。

あと、実践Vagrantにならって、index.htmlも用意しておく。

<strong>Hello</strong>

インスタンスの作成

上記まで用意できたら、あとはVagrantを実行するだけ、providerとしてDigitalOceanを指定して起動。

vagrant up --provider=digital_ocean

起動後はsshでアクセス

vagrant ssh

後はブラウザでアクセスして下記のように表示されれば、OK

f:id:wkcrobin:20140310003616p:plain

使い終わったら、destroyでインスタンスを破棄。

vagrant destroy

参考

http://blog.glidenote.com/blog/2013/12/05/digital-ocean-with-vagrant

https://github.com/smdahlen/vagrant-digitalocean

https://docs.vagrantup.com/v2/provisioning/ansible.html

http://qiita.com/seizans/items/54da2077ac8e2dcf5d6f

http://docs.ansible.com/file_module.html