めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

quickrdoでRDO/Havanaのデモ環境構築(Heatも使えるよ)

Fedora19を利用して、Heatも使えるRDOのデモ環境(All-in-one構成)を最短手順で構築します。

構築するデモ環境の全体像

物理NICを2個持つサーバーを用意して、両方のNICを同一のパブリックネットワークに接続します。

em1にはIPアドレスを割り当てて、外部から管理接続する際に使用します。SSHでログインしたり、WebブラウザでHorizonを使用する際のIPアドレスです。em2にはIPアドレスを割り当てません。これは、VMインスタンスがパブリックネットワークと通信する際のNICとして使用します。ネットワーク環境(IPアドレス)については、下記の情報を事前に決定してください。

項目 値の例
サブネット 192.168.199.0/24
ゲートウェイ 192.168.199.1
DNSサーバ 8.8.8.8
IPアドレスプール 192.168.199.100〜192.168.199.199
サーバのIPアドレス 192.168.199.99

「IPアドレスプール」は、Floating IPや仮想ルータの外部IPアドレスなど、OpenStackが自由に利用できるIPアドレスの範囲です。ネットワーク上で未使用のIPアドレスの範囲を指定してください。仮想ネットワークについては、ほぼ決め打ちで、次のような構成になります。

---------------- パブリックネットワーク
        |
   [demo_router] : 仮想ルータ
        |
     ----------------- プライベートネットワーク
                       private01 192.168.101.0/24

プロジェクト(テナント)「demo」に対して、上記のプライベートネットワークが用意されます。プライベートネットワークの数やサブネットは、オプションで変更することは可能です。

Fedora19のインストール

はじめにサーバにFedora19をインストールします。ソフトウェアの選択では、「最小限のインストール」+ 「標準アドオン」を選びます。ネットワークの設定の画面では、「em1」に先の表で決定した「サーバのIPアドレス」を設定します。この画面でホスト名を設定するのも忘れないでください。ディスクパーティションは、デフォルト構成とします。インストール先のディスクを選択して「続行」を押すと、下記のポップアップが表示されるので、そのまま「続行」で次に進みます。

インストールが完了して、システムが起動したら、「/etc/sysconfig/network-scripts/ifcfg-em2」に「ONBOOT=no」を指定します。最後に、全パッケージをアップデートして再起動します。

# yum -y update
# reboot

RDOのインストールと初期設定

次のコマンドでインストールスクリプトをダウンロードして、インストールを実施します。

# yum -y install git
# cd ~
# git clone https://github.com/enakai00/quickrdo
# cd quickrdo
# git checkout f19-havana
# ./setup.sh

途中で次のようなメッセージがでたら、rootパスワードを入力します。

Setting up ssh keys...root@192.168.199.99's password: 

インストールが完了すると、「Done. Now, you need to reboot the server.」というメッセージがでます。インストールが途中で失敗した場合は、「~/quickrdo/cleanup.sh」を実行するとインストール前の状態に戻りますので、再度、「~/quickrdo/setup.sh」を実行してください。

ここで、一度サーバーを再起動します。

# reboot

サーバが起動したら、初期設定(仮想ネットワークの構成やユーザの追加など)を行います。ネットワーク構成が先の表と異なる場合は、スクリプト「~/quickrdo/config.sh」の冒頭にある下記の設定を書き換えます。それぞれ、表の上から4つの項目に対応します。最後の1つは、仮想ネットワークの指定です。

public="192.168.199.0/24" 
gateway="192.168.199.1" 
nameserver="8.8.8.8" 
pool=("192.168.199.100" "192.168.199.199") 
private=("192.168.101.0/24")

次のように、複数の仮想ネットワークを作成することもできます。

private=("192.168.101.0/24" "192.168.102.0/24")

次のコマンドで、初期設定を行います。

# cd ~/quickrdo
# ./config.sh

「VM access NIC:」という表示が出るので、「仮想マシンアクセス用NIC」のデバイス名(今の例では「em2」)を入力します。最後に「Configuration finished.」と表示されれば完了です。

設定を変更する際は、「./config.sh」を再度実行してください。以前の設定を削除して、新しい設定が行われます。

VMインスタンスの起動

先の初期設定スクリプトで、次のユーザが作成されていますので、Horizonのダッシュボードからログインします。通常は、一般ユーザの方を使用してください。

ユーザ名 パスワード ロール
demo_user passw0rd 一般ユーザ
demo_admin passw0rd 管理者

