Ansible で Azure 上にプロビジョニング！

Ansible をつかって Azure 上で仮想マシンをブートアップするところまでの手順。

![cd442a84-c72d-16ab-fe48-cfabdb15e9a6.jpeg](https://qiita-image-store.s3.amazonaws.com/0/75458/94333e95-8447-5283-2273-099ebe2b00f9.jpeg)

# Microsoft Azure 側の準備

* Azure アカウント（割愛：https://azure.microsoft.com/ja-jp/get-started/）
* Azure CLI インストール
* ストレージアカウント
* 管理証明書

## Azure CLI インストール
これがあると便利なので入れておく。
インストール（Ubuntu 14.04 の場合）

```shell-session
$ sudo apt-get install nodejs-legacy
$ sudo apt-get install npm
$ sudo npm install -g azure-cli
npm http GET https://registry.npmjs.org/azure-cli
npm http 200 https://registry.npmjs.org/azure-cli
（略）
/usr/local/bin/azure -> /usr/local/lib/node_modules/azure-cli/bin/azure
azure-cli@0.9.9 /usr/local/lib/node_modules/azure-cli

$ azure help
info:    Executing command help
info:             _    _____   _ ___ ___
info:            /_\  |_  / | | | _ \ __|
info:      _ ___/ _ \__/ /| |_| |   / _|___ _ _
info:    (___  /_/ \_\/___|\___/|_|_\___| _____)
info:       (_______ _ _)         _ ______ _)_ _
info:              (______________ _ )   (___ _ _)
info:
info:    Microsoft Azure: Microsoft's Cloud Platform
info:
info:    Tool version 0.9.9
（略）
help:    Current Mode: asm (Azure Service Management)
$
```

Azure CLI を使う場合には少しだけ準備があり、Azure で作ったアカウントを認証するための設定が必要。

```shell-session
$ azure account download
info:    Executing command account download
info:    Launching browser to http://
help:    Save the downloaded file, then execute the command
help:      account import 
info:    account download command OK
```

指示されたようにファイルをダウンロードして、以下のようにインポート。

```shell-session
$ azure account import credentials.publishsettings
info:    Executing command account import
info:    account import command OK
```

これで Azure CLI が利用可能になる。

## ストレージアカウント

Azure ポータルまたは Azure CLI にて作成することが出来る。この時、作成するロケーションに注意します。日本であれば、日本（西）「Japan West」等。これは後に起動する仮想マシンと同じロケーションしておく。アカウントを作成すると、ストレージアカウント名が確認る。詳細な作成方法は割愛。

>ストレージアカウントは１度でも仮想マシンを作った事があるとそれに準じて自動で作成される

## 管理証明書

外部 API からのアクセスするアカウントを Azure 側で認証するために必要なもの。いくつかやり方はあるが、一番簡単だと思われる方法としては Azure CLI を使う方法。Azure CLI を使う場合は既に証明書が登録されているので、そこからエクスポートして取得する。


```shell-session
$ azure acount cert export -f ./manage.cer
```

まとめると、Azure CLI では以下のようにサブスクリプションID、ストレージアカウント名の確認、管理証明書の取得ができる。

```shell-session
$ azure account list
$ azure storage account list
$ azure acount cert export -f ./manage.cer
```

# Ansible マシンを用意

## Ansible インストール

Ansible がインストールされたLinuxマシンを用意。ここでは Ubuntu 14.04 を使用。
実は Azure 上に Windows 系の仮想マシンを起動させるためには、投稿時点の Ansible 1.9.x 系のバージョンではなく次期バージョンである 2.0.0 以上が必要。

```shell-session

$ git clone https://github.com/ansible/ansible.git
$ cd ansible
$ git checkout v2.0.0-0.3.beta1
$ git submodule update --init
$ . hacking/env-setup
$ ansible --version
ansible 2.0.0 (detached HEAD 5ae74f7d38) last updated 2015/10/12 07:19:07 (GMT +000)
  lib/ansible/modules/core: (detached HEAD d659c79db7) last updated 2015/10/12 07:19:50 (GMT +000)
  lib/ansible/modules/extras: (detached HEAD 0ff1776a84) last updated 2015/10/12 07:20:14 (GMT +000)
  config file = /etc/ansible/ansible.cf
```

Ansible で用意されている Azure モジュールは以下の環境でサポート。

* Python >= 2.6
* Python azure module >= 0.8.0 （Ansible マニュアルは少し古い情報）

追加で Python の Azure モジュールをインストール。


```shell-session

$ sudo pip install azure==0.11.1
$ sudo pip show azure
---
Name: azure
Version: 0.11.1
Location: /usr/local/lib/python2.7/dist-packages
Requires: python-dateutil, futures
```

投稿時時点で、このモジュールは1.0.2が最新ですが、1.0.2は Ansible の Azure モジュールが対応していない事がわかっているため0.11.1を使っています。

> この対応は開発中の 2.0.0 devel にマージされた。
> https://github.com/ansible/ansible-modules-core/pull/2114

# Ansible 実行準備（インベントリファイルとプレイブック）

Ansible の実行に必要なファイルは「インベントリファイル」と「プレイブック」ファイルです。今回はそれぞれ以下のように作成。

```ini:インベントリ（hosts）
127.0.0.1 ansible_connection=local
```

```yaml:プレイブック（playbook.yml）
---
- hosts: localhost
  gather_facts: no

  tasks:
  - name: Create Virtual Machine on Azure (for Windows)
    azure: # Ansible の azure モジュールを使うことを宣言し、以下はそのオプション
      auto_updates: no
      enable_winrm: yes
      endpoints: "3389"
      image: 'bd507d3a70934695bc2128e3e5a255ba__RightImage-Windows-2012R2-x64-v14.2'
      location: 'Japan West'
      management_cert_path: /home/vagrant/azure/manage.cer # 取得した管理証明書
      hostname: hogehoge
      name: hogehoge
      os_type: windows
      user: azureuser
      password: "Password_123"
      role_size: Basic_A2
      state: present
      storage_account: # 取得したストレージアカウント名
      subscription_id: # 取得したすサブスクリプションID
```

上記の各オプションでAzure側の情報を取得しなければわからないものとして、image , location , role_size がある。これらに何を指定したらよいかは自身で選択するが、image と location は Azure CLI で確認できる。

```shell-session
$ azure vm image list

$ azure vm location list
```

role_size は 仮想マシンのサイズ（スペック）については以下によると、
"ExtraSmall"、"Small"、"Medium"、"Large"、"ExtraLarge"、"A5"、"A6"、"A7"、"A8"、"A9"、"A10"、"A11"、"Basic_A0"、"Basic_A1"、"Basic_A2"、"Basic_A3"、"Basic_A4"、"Standard_D1"、"Standard_D2"、"Standard_D3"、"Standard_D4"、"Standard_D11"、"Standard_D12"、"Standard_D13"、"Standard_D14"、"Standard_DS1"、"Standard_DS2"、"Standard_DS3"、"Standard_DS4"、"Standard_DS11"、"Standard_DS12"、"Standard_DS13"、"Standard_DS14"、"Standard_G1"、"Standard_G2"、"Standard_G3"、"Standard_G4"、"Standard_G55"です。使えるスペックはロケーションにより異なります。role_size のデフォルトは "Small" 。

https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-command-line-tools/

## Ansible 実行

```shell-session
$ ansible-playbook -i hosts playbook.yml 
```

## 確認

Azure CLI や Azureポータルから確認

# 補足

ResetPasswordOnFirstLogon パラメータは廃止されている

これにより、Ansible Azure モジュールオプションの reset_pass_atlogon は使う事ができません。既存 [ISSUE 2245](https://github.com/ansible/ansible-modules-core/issues/2245)。

# 参考

* https://azure.microsoft.com/ja-jp/get-started/
* https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-install/
* https://azure.microsoft.com/ja-jp/documentation/
* https://azure.microsoft.com/ja-jp/documentation/articles/virtual-machines-command-line-tools/
* http://docs.ansible.com/ansible/intro_installation.html