オープンクラウド・キャンパス

クラウドオーケストレーション
「OpenStack Heat」に迫る!

ver1.1 中井悦司
Twitter @enakai00
クラウドオーケストレーション「OpenStack Heat」に迫る!

自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and

「Linux独習書の新定番」
書きました!

Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。

 昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
読者の声より ――
「今はインターネット上に情報が溢れているけど、質の高い入門書が少なく 
 なっているのは不幸なことだと思う。そんな中、この本はすごくいい」
「平易な言葉でありながら、決して足りなくはない。慎重に選ばれています。
 脳みそに染みこんで来ます」
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

日経LinuxでOpenStackの連載を書いてます!

Open Cloud Campus
OpenStackの自動化機能
クラウドオーケストレーション「OpenStack Heat」に迫る!

デプロイ自動化の現状

 クラウド/仮想化環境での自動化3大パターン
1. 仮想アプライアンス(ゴールデンイメージ)方式
• アプリケーション導入済みの環境をマシンイメージ化して利用。
• 巨大なテンプレートファイルの保守管理、インフラ間の可搬性が
課題。

2. JEOS(Just Enough Operating System)方式

仮想化環境でよく
利用される方法

• 最小限のOS環境をマシンイメージ化して利用。アプリケーション
の導入・設定は、別途、ツールで自動化。

3. 自動インストール方式

クラウドで主流に
なりつつある手法

• OSのインストールからアプリケーションの導入・設定まで、すべ
ての作業を自動化して適用。
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

カスタマイズ・スクリプト(User Data)による自動化
 マシンインスタンス起動時に「カスタマイズ・スクリプト(User Data)」を与え
ると任意のテキストをメタデータとしてゲストOSに受け渡すことができます。
 Cloud-Initは、カスタマイズ・スクリプトを解釈して、自動化を実現します。
– 下図はシェルスクリプトを渡して、「/etc/motd」を設定しています。
– この他にもCloud-Init独自の構文で、処理内容を指示することができます。

http://cloudinit.readthedocs.org/en/latest/
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

Github/Puppetと連携するカスタマイズ・スクリプトの例
 Githubとは?
