これまでの連載では、APIを利用するのにおもにcurlコマンドを使ってきました。curlでのRESTful APIのしくみを知り、直接操作することも理解を深めるには重要ですが、シェルスクリプトなどで使われる実際の運用に近いツールも便利で、数多く存在します。ConoHa ではOpenStack APIを使ったツールを利用できますが、CLIについてはConoHaの情報サイト「このべん 」や勉強会でも、意外に説明する機会がありませんでした。そこで今回は、OpenStackのCLIの環境構築と利用の方法について解説します。
python-openstackclientと各コンポーネント(nova、neutronなど)のクライアント
python-openstackclientというプロジェクトは、OpenStackClient(OSC)として開発者ドキュメントにあります 。これまで、keystoneなどCLI付きClientライブラリとして開発されていたものを、CLI部の機能を分離して基底ライブラリ(python-keystoneclient)として提供し、CLIのモジュールとして利用していこうという流れから生まれたものです。CLI部が1つになることでユーザインターフェースが統一され、CLIの改善も進みやすくなるということです。
これにより、keystone CLIではdeprecated表示が出て、python-openstackclientに移行するように催促されます。
$ keystone token-get 2>&1 | head -n 2
/Library/Python/2.7/site-packages/keystoneclient/shell.py:64: DeprecationWarning: The keystone CLI is deprecated in favor of python-openstackclient. For a Python library, continue using python-keystoneclient.
'python-keystoneclient.', DeprecationWarning)
OSCの注目すべき項目には次のものがあります。
プラグインモジュール構造
OpenStackコンポーネントのコマンド化と機能を拡張できる
configファイル
yamlで記載、複数のクラウドを登録できる
longフォーマット
詳細な情報を表示可能
(オプション:“ --long” )
カラム(列)指定
列のタイトルを指定し、出力可能
(例:“ -c 'ID'” )
出力フォーマットの変更
(オプション:“ -f <形式>” )
コマンド一覧をCLIで確認するには、次のようにします(yaml形式出力) 。
$ openstack command list -f yaml
コマンド体系を見る限り、Compute(nova) 、Identity(keystone) 、Volume(cinder) 、Networking(neutron) 、Object Storage(swift)の機能が利用できます。
OpenStack CLIのインストール
OSCをインストールします。筆者の手元の環境(Mac OS X Yosemite 10.10.5、Homebrew 0.9.5)の場合は、次のような手順でインストールします。どんどん開発が進むので、pipでバージョン指定して、自分に合ったものをインストールするとよいでしょう。
$ sudo easy_install pip
$ sudo pip install python-openstackclient==1.7.1
CLIを使うには、テナントName(またはテナントID) 、APIユーザ、パスワード、APIエンドポイント、作成するリージョンの情報が必要です 。これまでの連載にそって必要な情報を取得しておきます。
CLI環境変数
環境変数を使うことで、毎回のオプション指定を省略できます。使うときだけsourceコマンドで読み込むようにファイルを作ります。PS1変数でプロンプトを変更するのは、セキュリティ上、使い終わったら終了するという備忘録としての意味合いもあります。
$ cat osrc_conoha_us
export OS_TENANT_NAME=gnct29999993
export OS_PASSWORD='hogehogeman2='
export OS_USERNAME=gncu29999993
export OS_AUTH_URL=https://identity.sjc1.conoha.io/v2.0
export PS1='(env_us)\$ '
$ source osrc_conoha_us
(env_us)$
flavorリストの取得、imageリストの取得、ssh公開鍵の登録
まず、flavorリストを取得します。“ -f value” オプションが出力のFormat指定で、値だけ表示します。何も指定しないと表出力になります。とりあえず、2GBぐらいメモリがほしいので、“ g-2gb” を確認します。
例として、Docker展開用のOSをちょっとカスタマイズすることを考えます。Ubuntu 14.04にdocker engine 1.8.1が入ったものがありますので、imageはこれを選択します。また事前に、作業用クライアントPCのRSA/DSA公開鍵をSSH接続用に登録します。
(env_us)$ openstack flavor list -c 'Name' -c 'RAM' -f value | grep -i 2gb
g-2gb 2048
(env_us)$ openstack image list -c 'Name' -f value | grep docker
vmi-docker-1.8.1-ubuntu-14.04
(env_us)$ openstack keypair create --public-key ~/.ssh/id_rsa.pub my-rsa-key -f yaml
VMの作成
VMを作成します。ConoHaの現在のAPI仕様では、server nameの指定はdummy扱いとなり、内部でIPv4アドレスから生成されたものがデフォルトで割り当てられます。コマンドのオプションで“ new-server” と入れたものはスルーされます。
Webパネルで表示させる名称は“ --property” オプションの“ instance_name_tag=……” で指定するようになっています。
(env_us)$ openstack server create --image vmi-docker-1.8.1-ubuntu-14.04 --flavor g-2gb --key-name my-rsa-key --property "instance_name_tag=docker_base" new-server -f value
セキュリティグループの作成と設定
セキュリティグループを確認します。最初はdefaultというルールしかなく、このままではVMにssh接続できませんが、実はセキュリティグループを作る裏技があります。WebパネルでVMを作り、VMの詳細情報の画面から「ネットワーク情報」 →「 接続許可ポート」にある「ssh(22) 」 「 web(20/21/80/443) 」などをクリックすると、セキュリティグループがコントロールパネルにより作成されます。
(env_us)$ openstack security group list -c 'Name' -f value
default
gncs-ipv4-ssh
gncs-ipv4-web
ConoHaでは、novaのsecurity groupコマンドは現在のところ操作できません。これがAPIツールの互換性を下げることにもなっているのですが、VMのNIC(ポート)ごとにneutronで設定することを標準化しようという考えから、このような仕様になっています。novaのセキュリティグループの挙動とneutronのセキュリティグループの挙動は異なり、次のようになります。
novaでは、VM全体に対してセキュリティグループを設定する
neutronでは、VMのNIC(Port)に対してセキュリティグループを設定する
neutronで複数のネットワークを使っている場合は、VMにNICが複数付きます。間違ってnovaのセキュリティグループを適用してすべてのNICのポリシーが変更され、疎通できなくなることを防ぐために、あえて機能を停止することにしたのです。
“openstack security group create”コマンドはnovaのsecurity group createのAPIにアクセスするので、この理由からConoHaでは現在使えません。その代わり、neutronのコマンドで次のように操作することになります。
(env_us)$ neutron security-group-create docker-works --description "allow docker-machine connect"
(env_us)$ neutron security-group-rule-create --direction ingress --ethertype IPv4 --protocol tcp --port-range-min 22 --port-range-max 22 docker-works -f value
neutronコマンドは、python-openstakclientをインストールしたときにインストールされています。ここでは“ docker-works” というセキュリティグループを作成してTCP 22を開けます。
作ったセキュリティグループは、openstackコマンドでも確認できます。
(env_us)$ openstack security group show docker-works -f yaml
作成済みのVMのNICポートにセキュリティグループを設定するには、“ neutron port-list” で起動しているVMのNICポートを確認し、“ neutron port-update” で適用します。“ netron port-list” コマンドを実行して、IPアドレスが一致するもので特定するか、“ netron port-show <port id>” コマンドでポートの詳細を表示して、“ device_id” が“ openstack server list” コマンドのserver(VM)のIDと同一となることを確認します。
(env_us)$ neutron port-list -f value
(env_us)$ neutron port-show -f yaml 94c23b1b-f922-4070-84ba-baf42c66eff8 | grep 'device_id'
- {Field: device_id, Value: b7ba7ea9-6145-4ae5-aba8-0377d16bdf77}
(env_us)$ openstack server list -f value
b7ba7ea9-6145-4ae5-aba8-0377d16bdf77 163-44-112-102 ACTIVE ext-163-44-112-0-23=163.44.112.102, 2400:8500:2500:624:163:44:112:102
(env_us)$ neutron port-update --security-group docker-works 94c23b1b-f922-4070-84ba-baf42c66eff8
Updated port: 94c23b1b-f922-4070-84ba-baf42c66eff8
セキュリティグループは同じリージョン内で使い回せますので、先に作っておいてVM作成時に次のように指定すると作成時に適用されます。
(env_us)$ openstack server create --image vmi-docker-1.8.1-ubuntu-14.04 --flavor g-2gb --key-name my-rsa-key --security-group docker-works --property "instance_name_tag=docker_base2" new-server2 -f value
新規に作成したセキュリティグループ“ docker-works” はTCP 22ポートを通しますので、ssh接続できます。
サーバ一覧を“ --long” で取得し、Propertiesにも表示します。
(env_us)$ openstack server list --long -c 'ID' -c 'Properties' -f yaml
Propertiesのところに“ docker_base” のタグが入っているので、作成時のコマンドで作ったものが確認できます。実際は、“ openstack server create” コマンドで返答される内容の中に、server ID、server Name、admin_pass(rootに挿入されたランダムなパスワード) 、IPアドレスなどの情報がありますので、そちらを利用するのが最適です。
“openstack server ssh”コマンドでssh接続してみます。ConoHaではrootユーザに対してssh設定されますので、rootユーザを指定します。また、Fixed IP(固定IP)という形態でユーザのVMにIPを割り振っていますので、“--address-type fixed”の指定が必要です。接続元がIPv4のみの場合には、“-4”の指定が必要です。
(env_us)$ openstack server ssh -4 --address-type fixed --login root 11fca3ff-6029-4c3c-8a61-cf1c365a7378
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.16.0-45-generic x86_64)
(中略)
root@163-44-112-111:~#
ここではupdateをかけて、“ docker-182-u1404” という名前でイメージを保存します。
root@163-44-112-111:~# aptitude update
root@163-44-112-111:~# aptitude upgrade -y
root@163-44-112-111:~# docker --version
Docker version 1.8.2, build 0a8c2e3
root@163-44-112-111:~# shutdown -h now
(env_us)$ openstack server image create 11fca3ff-6029-4c3c-8a61-cf1c365a7378 --name "docker-182-u1404" -f yaml
_info
イメージが保存されていることを確認します。
(env_us)$ openstack image list -f value | grep docker
87817478-06a7-4e7f-acbd-db823f7c3377 docker-182-u1404
f05fe793-1d30-4760-9946-70440372dce1 vmi-docker-1.8.1-ubuntu-14.04
これで次回からは、環境構築が終わった“ docker-182-u1404” というVMイメージからVMを起動して利用できることになります。
(env_us)$ openstack server create --image docker-182-u1404 --flavor g-2gb --key-name my-rsa-key --security-group docker-works --property "instance_name_tag=docker01" new-server3 -f value
おわりに
今回は、OpenStackの新しいクライアントOpenStackClient(OSC)をConoHaで使ってみました。また、フォーマットオプションを指定した例も示しました。シェルスクリプトも書きやすくなりますので、ぜひお試しください。