You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+OpenStack SDK访问YAML分组内的云实例

问题:OpenStack SDK如何从分组后的YAML配置中连接云实例?

YAML配置文件内容

clouds:
 all:
  gr1:
   id: '202401'
  gr2:
   id: '202402'
  gr3:
   id: '202403'
  gr4:
   id: '202404'

 group1:
  gr1:
   id: '202401'

 group2:
  gr2:
   id: '202402'

 group34:
  gr3:
   id: '202403'
  gr4:
   id: '202404'

现有Python代码

import openstack
import yaml

with open('test.yaml', 'r') as f:
    reg = yaml.safe_load(f)

all_groups = []
for name in reg['clouds']['all']:
    all_groups.append(name)

group1 = []
for name in reg['clouds']['group1']:
    group1.append(name)

group34 = []
for name in reg['clouds']['group34']:
    group34.append(name)

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

# Initialize connection
for region in all_groups:
    conn = openstack.connect(cloud=region) # test.yaml

运行报错

openstack.exceptions.ConfigException: Cloud gr1 was not found.

错误尝试及对应报错

尝试修改连接代码为:

# Initialize connection
for region in all_groups:
    conn = openstack.connect(cloud=['all'][region]) # test.yaml

得到报错:

TypeError: list indices must be integers or slices, not str

解决方案

OpenStack SDK的connect()方法默认只会在clouds根节点下查找云配置,你的分组嵌套结构不在它的默认查找路径里,可通过以下两种方式解决:

方式一:调整YAML结构(推荐)

把分组里的云配置提取到clouds根节点下,同时将分组改为对应云名称的列表,既符合SDK的预期格式,又能保留分组逻辑:

clouds:
  gr1:
    id: '202401'
    # 补充OpenStack连接所需的其他必填字段(如auth_url、username等)
  gr2:
    id: '202402'
  gr3:
    id: '202403'
  gr4:
    id: '202404'
  # 分组作为云名称列表
  all: ["gr1", "gr2", "gr3", "gr4"]
  group1: ["gr1"]
  group2: ["gr2"]
  group34: ["gr3", "gr4"]

修改后代码可直接遍历分组对应的云名称列表:

# 读取分组对应的云列表
all_groups = reg['clouds']['all']

# 初始化连接
for region in all_groups:
    conn = openstack.connect(cloud=region)
    # 后续操作...

方式二:手动构造云配置参数传递给connect()

如果不想修改YAML结构,可直接从分组中取出对应云的完整配置,通过cloud_config参数传给connect()方法,而非仅用cloud参数指定名称:

# 初始化连接
for region in all_groups:
    # 从分组中取出对应云的配置
    cloud_config = reg['clouds']['all'][region]
    # 确保cloud_config包含OpenStack连接所需的所有必填字段(auth_url、username等)
    conn = openstack.connect(cloud_config=cloud_config)
    # 后续操作...

内容的提问来源于stack exchange,提问作者Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:20:01