2015年12月5日土曜日

環境変数1つで OpenStack 環境を切り替える os-client-config

OpenStack ユーザー会 2015 アドベントカレンダーの 12/5 分です。

みなさん、OpenStack の CLI (nova, neutron, ..., openstack コマンドも) を使うときにどうやって認証情報などを渡していますか?

おそらくほとんどの方は openrc を使っていると思います。 みなさんご存知のとおり、openrc はこんなです。シンプルですね。

export OS_TENANT_NAME=mytenant
export OS_USERNAME=test-user
export OS_PASSWORD=hey-secret
export OS_AUTH_URL=https://keystone.example.com:443/v2.0

シンプルなのはいいのですが、 複数の OpenStack ベースのクラウドを使用したり、 同じ OpenStack クラウドでも一般ユーザーと管理者のアカウントを切り替えたり、 といったことをしようとすると、だんだん大変になってきます。 openrc ファイルをたくさん用意して、毎回読み直すのは面倒です。

そこで os-client-config の出番です。 os-client-config は、OpenStack の CLI で複数の OpenStack クラウドを管理しやすくする目的で開発されています。現在は openstackclient と一部のプロジェクト単位の CLI (neutron など) で対応しています。

openrc に相当する情報は ~/.config/openstack/clouds.yaml で定義します。 ファイルの場所は、最近の設定ファイル置き場の流儀にしたがっており、
~/.config/openstack は Linux の場合です。 Mac OSX の場合は ~/Library/Application Support/openstack になります。

以下は devstack で定義される clouds.yaml です。 一般ユーザーの devstack と管理ユーザーの devstack-admin という 2 つの設定があります。パラメーターとしては auth セクションに openrc で定義されているのと同様の内容が定義されています。

clouds:
  devstack:
    auth:
      auth_url: http://auth.example.com:5000
      password: your-secret
      project_domain_id: default
      project_name: demo
      user_domain_id: default
      username: demo
    identity_api_version: '3'
    region_name: RegionOne
  devstack-admin:
    auth:
      auth_url: http://auth.example.com:35357
      password: another-secret
      project_domain_id: default
      project_name: admin
      user_domain_id: default
      username: admin
    identity_api_version: '3'
    region_name: RegionOne

これをコマンドラインで使う場合は、--os-cloud オプションか OS_CLOUD 環境変数で指定します。

--os-cloud オプションで指定してみた例です。 devstack と devstack-admin で簡単にアカウント情報を切り替えられることが分かります。

ubuntu@dev16:~$ openstack --os-cloud devstack server list
+--------------------------------------+------+--------+-----------------------------------------------------+
| ID                                   | Name | Status | Networks                                            |
+--------------------------------------+------+--------+-----------------------------------------------------+
| 9d2e8af2-45d4-4bbf-9cc6-85fb17174cbc | vm1  | ACTIVE | net1=10.0.0.5, fd12:877c:1d66:0:f816:3eff:fe15:40ee |
+--------------------------------------+------+--------+-----------------------------------------------------+

ubuntu@dev16:~$ openstack --os-cloud devstack-admin server list

ubuntu@dev16:~$ 

openrc の時と同様に OS_CLOUD 環境変数で指定することもできます。

ubuntu@dev16:~$ export OS_CLOUD=devstack
ubuntu@dev16:~$ env | grep OS_
OS_CLOUD=devstack
ubuntu@dev16:~$ openstack server list
+--------------------------------------+------+--------+-----------------------------------------------------+
| ID                                   | Name | Status | Networks                                            |
+--------------------------------------+------+--------+-----------------------------------------------------+
| 9d2e8af2-45d4-4bbf-9cc6-85fb17174cbc | vm1  | ACTIVE | net1=10.0.0.5, fd12:877c:1d66:0:f816:3eff:fe15:40ee |
+--------------------------------------+------+--------+-----------------------------------------------------+

neutron CLI でも利用できます。 (12/5 の執筆時点ではこの neutronclient はまだリリースされていません)

