Check! Azure 仮想マシンで、Linux ベースのカスタムイメージを作成する

こんにちは、[エクストリームデザイン](http://xd-lab.net/ "XTREME DESIGN Inc. | High Performance Cloud Provider") の @dz_ こと大平かづみです。

Prologue - はじめに
====
Azure の仮想マシンで何度も同じインストールをするのは手間なので、カスタムイメージを作ってみました。

下記の記事を参考に CLI 版を試し、さらに後半の手順はポータルからもできて簡単だったので、併せてご紹介します。

- [Azure CLI 2.0 を使用した Linux VM のキャプチャ | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/virtual-machines-linux-capture-image "Azure CLI 2.0 を使用した Linux VM のキャプチャ | Microsoft Docs")

### 環境
CentOS 7.3 および CentOS 6.8 の２つで、動作検証しました。また、 [Azure Managed Disks](https://docs.microsoft.com/ja-jp/azure/storage/storage-managed-disks-overview?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json "Azure Premium および Standard 管理ディスクの概要 | Microsoft Docs") で作成した仮想マシンを前提とします。

手順
====

大まかな流れは以下の3ステップです。

1. ディスクをバックアップする
2. 対象の仮想マシンを一般化する（個別情報の削除とプロビジョニングの解除）
3. 対象の仮想マシンのイメージを作成する

[おまけ] 作成したイメージから仮想マシンのインスタンスを作成する

1. ディスクをバックアップする
----
まず、念のため、インスタンスのディスクのバックアップを取っておきます。

下記ドキュメントが参考になります。

- [Azure CLI 2.0 を使用した Linux VM のコピー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/virtual-machines-linux-copy-vm?toc=%2fazure%2fvirtual-machines%2flinux%2ftoc.json "Azure CLI 2.0 を使用した Linux VM のコピー | Microsoft Docs")

2. 対象の仮想マシンを一般化する（個別情報の削除とプロビジョニングの解除）
----
用意ができたら、イメージに不要な個別の情報の削除とVMプロビジョニングの解除を行います。対象の仮想マシンにSSHログインし、下記を実行してください。

```bash
# 対象の仮想マシンにSSHログインする
$ ssh xxx@xxx

# 個別情報を削除し、Linux エージェントを削除する
$ sudo waagent -deprovision+user

WARNING! The waagent service will be stopped.
WARNING! All SSH host key pairs will be deleted.
WARNING! Cached DHCP leases will be deleted.
WARNING! root password will be disabled. You will not be able to login as root.
WARNING! /etc/resolv.conf will be deleted.
WARNING! dev account and entire home directory will be deleted.
Do you want to proceed (y/n)y

2017/03/27 12:16:05.736443 INFO examine /proc/net/route for primary interface
2017/03/27 12:16:05.738062 INFO primary interface is [eth0]
2017/03/27 12:16:05.739166 INFO interface [lo] has flags [73], is loopback [True]
2017/03/27 12:16:05.746650 INFO interface [lo] skipped
2017/03/27 12:16:05.747737 INFO interface [eth0] has flags [4163], is loopback [False]
2017/03/27 12:16:05.749394 INFO interface [eth0] selected

# インスタンスからログアウトする
$ exit
```

3. 対象の仮想マシンのイメージを作成する
----
そして、カスタムイメージを作成します。

ポータルでも Azure CLI でも作業できます。どちらも簡単なので慣れた方をどうぞ～

### ポータルの場合

仮想マシンのブレードから、「撮影タブ」を開きます。保存するイメージの「名前」と「リソースグループ」を指定し、必要に応じてオプションを設定し、作成します。

![20170331_azure-vm-snapshot_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/401ba00a-f7e6-debc-14a3-55b13ce0ffef.png)

あら、簡単！(｡･ω･)ﾉ

### Azure CLI の場合

 Azure CLI 2.0 の環境を用意し、ログイン後、下記のコマンドを実行します。

- [Install the Azure CLI 2.0 | Microsoft Docs](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli　"Install the Azure CLI 2.0 | Microsoft Docs")

```bash
# Azure CLI 2.0 をインストールする
$ pip install azure-cli

# Azure にログインする
$ az login

# 仮想マシンの割り当てを解除する
$ az vm deallocate --resource-group yourResourceGroup --name targetVM

# 仮想マシンを一般化する
$ az vm generalize --resource-group yourResourceGroup --name targetVM

# 一般化した仮想マシンからイメージを作成する
$ az image create --resource-group yourResourceGroup --name targetImage --source targetVM
```

これだけ！簡単！ヾ(\*･ω･\*)o

[おまけ] 作成したイメージから仮想マシンのインスタンスを作成する
----

ちなみに、イメージから仮想マシンのインスタンスを作成する作業は、ポータルからでもCLIからでも可能です。

なお、作成したインスタンスは、セキュリティグループの SSH が開いてないかもしれません。起動後にSSHで接続できない場合は、ネットワークセキュリティグループを確認してみてください。

### ポータルの場合

ポータルで作成したイメージを開き、「VMの作成」から仮想マシンのインスタンスを作成できます。

![20170331_azure-vm-snapshot_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/528a9c4e-4cc1-c513-9bef-ba180852d8b5.png)

### CLI の場合

Prologue に掲載した記事の「[手順 3: キャプチャしたイメージから VM を作成する](https://docs.microsoft.com/ja-jp/azure/virtual-machines/virtual-machines-linux-capture-image#a-namestep-3-create-a-vm-from-the-captured-imagea手順-3-キャプチャしたイメージから-vm-を作成する "手順 3: キャプチャしたイメージから VM を作成する")」をご参照ください。

Epilogue - おわりに
====
独自のイメージをつくっておけるのは、便利ですねー！