OpenStack Heatを使ってインスタンスを一つ生成する

# 1. はじめに
## 1.1. Heatとは
Heatは、Amazon Web Services(AWS)のCloudFormationをモデルにしたソフトウェアである。システム構成を定義したテンプレートファイルを用意することでOpenStack上にシステムを自動構築することできる。また、Heatを利用してオートスケールを実現することも可能である。
Heatでは、テンプレートで定義されたシステム構成をひとまとめにしてスタックと呼び、インスタンスやネットワークといったスタックの構成要素をリソースと呼ぶ。
テンプレートは HOT形式 またはAWS CloudFormation互換の CFNテンプレート形式 で記述可能であり、リソースにも互換性があり、AWS CloudFomation用に作成されたテンプレートを最小限の変更で利用することができる。

特徴）
-リソースの依存関係を記述できるので、「先にサーバを起動してからボリュームを接続する」といった構築の順序関係を制御可能
-PuppetやChefといった構成管理ツールと連携することで、インスタンス内部の設定変更やミドルウェアのインストールなども自動化
-テンプレートを変更して再度適用すると、差分を検出してスタックの構成を変更可能
-テンプレートの中で他のテンプレートを呼び出せるため、複数のテンプレートを組み合わせた構築が可能
-Ceilometerと連携することでオートスケールを実現可能

## 1.2. HOT(Heat Orchestration Template)
HOTテンプレートの構造

```
heat_template_version: 2013-05-23

description: 　　　　# テンプレートの説明について記述
parameter_groups:　# 入力パラメータのグループと順番について記述
parameters:　　　　# 入力パラメータについて記述
resources:　　　　　# リソースのテンプレートについて記述
outputs:　　　　　 # アウトプットパラメータについて記述
```

# 2. インストール
Packstackでインストールできるので省略
環境
OS:CenOS7.1
OpenStack:Kilo

# 3. 1台のインスタンスを生成するシンプルなスタック
1台のインスタンスを生成するテンプレートを作成し、スタックを作成する。

## 3.1. HOTテンプレートの作成
```test-statck.yml
#必須。HOTテンプレートのバージョン
heat_template_version: 2014-10-16　　

#オプション。このテンプレートに対するコメント
description: Heat Sample Template　　

#パラメータセクション。入力パラメータを定義。
parameters: 
  ImageID: #パラメータ名
    type: string #パラメータタイプ。{string、number、json、comma_delimited_list、boolean}
    description: Image used boost server #オプション。コメント。
    default: 27af613e-5ab9-41de-b4e2-3966dcca06cd　#パラメータを指定しなかった時のデフォルト値
    hidden: false #非表示設定。例えばpasswordなどはユーザの問い合わせに対して応答しないよう隠しておいた方がよい。

  NetID:
    type: string
    description: Network ID 
    default: 71c9dc17-cc66-45c6-9892-f5aecafce27c
　　constraints #入力可能なパラメータの値を制限
　　 - allowed_value: [71c9dc17-cc66-45c6-9892-f5aecafce27c, 8852f9ca-6a10-42c6-a723-88fbdaed4866] #許可する値
     - description: Value must be #コメント

#リソースセクション
resources:　 
  server1: #リソースID。リソースIDはリソースセクションにおいて一意である必要がある。
    type: OS::Nova::Server #リソースタイプ。OS::Nova::Server or OS::Neutron::Portなど
    properties: #flavorのプロパティ
      name: "Heat_Deployed_Server" #サーバ名
      image: { get_param: ImageID } #ブートするイメージID
      flavor: "m1.small" #ブートするフレイバーのID
      networks: #サーバに付加するNICのリスト
      - network: { get_param: NetID } #ネットワークID
	
#アウトプットセクション。カスタマイズされた出力をユーザに提供する。
outputs:　 
  server1_private_ip:　 
    description: IP address of the server 
    value: { get_attr: [ server1, first_address ] }#設定したIPアドレスの情報を表示。
```

メモ）リソースセクションで指定したリソースタイプで利用可能なプロパティは以下のサイトを参照。
http://docs.openstack.org/hot-reference/content/openstack-resource-types.html

## 3.2. heat_stack_ownerの割当
スタックを作成するためには、コマンドを実行するユーザがheat_stack_ownerのロールが割り当てられている必要がある。

```
[keystone_admin)]# openstack role add –project project1 –user yotsu heat_stack_owner
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | 8d5440bb0e7f46939487061d912fe77a |
| name  | heat_stack_owner                 |
+-------+----------------------------------+
```

先ほど作成したテンプレートと、パラメータを指定し、スタックを作成する。

```
# heat stack-create -f test-statck.yml -P "ImageID=27af613e-5ab9-41de-b4e2-3966dcca06cd;NetID=71c9dc17-cc66-45c6-9892-f5aecafce27c" Test-Stack
+--------------------------------------+------------+--------------------+----------------------+
| id                                   | stack_name | stack_status       | creation_time        |
+--------------------------------------+------------+--------------------+----------------------+
| 565bfbde-bdfd-412c-b2d2-b19428a0a740 | Test-Stack | CREATE_IN_PROGRESS | 2015-07-07T04:45:43Z |
+--------------------------------------+------------+--------------------+----------------------+
```

作成したスタックのリストを確認

```
# heat stack-list
+--------------------------------------+------------+-----------------+----------------------+
| id                                   | stack_name | stack_status    | creation_time        |
+--------------------------------------+------------+-----------------+----------------------+
| 565bfbde-bdfd-412c-b2d2-b19428a0a740 | Test-Stack | CREATE_COMPLETE | 2015-07-07T04:45:43Z |
+--------------------------------------+------------+-----------------+----------------------+
```

## 3.4. 動作確認
Heatによってインスタンスが生成されたかどうか確認

```
# nova list
+--------------------------------------+----------------------+--------+------------+-------------+----------------------+
| ID                                   | Name                 | Status | Task State | Power State | Networks             |
+--------------------------------------+----------------------+--------+------------+-------------+----------------------+
| 1e1fb7af-4182-4c0a-8f56-c57ac3822482 | Heat_Deployed_Server | ACTIVE | -          | Running     | private=192.168.1.35 |
+--------------------------------------+----------------------+--------+------------+-------------+----------------------+
```