– Gitは、プログラムソースコードの分散バージョン管理システム。インターネット上に
コードリポジトリを作成して無料で利用できるサービス「Github」の登場により、利用
者が増加しました。
– 下図のカスタマイズ・スクリプトでは、GithubにアップロードしておいたPuppet間に不
フェスとをダウンロードして適用しています。
Githubからマニフェストを取得して適用するスクリプトの例
#!/bin/sh -x
yum -y install puppet git
GitRepository=https://github.com/enakai00/pgsql_puppet
ConfigTag=f19
RepoName=${GitRepository##*/}
RepoName=${RepoName%.git}
mkdir -p /tmp/gittmp
cd /tmp/gittmp
git clone $GitRepository
cd $RepoName
git checkout $ConfigTag
export FACTER_manifest_dir="/tmp/gittmp/$RepoName"
puppet apply main.pp
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

カスタマイズ・スクリプトとGithub/Puppetの連携
 カスタマイズ・スクリプトからGithub/Puppetを連携させて、仮想マシンインス
タンスを自動構築することができます。

YUM
リポジトリ

ソフトウェア
パッケージ
pgsql

VM

アプリ設定情報
(Puppetマニフェスト)
GitHub
https://github.com/enakai00/pgsql_puppet

カスタマイズ・スクリプト
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

カスタマイズ・スクリプトの限界

カスタマイズ・スクリプトだけでは
複数VMの連携処理ができない・・・

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

複数VMによる連携処理の例
DBの構築完了をどうやって
検知する・・・

 VM#1を起動して、PostgreSQLサーバーを構築する。
 PostgreSQLの構成が完了して、DBに接続可能になるのを待つ。
 VM#2を起動して、 Railsアプリケーションをデプロイする。
 Railsアプリケーションから、PostgreSQLのDBに接続する。

DBサーバのプライベートIPを
どうやって知る・・・

やりたいこと
Webアプリケーションには
フローティングIPで接続

フローティングIP

DBサーバには
プライベートIPで接続

プライベートIP

プライベートIP

VM#2

VM#1
Open Cloud Campus
そこでHeatなわけですよ!
クラウドオーケストレーション「OpenStack Heat」に迫る!

Heatのアーキテクチャー
スタックを
自動構築

Heatエンジン

Heatテンプレート

HeatのAPIから
テンプレート投入

・リソース[VM#1]
 カスタマイズスクリプトでDB構築
 カスタマイズスクリプトから構築完了をHeatエンジンに通知
・リソース[WaitHandle]
 VM#1からの構築完了通知を受けとる
・リソース[WaitCondition]
 WaitHandleが通知を受けとるまで待機
・リソース[VM#2]
 カスタマイズスクリプトでRailsアプリ構築
 VM#1のプライベートIPをカスタマイズスクリプトに埋め込む

このかたまりを1つの
「スタック」として
テンプレートに記述
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

デモンストレーション
# heat stack-create -f dengonban.template -P "KeyName=mykey" dengonban
+--------------------------------------+------------+--------------------+----------------------+
| id
| stack_name | stack_status
| creation_time
|
+--------------------------------------+------------+--------------------+----------------------+
| 642c1678-8966-461c-bbfe-c75c17b75e95 | dengonban | CREATE_IN_PROGRESS | 2014-02-06T07:01:16Z |
+--------------------------------------+------------+--------------------+----------------------+
# heat stack-list
+--------------------------------------+------------+-----------------+----------------------+
| id
| stack_name | stack_status
| creation_time
|
+--------------------------------------+------------+-----------------+----------------------+
| 642c1678-8966-461c-bbfe-c75c17b75e95 | dengonban | CREATE_COMPLETE | 2014-02-06T07:01:16Z |
+--------------------------------------+------------+-----------------+----------------------+
# nova list
+--------------------------------------+--------------------------------------------++------------------------------------------+
| ID
| Name
|| Networks
|
+--------------------------------------+--------------------------------------------++------------------------------------------+
| c7b48220-ea3c-4053-b699-d3bed8cde657 | dengonban-PgSQLDatabaseServer-wptgqlxdmbt6 || private01=192.168.101.3
|
| 5896b645-a398-4827-9d76-306f7ec9c418 | dengonban-WebServer-s3n5y4wshlq2
|| private01=192.168.101.4, 192.168.199.105 |
+--------------------------------------+--------------------------------------------++------------------------------------------+

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

テンプレートの概要 (1/2)
{

"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "A Database instance running a local PostgreSQL server",
・・・
"Resources" : {
"PgSQLDatabaseServer": {
"Type": "AWS::EC2::Instance",
"Properties": {
"SubnetId"
: "013cd465-7e75-4edc-ae83-6476fcf9178b",
"ImageId"
: { "Ref" : "ImageName" },
"InstanceType"
: { "Ref" : "InstanceType" },
"KeyName"
: { "Ref" : "KeyName" },
"UserData"
: { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xn",
・・・
VM#1のカスタマイズスクリプト
"# All is well so signal successn",
"/opt/aws/bin/cfn-signal -e 0 -r "PostgreSQL Database setup complete" '",
{ "Ref" : "PgSQLWaitHandle" }, "'n"
]]}}
カスタマイズスクリプトの中から、
}
「WaitHandle」への完了通知コマンドを実行
},
"PgSQLWaitHandle" : {
"Type" : "AWS::CloudFormation::WaitConditionHandle"
},
"PgSQLWaitCondition" : {
"Type" : "AWS::CloudFormation::WaitCondition",
"DependsOn" : "PgSQLDatabaseServer", "Properties" : {
"Handle" : {"Ref" : "PgSQLWaitHandle"},
"Timeout" : "6000"
}
},

WaitHandleが通知を受けるまで
待機するダミーリソース

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

テンプレートの概要 (1/2)
"WebServer": {
"Type": "AWS::EC2::Instance",
"DependsOn": "PgSQLWaitCondition",
WaitConditionが完了してから構築開始
"Properties": {
"SubnetId"
: "013cd465-7e75-4edc-ae83-6476fcf9178b",
VM#1のプライベートIPに置換される
"ImageId"
: { "Ref" : "ImageName" },
"InstanceType"
: { "Ref" : "InstanceType" },
"KeyName"
: { "Ref" : "KeyName" },
VM#2のカスタマイズスクリプト
"UserData"
: { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -xn",
"export DB_IP=", { "Fn::GetAtt" : [ "PgSQLDatabaseServer", "PublicIp" ] }, "n",
・・・
"sed -i "s/ username:.*/ username: rails/" /root/rails/dengonban/config/database.ymln",
"sed -i "s/ password:.*/ password: pas4railsn host: $DB_IP/" /root/rails/dengonban/config/database.ymln",
・・・
]]}}
}
},

}

}

