2016年2月1日月曜日

OpenStackの別環境にインスタンスのイメージを移行する

古いOpenStack環境から新しいOpenStack環境にインスタンスのイメージを移行する方法を解説します。

用意するもの

作業用インスタンスを用意する


新旧のOpenStack APIにアクセスできるインスタンスを1台用意します。
私は新環境のOpenStackの中にUbuntuのインスタンスを作成しました。
ローカルのPCでも良かったのですが、旧環境からのダウンロードと新環境へのアップロードに時間がかかりそうだったので、新環境のインスタンスから直接旧環境のAPIを実行してイメージをダウンロードすることにしました。

 

APIにアクセスできるよう環境を準備する




旧環境のOpenStackポータルからAccess & Securityにアクセスします。
「API Access」タブを開き、「Download OpenStack RC File」ボタンを押します。
このファイルはAPIにアクセスするために必要な環境変数をセットするためのスクリプトです。
後で使いますので、適当なところにダウンロードするか、エディタでファイルを作成してコピー&ペーストしましょう。




私は新環境の作業用インスタンスでエディタを使って新規ファイルを作成してコピー&ペーストしました。


このような内容のファイルです。

#!/bin/bash

# To use an Openstack cloud you need to authenticate against keystone, which
# returns a **Token** and **Service Catalog**.  The catalog contains the
# endpoint for all services the user/tenant has access to - including nova,
# glance, keystone, swift.
#
# *NOTE*: Using the 2.0 *auth api* does not mean that compute api is 2.0.  We
# will use the 1.1 *compute api*
export OS_AUTH_URL=https://icos-sea.openstack.blueboxgrid.com:5001/v2.0

# With the addition of Keystone we have standardized on the term **tenant**
# as the entity that owns the resources.
export OS_TENANT_ID=162342da7f4b42adb7adfcb47e3746fd
export OS_TENANT_NAME="Demo Project"

# In addition to the owning entity (tenant), openstack stores the entity
# performing the action as the **user**.
export OS_USERNAME="matsuos"

# With Keystone you pass the keystone password.
echo "Please enter your OpenStack Password: "
read -sr OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT

# If your configuration has multiple regions, we set that information here.
# OS_REGION_NAME is optional and only valid in certain environments.
export OS_REGION_NAME="RegionOne"
# Don't leave a blank variable, unset it if it was empty
if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi


このファイルをopenrc.shという名前で適当なディレクトリに配置します。
このファイルを実行できるよう以下のコマンドを実行します。
$ chmod +x openrc.sh

そして実行します。
$ . ./openrc.sh
パスワードを聞かれるので、旧環境のOpenStackにログインする際のパスワードを入力します。

結果は何も返りませんが、環境変数がセットされています。
以下のコマンドで確認してみましょう。

$ env | grep OS_
OS_REGION_NAME=RegionOne
OS_TENANT_ID=162342da7f4b42adb7adfcb47e3746fd
OS_PROJECT_NAME=IBM-Extended-Playground
OS_PASSWORD=xxxxxxx
OS_AUTH_URL=https://icos-sea.openstack.blueboxgrid.com:5001/v2.0
OS_USERNAME=matsuos
OS_TENANT_NAME=Demo Project


OpenStackコマンドラインインタフェースを導入する

次のコマンドを実行して、OpenStackのAPIをコマンドラインから実行できるツールを導入します。

$ sudo apt-get install python-novaclient
$ sudo apt-get install python-glanceclient


導入がうまくいくと次のコマンドが実行できます。

$ nova list

下記のようにインスタンスの一覧が表示されます。




古い環境でやること

インスタンスのスナップショット

OpenStackのポータルでインスタンスを表示させて、該当インスタンスの「Create Snapshot」を実行します。




ポップアップウィンドウが開くので、任意の名前を付けてCreate Snapshotボタンを押します。


イメージリストに今指定した名前のイメージが作成されました。



イメージ名をクリックして詳細を確認しておきます。
重要な値は「Container Format」と「Disk Format」です。後で使いますのでメモしておきましょう。



イメージのダウンロード

イメージのダウンロードはポータルからは実施できません。
コマンドラインインタフェースから行います。

まず次のコマンドを実行して、イメージリストを取得します。

$ nova image-list





該当イメージのイメージIDをクリップボードにコピーしておきます。
次のコマンドを実行してイメージをダウンロードします。
$ glance image-download --file matsuos-base.qcow2 --progress 7a620cc7-2c66-4f87-9fe9-c9b8fcae37e2


--fileにはダウンロード後のファイル名を指定します。
--progressは進捗状況を表示します。
最後のパラメータは先ほどクリップボードにコピーしておいたイメージIDをペーストします。





新しい環境でやること

イメージの作成(アップロード)

以下のコマンドを実行して、ローカルにあるイメージファイルを使って、イメージを作成します。
--progressオプションを指定しているので、アップロードしている間、進捗状況を表すゲージが進んでいきます。なお、--disk-formatや--container-formatを指定し忘れるとエラーになりますので注意してください。

$ glance image-create --file ../old-bluebox/matsuos-base.qcow2 --progress --name matsuos-base-image --disk-format qcow2 --container-format bare --min-disk 20

下記のような結果になればイメージの作成が成功しています。



OpenStackのポータルでも確認してみましょう。
下記のように作成されました。
もし、エラーで失敗した場合は、「Progress」状態のままになっていることがあります。
そのような場合は、Delete Imageを実行して削除しましょう。



Image Nameをクリックして詳細を見てみましょう。
古い環境と同じコンテナフォーマットとディスクフォーマットでイメージが作成されました。



インスタンスを起動する

アップロードしたイメージを使ってインスタンスを作成してみましょう。
該当イメージのところで「Launch Instance」をクリックします。


ポップアップウィンドウが開くので、インスタンス名を入力します。



次に、「Access & Security」タブをクリックして、Security Groupを指定します。
ここでは、先に作成しておいた、matsuos-sg-sshという名前のSecurity Groupを指定します。
このSecurity GroupはInternetからtcp/22, 80, 443でアクセスできるルールが記述されています。
この定義を紐づけないと、インスタンスに外部からアクセスできません。



次に、接続するネットワークを選択します。
この例では1つしかネットワークがないので自動的に選択されていますが、複数のネットワークがある場合は手動で選択する必要があります。



最後に、「Post-Creattion」タブに移動して、OS初期化時に実行するスクリプトを指定します。



参照ボタンを押して、ローカルPC上に作成しておいたユーザデータを指定します。
userdata.shの中身は次のようになっています。

#cloud-config
password: zaq12wsx
chpasswd: { expire: False }
ssh_pwauth: True


これはcloud-initというUbuntuなどのLinux OSを初期化する際に起動するスクリプトです。
Ubuntuアカウントの無期限パスワードを設定し、sshで外部からログオンできるようにしています。

ファイルではなくDirect Inputを選択すれば直接入力することもできます。
しかし、何度も繰り返し実行する可能性が高いので、ファイルで持っていた方が後で楽です。

「Launch」ボタンを押してインスタンスを作成しましょう。




これで完成です。