ubuntu@dev16:~$ env | grep OS_
OS_CLOUD=devstack
ubuntu@dev16:~$ neutron net-list
+--------------------------------------+-----------+----------------------------------------------------------+
| id                                   | name      | subnets                                                  |
+--------------------------------------+-----------+----------------------------------------------------------+
| 3698d3c7-d581-443e-bf86-53c4e3a738f7 | mynetwork |                                                          |
| a11600dc-cac9-4934-970b-0fa44d5097b8 | ext_net   | 2b86127b-424b-40a9-9a85-9f7be470bc25                     |
|                                      |           | 7e268119-891b-447e-97f8-8e900fb0664e                     |
| e8cbf82d-9f26-4d6f-ab02-dc3bdf05ffce | net1      | 6b832dfe-f271-443c-abad-629961414a73 10.0.0.0/24         |
|                                      |           | cdcc616b-0cff-482f-96f5-06fc63d21247 fd12:877c:1d66::/64 |
+--------------------------------------+-----------+----------------------------------------------------------+
admin 権限の devstack-admin でアクセスすると、 一般ユーザー権限では詳細が見えない neutron external network の ext_net のサブネットが見えていることが分かります。
ubuntu@dev16:~$ env | grep OS_
ubuntu@dev16:~$ neutron --os-cloud devstack-admin net-list
+--------------------------------------+-----------+----------------------------------------------------------+
| id                                   | name      | subnets                                                  |
+--------------------------------------+-----------+----------------------------------------------------------+
| 3698d3c7-d581-443e-bf86-53c4e3a738f7 | mynetwork |                                                          |
| a11600dc-cac9-4934-970b-0fa44d5097b8 | ext_net   | 2b86127b-424b-40a9-9a85-9f7be470bc25 172.24.4.0/24       |
|                                      |           | 7e268119-891b-447e-97f8-8e900fb0664e 2001:db8::/64       |
| e8cbf82d-9f26-4d6f-ab02-dc3bdf05ffce | net1      | 6b832dfe-f271-443c-abad-629961414a73 10.0.0.0/24         |
|                                      |           | cdcc616b-0cff-482f-96f5-06fc63d21247 fd12:877c:1d66::/64 |
+--------------------------------------+-----------+----------------------------------------------------------+

os-client-config のおもしろいところは、 プロファイルという仕組みがあり、クラウドプロバイダーの名前を指定することで、 そのプロバイダー固有の情報を指定できるところです。 簡単な例を挙げます。

clouds:
  dreamhost:
    profile: dreamhost
    auth:
      username: demo
      password: your-secret
      project_name: demo

dreamhost の例です。 devstack の例では存在した auth_url や region_name を 指定していない点に注目してください。これは dreamhost 用の設定が os-client-config の中にあり、 https://github.com/openstack/os-client-config/blob/master/os_client_config/vendors/dreamhost.json で auth_url や region_name が定義されているからです。 auth_url などはクラウドプロバイダーが決まれば一意に決まるものなので、 こう仕組みはありがたいですね。

Mitaka リリースでは、おそらくほとんどの CLI が os-client-config に対応するのではないかと予想しています。

それでは良い CLI 生活を!


最後になりますが、コマンドプロンプトの簡単なカスタマイズを紹介します。 環境変数で指定していたとしても、今どれを指定しているかは簡単に知りたいです。 私は以下のようにして、環境変数の内容をコマンドプロンプトに表示しています。 かなり便利です。

こんな感じになります。

ubuntu@dev16:~$ export OS_CLOUD=devstack
ubuntu@dev16:~ [OS_CLOUD:devstack]$ env | grep OS_
OS_CLOUD=devstack
ubuntu@dev16:~ [OS_CLOUD:devstack]$ unset OS_CLOUD 

ubuntu@dev16:~$ . devstack/openrc 
ubuntu@dev16:~ [OS:demo/demo@dev16]$ env | grep OS_
OS_REGION_NAME=RegionOne
OS_IDENTITY_API_VERSION=2.0
OS_PASSWORD=cloudstack-wakame-aws
OS_AUTH_URL=http://172.16.18.47:5000/v2.0
OS_USERNAME=demo
OS_TENANT_NAME=demo
OS_VOLUME_API_VERSION=2
OS_NO_CACHE=1

ubuntu@dev16:~ [OS:demo/demo@dev16]$ . devstack/openrc admin admin
ubuntu@dev16:~ [OS:admin/admin@dev16]$ env | grep OS_
OS_REGION_NAME=RegionOne
OS_IDENTITY_API_VERSION=2.0
OS_PASSWORD=cloudstack-wakame-aws
OS_AUTH_URL=http://172.16.18.47:5000/v2.0
OS_USERNAME=admin
OS_TENANT_NAME=admin
OS_VOLUME_API_VERSION=2
OS_NO_CACHE=1

~/.bashrc からの抜粋。色付けはお好みで。 ちょっと工夫すれば、admin 権限とそうでないときでプロンプトの色も変えられるでしょう。

__openrc_ps1() {
    if [ -n "$OS_CLOUD" ]; then
        echo " [OS_CLOUD:$OS_CLOUD]"
        return
    fi
    if [ ! -n "$OS_AUTH_URL" ]; then
        return
    fi
    local auth_url=$(echo $OS_AUTH_URL | cut -d / -f 3 | cut -d : -f 1)
    if which resolveip > /dev/null; then
        hostname=$(resolveip $auth_url 2>/dev/null | sed -e 's/^.* is //' -e 's/ //' | cut -d , -f 1)
        if [ -n "$hostname" ]; then
            auth_url=$hostname
        fi
    fi
    echo " [OS:${OS_USERNAME}/${OS_TENANT_NAME}@${auth_url}]"
}

PS1='\u@\h:\w$(__git_ps1)$(__openrc_ps1)\$ '

0 件のコメント:

コメントを投稿