Vagrant と Azure で使い捨て開発環境をさくっと作る


Azure には [コマンドラインツール](http://www.windowsazure.com/ja-jp/manage/linux/other-resources/command-line-tools/) が用意されていて、Vagrant 経由でなくても簡単にサーバを作って消してができる。けれども Vagrant を使うと chef とか ansible とかもろもろ使ってプロビジョニングまで一気通貫で出来るので、大変便利になる。

## 0. 準備

### Azure のアカウントを作る
http://azure.microsoft.com/ からポチポチっと。


### Vagrant をインストールする
http://www.vagrantup.com/downloads.html からダウンロードして、これまたポチポチっと。

### azure-cli のインストール
これは無くても何とかなるんだけど、準備するのに便利なので入れておく。
インストール方法は http://qiita.com/zakkied/items/d94ff3845ee098a2c5e2 など。



## 1. vagrant-azure plugin をインストールする

```
% vagrant plugin install vagrant-azure
```

ソースコードからインストールするときはこんな感じ:

```
% git clone https://github.com/MSOpenTech/vagrant-azure.git
% cd vagrant-azure
% bundle install --path=vendor/bundle
% bundle exec rake build
% vagrant plugin install pkg/vagrant-azure-1.0.0.gem
```



## 2. Vagrantfile を作る
```ruby
# vi: set ft=ruby :

ENV['VAGRANT_DEFAULT_PROVIDER'] = 'azure'

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

  config.vm.provider :azure do |provider, override|
    provider.subscription_id      = 'abcdefgh-1234-5678-9abc-d123456789ab'
    provider.mgmt_certificate     = '/Users/zakkie/azure-api/azure.pem'
    provider.mgmt_endpoint        = 'https://management.core.windows.net/'

    # vm settings
    provider.vm_image             = 
      'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-13_10-amd64-server-20140226-en-us-30GB'
    provider.vm_location          = 'Japan East'
    provider.vm_size              = 'Small'
    provider.vm_name              = 'zakkie-test014'
    provider.cloud_service_name   = 'zakkie-test014'
    provider.ssh_private_key_file = '/Users/zakkie/.ssh/azure.key'
    provider.ssh_certificate_file = '/Users/zakkie/.ssh/azure-cert.pem'

    override.ssh.private_key_path = '/Users/zakkie/.ssh/azure.key'
    override.vm.box               = 'azure'
    override.vm.box_url           = 'https://github.com/msopentech/vagrant-azure/raw/master/dummy.box'
  end
end
```

それぞれ必要なパラメータは `azure` コマンドから求めることができる:

#### subscription_id, mgmt_endpoint
```
% azure config list
info:    Getting config settings
data:    Setting       Value                               
data:    ------------  ------------------------------------
data:    endpoint      https://management.core.windows.net/
data:    subscription  abcdefgh-1234-5678-9abc-d123456789ab
```

#### mgmt_certificate
```
% azure account cert export -f azure.pem
```

で証明書ファイルが保存される。

#### vm_image
```
% azure vm image list
```
から選択。

#### vm_location
```
azure vm location list
```

から選択。

#### vm_size
これは取れないっぽい。help にあるのがそれっぽいかも。

```
% azure vm create -h
(snip)
help:          extrasmall, small, medium, large, extralarge, a5, a6, a7
```

ただし、先頭を大文字にする必要がある。

#### vm_name, cloud_service_name

Azure内での VM の識別子 (vm_name) と DNS 名 (\<cloud_service_name\>.cloudapp.net)。同じである必要はないけど、揃えておいたほうが無難。

#### ssh_private_key_file, ssh_certificate_file, private_key_path

http://qiita.com/zakkied/items/d94ff3845ee098a2c5e2#1-2 のように鍵ファイルを作成。

## さあ使ってみよう
#### 起動
```
% vagrant up
```
Small, Japan West で 210 秒くらいかかった

#### SSH ログイン
```
% vagrant ssh
```

#### 停止
```
% vagrant halt
```

#### VM 削除
停止しただけだと課金は継続するので、使い終わったら必ず削除する。
また、バグなのか、ストレージだけ残ることがあったので、WebUI からも念のため削除されたことを確認しておいたほうが良さそう。

```
% vagrant destroy
```

## Ansible を使ったプロビジョニング
chef でもいいけど、Ansible の方が簡単なので。

Vagrantfile に `provision` を追加する。

```ruby
Vagrant.configure('2') do |config|
  config.vm.provision 'ansible' do |ansible|                                       
    ansible.playbook = "provisioning/playbook.yaml"                                
  end

  config.vm.provider :azure do |provider, override|
  ...
```

```yaml:provisioning/playbook.yaml
- hosts: all
  sudo: yes
  tasks:
    - command: /usr/bin/apt-get update
    - command: /usr/bin/apt-get -y upgrade
    - name: install basic packages
      apt: pkg={{ item }} state=latest
      with_items:
        - git
        - erlang
        - nodejs
        - npm
```

`vagrant up --provision` とすると `playbook.yaml` が VM の起動後に反映される。つまり VM を作り直しても、毎回同じ状態から使いはじめることができる。つまりつまり、構築した VM を削除しても、惜しくもなんともない。つまりつまりつまり、簡単に使い捨ての環境を構築できるようになった。

なお、VM が起動済みの場合は `vagrant provision` でよい。

(追記1)

ansible は vagrant を実行しているホストから実行するので、ansible をインストールしておく必要があった。

```
% pip install ansible
```

(追記2)

[VM として windows を構築する](http://qiita.com/zakkied/items/71a4b2d63c3f3ea64de0) 手順をまとめた。