openstack - Python openstacksdk リストサーバー認証エラー

okwaves2024-01-25  5

openstacksdk ライブラリを使用して、クラウド、特にプロジェクト インスタンスのデータをクエリしようとしています。ただし、次のようにインスタンスをリストする場合は次のようになります。

import openstack

conn = openstack.connection.Connection(session=sess)
servers = conn.compute.servers(all_projects=True)

次のエラーが表示され、しばらくハングします。認証を繰り返し試行していると思われます。

...
REQ: curl -g -i -X GET https://booboo-booboo.com:443/v2.1 -H "Accept: application/json" -H "User-Agent: test.py keystoneauth1/4.2.1 python-requests/2.24.0 CPython/3.8.5"
RESP: [401] Content-Length: 114 Content-Type: application/json Date: Sat, 05 Sep 2020 00:32:26 GMT Www-Authenticate: Keystone uri='https://booboo-booboo.com:443/v2.0' X-Compute-Request-Id: req-a25d0bd5-6297-4d2b-80b9-4da1d5993c6d
RESP BODY: {"error": {"message": "The request you have made requires authentication.", "code": 401, "title": "Unauthorized"}}
...

そこで、代わりに nova クライアント API バインディングを使用して接続しました。

from novaclient import client

conn = client.Client('2', session=sess)
servers = conn.servers.list(detailed=True)  

すべてのインスタンスが正常に一覧表示されました。

...
REQ: curl -g -i -X GET https://booboo-booboo.com:443/v2.1/12ecf4ae6a374ca6b21e58a17fed92c3/servers/detail -H "Accept: application/json" -H "User-Agent: python-novaclient" -H "X-Auth-Token: {SHA256}4c803dc6ba5fb03e5cd69ce7c83cef9167e0570dcaa503baeb245fee7c538981"
RESP: [200] Content-Length: 15 Content-Type: application/json Date: Sat, 05 Sep 2020 00:50:49 GMT Openstack-Api-Version: compute 2.1 Vary: OpenStack-API-Version, X-OpenStack-Nova-API-Version X-Compute-Request-Id: req-401556a9-49e4-4e09-96ce-118536be6b46 X-Openstack-Nova-Api-Version: 2.1
RESP BODY: {"servers": []}
GET call to compute for https://booboo-booboo.com:443/v2.1/12ecf4ae6a374ca6b21e58a17fed92c3/servers/detail used request id req-401556a9-49e4-4e09-96ce-118536be6b46
...

私は彼らの openstackclient CLI ツールを調べました。

openstack server list --all-projects --timing --debug

これは実行時にも機能し、デバッグ フラグを使用すると次の出力が表示されます。

...
compute API version 2.1, cmd group openstack.compute.v2
identity API version 3, cmd group openstack.identity.v3
image API version 2, cmd group openstack.image.v2
network API version 2, cmd group openstack.network.v2
object_store API version 1, cmd group openstack.object_store.v1
volume API version 3, cmd group openstack.volume.v3
neutronclient API version 2, cmd group openstack.neutronclient.v2
command: server list -> openstackclient.compute.v2.server.ListServer (auth=True)
...

サービスごとに必要な複数の異なるクライアントを初期化しているのだと思います。そこで私の質問は、openstacksdkを使用して同じことを行う方法はあるのかということです。e OpenStack から複数のサービスをクエリする必要がありますが、異なるサービスの複数の異なるクライアントを追跡したくありません。

セッション オブジェクトを作成するコードは次のとおりです。

from keystoneauth1.identity import v3
from keystoneauth1 import session
from keystoneauth1 import loading

def create_loader():
    loader = loading.get_plugin_loader('password')
    auth = loader.load_from_options(
        auth_url=os.environ['OS_AUTH_URL'],
        username=os.environ['OS_USERNAME'],
        password=os.environ['OS_PASSWORD'],
        project_id=os.environ['OS_PROJECT_ID'],
        user_domain_name=os.environ['OS_USER_DOMAIN_NAME']
        )
    sess = session.Session(auth=auth)
    return sess


------------------------

おそらく、問題は OpenStack パラメーター (ファイル: Clouds.yaml) の仕様にあると思われます。このコードを実行すると:

import openstack

# Initialize and turn on debug logging
openstack.enable_logging(debug=True)

# Initialize cloud
conn = openstack.connect(cloud='yourcloud')

for server in conn.compute.servers(all_projects=True):
  print(server.to_dict())

設定ファイルは次のようになります。

clouds:
  yourcloud:
    region_name: <your region name>
    auth:
      username: '<username>'
      password: '<password>'
      project_name: '<project name>'
      auth_url: '<keystone auth. url>'
      domain_name: '<domain name>'

マルチリージョンがない場合は、このパラメータ (region_name) を無視できます。ドメイン名は通常、環境内で定義されている場合に要求されます。

そう考えると、keystone URL の設定データを確認してください。バージョン 2 を呼び出しているようですが、openstacksdk は次の情報を提供します。

identity API version 3, cmd group openstack.identity.v3

auth_url の定義でバージョン 3 を使用してみてください

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。