Heatテンプレートの準備
[プロジェクト]-[ネットワーク]-[ネットワークトポロジー]に移動すると、外部ネットワークだけが存在している状態を確認できます。今回は、この状態からHeatを使って以下のようなスタックを作成し、WordPressを立ち上げます。
このスタックを構築するためのHOT形式のテンプレートをGithubで公開しています。このテンプレートはGithubのopenstack/heat-templatesで公開されているサンプルテンプレートを参考に作成しています。テンプレートの記述方法については公式のテンプレートガイドに詳しく記載されているので確認してみてください。ここでは、今回使用するテンプレートについて解説します。
parametersセクション
parametersセクションでは、スタック作成時にユーザが指定できるパラメータを記述します。キーペアやイメージのIDなど、ユーザごとに指定する必要があるパラメータを記述しておきます。また、デフォルト値を設定しておくこともできます。今回のテンプレートでは、内部ネットワークのアドレスやDBのユーザ名、パスワードなどを指定できるようにしています。
parameters:
(中略)
private_net_name: #パラメータのID
type: string
description: Name of private network to be created
default: private #デフォルト値
private_net_cidr:
type: string
description: Private network address (CIDR notation)
default: 10.0.0.0/24
(中略)
db_username:
type: string
description: The WordPress database admin account username
default: admin
hidden: true #ダッシュボードのスタック管理画面でパラメータの値を表示させない
constraints: #パラメータの制約
- length: { min: 1, max: 16 }
description: db_username must be between 1 and 16 characters
- allowed_pattern: '[a-zA-Z][a-zA-Z0-9]*'
description: >
db_username must begin with a letter and contain only alphanumeric
characters
db_password:
type: string
description: The WordPress database admin account password
default: admin
hidden: true
constraints:
- length: { min: 1, max: 41 }
description: db_password must be between 1 and 41 characters
- allowed_pattern: '[a-zA-Z0-9]*'
description: db_password must contain only alphanumeric characters
resourcesセクション
resourcesセクションでは、作成するリソースのタイプやプロパティを定義します。get_param関数やget_resource関数を使用してパラメータや他のリソースを参照し、関連付けることができます。
resources:
private_net: #リソースを特定するためのID
type: OS::Neutron::Net #リソースのタイプ
properties: #リソースのプロパティ
name: { get_param: private_net_name } #パラメータ「private_net_name」を参照
(中略)
router_interface:
type: OS::Neutron::RouterInterface
depends_on: [ router, private_subnet ]
properties:
router_id: { get_resource: router } #リソースID「router」を参照
subnet_id: { get_resource: private_subnet } #リソースID「private_subnet」を参照
インスタンスのuser_dataプロパティには、インスタンス起動時に実行するスクリプトを指定します。以下のDBサーバについての記述では、MySQLのインストールとデータベースの作成を行っています。ここでPuppetやChefを実行すれば、複雑な設定を自動的に行うことが可能です。
database_server:
type: OS::Nova::Server
depends_on: database_server_port
properties:
image: { get_param: image_id }
flavor: { get_param: instance_type }
key_name: { get_param: key_name }
networks:
- port: { get_resource: database_server_port }
user_data: #インスタンス起動時に実行されるスクリプトを記述
str_replace: #templateの内容をpramsで指定した値に置換する
template: |
#!/bin/bash -v
yum -y clean all
yum -y install mariadb mariadb-server
touch /var/log/mariadb/mariadb.log
chown mysql.mysql /var/log/mariadb/mariadb.log
systemctl start mariadb.service
# Setup MySQL root password and create a user
mysqladmin -u root password db_rootpassword
cat << EOF | mysql -u root --password=db_rootpassword
CREATE DATABASE db_name;
GRANT ALL PRIVILEGES ON db_name.* TO "db_user"@"%"
IDENTIFIED BY "db_password";
FLUSH PRIVILEGES;
EXIT
EOF
params:
db_rootpassword: { get_param: db_root_password }
db_name: { get_param: db_name }
db_user: { get_param: db_username }
db_password: { get_param: db_password }
outputsセクション
outputsセクションでは、スタックの作成が完了した後の出力を記述します。今回使用するテンプレートでは、構築したWordPressにアクセスするためのURLを返すようにしています。
outputs:
website_url:
description: URL for Wordpress wiki
value:
str_replace:
template: http://host/wordpress
params:
host: { get_attr: [web_server_floating_ip, floating_ip_address] }
公式のテンプレートガイドによると、OS::Neutron::FloatingIPリソースにおいて、FloationgIPを払い出すネットワークを指定する際はfloating_networkプロパティを使用するよう記載されています。しかし、Icehouse版のソースコードではfloating_network_idプロパティの指定が必須であるため、今回のテンプレートではfloating_network_idを使用しています。従って、パラメータ「public_net」には外部ネットワークのUUIDを指定してください。この問題は最新のソースコードでは修正されているので、今後のアップデートで修正されると考えられます。