Fedora20のテンプレートが自動登録されているので、これから仮想マシンインスタンスを起動することができます。demo_userの認証鍵は、「mykey」が自動登録されています。対応する秘密鍵のファイルは、「~/mykey.pem」にありますので、Floating IPを割り当てた後に、次のコマンドでログインすることができます。

# ssh -i ~/mykey.pem ec2-user@192.168.199.101

Fedora20のテンプレートでは、ログインユーザ「ec2-user」が自動作成されるようになっています。rootユーザには次のコマンドで切り替えることができます。

$ sudo -i

Heatの利用

Heatの利用にはadmin権限が必要ですので、ユーザ「demo_admin」用のkeystonercファイルを用意して、このユーザからHeatを利用します。

keystonerc_demo_admin

export OS_USERNAME=demo_admin
export OS_TENANT_NAME=demo
export OS_PASSWORD=passw0rd
export OS_AUTH_URL=http://192.168.199.99:35357/v2.0/
export PS1='[\u@\h \W(keystone_demo_admin)]\$ '

鍵ペアー「adminkey」を登録して、この後のデモのためにセキュリティグループで80番ポートへのアクセスを許可します。

# . keystonerc_demo_admin
# nova keypair-add adminkey > ~/adminkey.pem
# chmod 600 ~/adminkey.pem
# nova secgroup-add-rule default tcp 80 80 0.0.0.0/0

デモ用のテンプレートファイルを用意します。PostgreSQLサーバを構築した後、RoRの伝言板アプリのサーバを構築して、DB接続設定するというシナリオです。PostgreSQLサーバの構築は、GitHubからPuppetマニフェストを取得して適用することで行います。RoRの方は、シェルスクリプトで頑張っています。

dengonban.template

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "A Database instance running a local PostgreSQL server",
  "Parameters" : {
    "GitRepo" : {
      "Description" : "Git Repository URL",
      "Type" : "String",
      "Default" : "https://github.com/enakai00/pgsql_puppet"
    },
    "GitTag" : {
      "Description" : "Git Tag",
      "Type" : "String",
      "Default" : "heat-demo1.0"
    },
    "KeyName" : {
      "Description" : "KeyPair to enable SSH access",
      "Type" : "String"
    },
    "InstanceType" : {
      "Description" : "Instance type",
      "Type" : "String",
      "AllowedValues" : [ "m1.tiny", "m1.small", "m1.medium", "m1.large", "m1.xlarge" ],
      "ConstraintDescription" : "must be a valid instance type.",
      "Default" : "m1.small"
    },
    "ImageName" : {
      "Description" : "Image name of instance",
      "Type" : "String",
      "Default" : "Fedora20"
    }
  },

  "Resources" : {
    "PgSQLDatabaseServer": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "SubnetId"       : "ca4c7d8a-7b15-49b3-80ae-0b1e3b3498db",
        "ImageId"        : { "Ref" : "ImageName" },
        "InstanceType"   : { "Ref" : "InstanceType" },
        "KeyName"        : { "Ref" : "KeyName" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -x\n",
          "GitRepository=", { "Ref" : "GitRepo" }, "\n",
          "ConfigTag=", { "Ref" : "GitTag" }, "\n",
          "yum -y install puppet git\n",
          "RepoName=${GitRepository##*/}\n",
          "RepoName=${RepoName%.git}\n",
          "mkdir -p /tmp/gittmp\n",
          "cd /tmp/gittmp\n",
          "git clone $GitRepository\n",
          "cd $RepoName\n",
          "git checkout $ConfigTag\n",
          "export FACTER_manifest_dir=\"/tmp/gittmp/$RepoName\"\n",
          "puppet apply main.pp\n",
          "# All is well so signal success\n",
          "/bin/cfn-signal -e 0 -r \"PostgreSQL Database setup complete\" '",
          { "Ref" : "PgSQLWaitHandle" }, "'\n"
        ]]}}
      }
    },

    "PgSQLWaitHandle" : {
      "Type" : "AWS::CloudFormation::WaitConditionHandle"
    },

    "PgSQLWaitCondition" : {
      "Type" : "AWS::CloudFormation::WaitCondition",
      "DependsOn" : "PgSQLDatabaseServer", "Properties" : {
        "Handle" : {"Ref" : "PgSQLWaitHandle"},
        "Timeout" : "6000"
      }
    },

    "WebServer": {
      "Type": "AWS::EC2::Instance",
      "DependsOn": "PgSQLWaitCondition",
      "Properties": {
        "SubnetId"       : "ca4c7d8a-7b15-49b3-80ae-0b1e3b3498db",
        "ImageId"        : { "Ref" : "ImageName" },
        "InstanceType"   : { "Ref" : "InstanceType" },
        "KeyName"        : { "Ref" : "KeyName" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -x\n",
          "export DB_IP=", { "Fn::GetAtt" : [ "PgSQLDatabaseServer", "PublicIp" ] }, "\n",
          "export HOME=/root\n",
          "yum install -y make gcc gcc-c++ ruby-devel rubygem-rails rubygem-therubyracer rubygem-pg postgresql postgresql-devel\n",
          "echo '*:*:*:postgres:pas4pgsql' > /root/.pgpass\n",
          "chmod 600 /root/.pgpass\n",
          "psql -h $DB_IP -U postgres -c \"create user rails encrypted password 'pas4rails'\"\n",
          "psql -h $DB_IP -U postgres -c \"create database dengonban_production owner rails\"\n",
          "mkdir /root/rails\n",
          "cd /root/rails\n",
          "rails new dengonban -d postgresql\n",
          "cd dengonban\n",
          "echo \"gem 'therubyracer', platforms: :ruby\" >> Gemfile\n",
          "sed -i \"s/\\(username\\):.*/\\1: rails/\" config/database.yml\n",
          "sed -i \"s/\\(password\\):.*/\\1: pas4rails\\n  host: $DB_IP/\" config/database.yml\n",
          "sed -i \"s/# \\(config.time_zone\\) =.*/\\1 = 'Tokyo'/\" config/application.rb\n",
          "sed -i \"s/\\(config.serve_static_assets\\) =.*/\\1 = true/\" config/environments/production.rb\n",
          "RAILS_ENV=production bundle exec rake assets:precompile\n",
          "rails generate scaffold Message name:string content:text date:datetime\n",
          "rake db:migrate RAILS_ENV=\"production\"\n",
          "rails s -e production -p 80 -d\n"
        ]]}}
      }
    },

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

