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 件のコメント:
コメントを投稿