如何用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
相关产品推荐
相关产品推荐

