【OpenStackチャレンジ】 第18回 HEAT紹介編
2016.7. 8
6/23(木)に開催された「日本OpenStackユーザ会 第28回勉強会」に参加してきました!
今回は、勉強会の内容をご紹介します!
勉強会は飯田橋にあるIIJ本社で行われました。会場はとても広い会議室で、参加者が200人を超えても大丈夫そうです。
今回もWiFiを準備いただいていたため、快適にハンズオンができました。
今回のテーマは「Heatによるオーケストレーション入門」でした。HeatはOpenStack上での自動化を実現するOpenStackコンポーネントであり、オーケストレータとして使用できます。自動化するにはHOTというシステム構造が定義されているYAML形式のファイルをHeatに読み込ませる必要があります。
勉強会ではこのHOTの記述方法を紹介し、実際に自分たちでHOTを書いて動かすことでHeatを理解してもらうことを軸に講習内容が組まれていました。勉強の対象者としてはOpenStackの初心者でも気軽に参加できる雰囲気でした。
勉強会に参加するにあたってハンズオンを行うため、Heatの動作環境をPCに準備する必要がありました。
動作環境はVirtualBox上にOpenStackを構築しました。OpenStackを一から構築するのは大変だろうという配慮から、今回勉強会の主催者側からVirtualBoxイメージが準備されていたので楽に構築することが出来ました。
まず、OpenStackのHeatで使用されているYAMLについてご紹介します。
次に、演習で使用したテンプレートを参考にして、環境を構築し、仮想マシンインスタンスを起動するテンプレートを作成し、説明します。
最後に、作成したテンプレートを実行し、動作を確認します。
YAML(YAML Ain't a Markup Language)は、構造化されたデータやリソースをテキスト(ハッシュ、配列、スカラー)で表現するためのデータ形式です。
特徴としては、インデントを使用してデータやオブジェクトの階層構造を表現し、終了タグはなく、インデントにはスペースを使用します。
YAMLで記述されたHOT(Heat Orchestration Template)をOpenStackのHeatに読み込ませることで、システム構築をすることができます。
OpenStackのHeatを使用して、システム構築を行うためには、YAMLを理解することが役立ちます。
では、YAMLについて具体的に紹介していきます!
以下のキーワードがYAMLで良く使われる用語です。覚えておきましょう!
用語 | 説明 |
テンプレート | YAMLで記述されたファイル |
セクション | ネストを利用して、シーケンス(配列)やマッピング(ハッシュ)をグループ化すること |
シーケンス (配列) |
データを並べるという構造 |
マッピング (ハッシュ) |
キーとデータのペアという構造 |
スカラー | 文字列、数値、日付、真偽等を自動的に判別するデータ |
ネスト | 複数のデータを一つのデータ単位にすること |
インデントは、半角スペースで入力します。2つの半角スペースを入力することが多いです。
シーケンス(配列)の記述方法は、「- 」で始めます。
「-」の後に半角スペースを入れないとエラーになります。
インデントを利用してネストすることもできます。
[データ, データ]というインライン表記もサポートされています。
「,」の後に半角スペースを入れないとエラーになります。
マッピング(ハッシュ)の記述方法は、「キー: データ」です。
「:」の後に半角スペースを入れないとエラーになります。
インデントを利用してネストすることもできます。
{キー: データ,キー: データ}というインライン表記もサポートされています。
「,」の後に半角スペースを入れないとエラーになります。
コメントのの記述方法は、「#」の後にコメントを記述します。
OpenStackで使用できるリソースに対して以下の操作などが記述できます。
- 仮想マシンの作成
- キーペアの作成
- 仮想ネットワーク、サブネットの作成
- 仮想ルータの作成、及びネットワークの接続
- Floating IPの作成、割り当て
- 論理ポートの作成
- セキュリティグループの作成
- 仮想ボリュームの作成、アタッチ
次にHOTの構造について説明します。HOTは、以下の5つのセクションで構成されています。
- heat_template_version:テンプレートのバージョン(必須)
利用できるリソース、リソースの仕様、利用できる関数がOpenStackのリリースで異なるために、テンプレートのリリースを明記しなければなりません。
OpenStackのリリースの日付けを指定します。 - description:テンプレートの説明
- parameters:get_param関数でHOT内で参照可能なパラメータの定義。
デフォルト値を設定することもできますし、実行時にコマンドラインから指定することもできます。 - resources:作成するリソースの記述(必須)
作成するリソースを記述し、タイプを持ち、リソースの値はget_attr関数、get_resource関数で参照できます。 - outputs:作成したスタックの情報の出力
以下が今回使用する関数を紹介します。
関数名 | 説明 |
get_param | parametersセクションで定義された変数を参照する関数 |
get_attr | リソースの属性を参照する関数 |
get_resource | 他のリソースを参照する関数 |
今回は当社のラボにあるOpenStackを使用して、「15_01_02.yaml」というテンプレート作成し、環境構築からサーバの起動までを実行するHOTを以下のように作成しました。
$ cat 15_01_02.yaml
heat_template_version: 2015-04-30 description: building heat hands-on env. parameters: private_network: type: string label: Internal network name description: Internal network name or ID default: heat-handson-net private_subnet: type: string label: Internal network name description: Internal sub-network name or ID default: heat-handson-subnet private_cidr: type: string label: Internal network name description: Internal sub-network CIDR default: 10.20.99.0/24 private_gw: type: string label: Gateway IP of internal network description: Gateway IP Address default: 10.20.99.254 sec_group: type: string label: Security group name description: Security group name default: sg-for-heat key: type: string label: Key name description: Name of key-pair to be installed on the compute instance. default: heat-key ext_router: type: string label: Public router name or ID description: Public router which is connected to external network. default: Ext-Router flavor: type: string label: Flavor description: Type of instance (flavor) to be used on the compute instance. default: m1.small image: type: string label: Image name or ID description: Image to be used for the server. default: cirros resources: network: type: OS::Neutron::Net properties: name: { get_param: private_network } subnet: type: OS::Neutron::Subnet properties: name: { get_param: private_subnet } ip_version: 4 network_id: { get_resource: network } cidr: { get_param: private_cidr } gateway_ip: { get_param: private_gw } router_interface: type: OS::Neutron::RouterInterface properties: router: { get_param: ext_router } subnet: { get_resource: subnet } security_group: type: OS::Neutron::SecurityGroup properties: name: { get_param: sec_group } rules: - protocol: icmp - protocol: tcp port_range_min: 1 port_range_max: 65535 - protocol: udp port_range_min: 1 port_range_max: 65535 key_pair: type: OS::Nova::KeyPair properties: name: { get_param: key } save_private_key: true instance: type: OS::Nova::Server properties: image: { get_param: image } flavor: { get_param: flavor } key_name: { get_resource: key_pair } security_groups: - { get_resource: security_group } networks: - network: { get_resource: network } outputs: private_key: description: Private Key of generated keypair value: { get_attr: [key_pair, private_key] } instance_name: description: Name of the instance value: { get_attr: [instance, name] } instance_ip: description: The IP address of the deployed instance value: { get_attr: [ instance, first_address ] }
HOTは、構造化されたデータやリソースをテキストで表現します。
HOTの構造に従って、上記で述べえたように5つのセクションがあります。
以下のparametersが定義されています。
- private_network:ネットワーク名
- private_subnet:サブネットワーク名
- private_cidr:サイダー
- private_gw:デフォルトゲートウェイIPアドレス
- sec_group:セキュリティグループ名
- key:キー名
- ext_router:ルータ名
- flavor:フレーバ名
- image:イメージ名
以下のresoucresが定義されています。
- network:ネットワーク
- subnet:サブネットワーク
- router_interface:ルータのインターフェース
- security_group:セキュリティグループ
- key_pair:キーペア
- instance:仮想マシンインスタンス
private_key、instance_name、instance_ipというデータで構成されたスタックを出力します。
まず、OpenStack上に以下の環境設定を準備しましょう。
Ext-Routerの作成をします。作成した上記のHOTを実行しましょう。
$ heat stack-create -f 15_01_02.yaml stack1and2
実行すると以下のようになります。 実行結果をダッシュボードから確認できました。
日本OpenStackユーザ会は、月に一度勉強会を開催されています。
次回は8月中旬に行なわれます。
皆さんも、日本OpenStackユーザ会が主催する勉強会に参加してみましょう!
著者:河合紀彦
OpenStackと同じカテゴリーの記事
- 【OSC2017 Tokyo/Spring】OpenStackを宇宙で!?
- 【OpenStackチャレンジ】 第29回 Ocata紹介編
- 【OSSチャレンジ】 第1回 Bacula紹介:前編
- 【OSC2016 Tokyo/Fall】VRとOpenStackを連携
- 【OpenStackチャレンジ】 第28回 Stackalytics登録編