/var/log/study

つまり雑記

Keystoneの認証を利用してOpenStack APIを利用する

OpenStackをAPIでいろいろ操作する必要が出てきたので、OpenStack SDKに入門したのですが、微妙に躓いたのでメモを残して置きます。

2018年7月28日での話

実現したかったこと

自分が利用するOpenStack環境は、各エンドポイントがURLパスではなくドメインで分割されていたので、以下を実現したかった。

  1. keystoneに対して認証して
  2. 各エンドポイントに対してAPIをコールする

kestone認証を利用する

keystoneでsession情報を取得し、他の各クライアントにsession情報を引数で渡す。

参考にしたURLは https://docs.openstack.org/python-keystoneclient/latest/using-api-v3.html#authenticating-using-sessions

以下のような感じでSDKを利用しておけば良い気がする。

pre requirement

pip install python-novaclient python-glanceclient python-keystoneclient

コード

import os

from keystoneauth1.identity import v3
from keystoneauth1 import session

from glanceclient import Client
from novaclient import client as novaclient



def get_keystone_credential():
    return {
        'auth_url': os.getenv('OS_AUTH_URL', ''),
        'user_id': os.getenv('OS_USER_ID', ''),
        'password': os.getenv('OS_PASSWORD', ''),
        'project_id': os.getenv('OS_PROJECT_ID', ''),
    }

if __name__ == '__main__':
    auth = v3.Password(**get_keystone_credential())
    sess = session.Session(auth=auth)
    glance = Client('2', session=sess)
    print("---images---")
    for image in glance.images.list():
       print(image['name'])

    print("---servers---")
    nova = novaclient.Client('2', session=sess)
    for s in nova.servers.list():
        print(s.name)

エンドポイントを指定する

こちらに関しては、利用したい各クライアントによって指定方法が異なる気がする。

glanceなら Clientを生成するときの引数で endpoint を指定するし、

https://github.com/openstack/python-glanceclient/blob/master/glanceclient/client.py#L23

novaだとhttps://github.com/openstack/python-novaclient/blob/master/novaclient/client.py#L270 から生成されるであろう https://github.com/openstack/python-novaclient/blob/master/novaclient/v2/client.py#L50 には endpoint_override という引数で指定できそう

ココらへんのことを書いてあるドキュメントを見つけられず、コードを読んで結論を出したので、もしかしたらもっと良い方法があるかもしれない。

反省点

軽い気持ちでSDKというくくりの日本語ドキュメントを読み始めたのが間違いだった。

各クライアントのドキュメントを読むと良い気がする。

OpenStack Docs: Python bindings to the OpenStack Identity API (Keystone)

OpenStack Docs: Python Bindings for the OpenStack Images API

OpenStack Docs: Python bindings to the OpenStack Nova API