2箇所の"SubnetId"は、下記のコマンドで表示されるIDに書き換えておいてください。

# neutron subnet-list | grep private01 | cut -d"|" -f2
 013cd465-7e75-4edc-ae83-6476fcf9178b 

そして、おもむろにテンプレートからスタックを構築します。

# . keystonerc_demo_admin 
# heat stack-create -f dengonban.template -P "KeyName=adminkey" dengonban
+--------------------------------------+------------+--------------------+----------------------+
| id                                   | stack_name | stack_status       | creation_time        |
+--------------------------------------+------------+--------------------+----------------------+
| 93a10156-329a-42ca-b40c-aa085006a576 | dengonban  | CREATE_IN_PROGRESS | 2014-07-05T07:30:25Z |
+--------------------------------------+------------+--------------------+----------------------+

この後は、/var/log/heat/engine.logを眺めながら構築が終わるのを待ちます。構築が終わるとこんな感じになります。

# heat stack-list
+--------------------------------------+------------+-----------------+----------------------+
| id                                   | stack_name | stack_status    | creation_time        |
+--------------------------------------+------------+-----------------+----------------------+
| 93a10156-329a-42ca-b40c-aa085006a576 | dengonban  | CREATE_COMPLETE | 2014-07-05T07:30:25Z |
+--------------------------------------+------------+-----------------+----------------------+

# nova list
+--------------------------------------+--------------------------------------------+--------+------------+-------------+------------------------------------------+
| ID                                   | Name                                       | Status | Task State | Power State | Networks                                 |
+--------------------------------------+--------------------------------------------+--------+------------+-------------+------------------------------------------+
| 6091435d-ed1b-4996-a37e-f5a75d881caa | dengonban-PgSQLDatabaseServer-m4yec74h2nml | ACTIVE | -          | Running     | private01=192.168.101.3                  |
| 145afbfc-a983-46a7-9132-a9680f41bfe6 | dengonban-WebServer-lxvndg7khjwx           | ACTIVE | -          | Running     | private01=192.168.101.4, 192.168.200.105 |
+--------------------------------------+--------------------------------------------+--------+------------+-------------+------------------------------------------+

RoRのサンプルによくある伝言板アプリが動いていることが分かります。

実用性はよく分かりませんが、Havanaでは、Horizonダッシュボードからもスタックの状態が確認できて、こんなポンチ絵も表示できます。