"WebServerIPAssoc" : {
"Type" : "AWS::EC2::EIPAssociation",
"Properties" : {
"InstanceId" : { "Ref" : "WebServer" },
"EIP" : "192.168.199.105"
}
}

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

Heatのアーキテクチャー(詳細版)
テンプレート
仮想マシンインスタンス起動

Cinder

REST APIを提供

Neutron

Nova
カスタマイズ
スクリプト

カスタマイズ
スクリプト

Heat API

Heat Engine

仮想マシン
インスタンス

仮想マシン
インスタンス

cfntools

cfntools

シグナル送信
Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

Heatの今後の展開
 Heatは、構築済みスタックを後から構成変更することもできます。
– テンプレートを修正して、Heatエンジンに再投入すると差分を検出して、追加の構築/
削除処理を実施します。

 これを利用するとオートスケールを実現することができます。
– VMの負荷に応じてテンプレートにVMを追加/削除して、HeatからVMを追加構築/削除
します。
– 開発コミュニティでは、Ceilometerと連携する方向での実装が検討されています。

 Baremetal Deployment(Ironic)を利用して、Heatからコンピュートノードを
追加構築するような試みもあります。
– 参考:Triple O / Tuskar
– https://wiki.openstack.org/wiki/TripleO/Tuskar

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

(参考)Tuskarのアーキテクチャー
コンピュートノード
コントローラーノード
物理サーバー

・・・

オーバークラウド
アンダークラウド
REST APIを提供
Tuskar API

Tuskar Manager

コントローラーノードや
コンピュートノードを構築

Heat

Nova

Ironic

Open Cloud Campus
クラウドオーケストレーション「OpenStack Heat」に迫る!

参考資料
 本日のデモ環境の構築手順
– RDO(Havana)でHeatを試す
– http://d.hatena.ne.jp/enakai00/20140205/1391604332

 HeatとCloud-Initの連携の詳細を紹介
– OpenStack HeatがCloud-Init / cfntoolsと連携する様子を覗きこむ
– http://d.hatena.ne.jp/enakai00/20131226/1388021566

 Heatテンプレートは、AWS CloudFormation互換なので、CloudFormationの知識も有用
– CloudFormation 詳細 -ほぼ週刊AWSマイスターシリーズ第6回– http://www.slideshare.net/kentamagawa/cloudformation-aws5

 PuppetとGitHubの連携は、日経Linux連載記事(2013年9月号〜2014年2月号)で解説

Open Cloud Campus
オープンクラウド・キャンパス

これからもクラウドと自動化の
未来を一緒に考えましょう!

中井悦司
Twitter @enakai00

クラウドオーケストレーション「OpenStack Heat」に迫る!