
本教程详细介绍了如何利用 openshift python 客户端库高效地获取 configmap 中的数据。文章对比了 `oc.invoke`(模拟命令行操作)和 `oc.selector`(直接 api 交互)两种方法,强调了后者作为推荐实践的优势。通过清晰的代码示例,读者将学习如何遍历项目并提取指定 configmap 的详细数据,从而实现 openshift 资源管理的自动化。
使用 Python 客户端库获取 OpenShift ConfigMap 数据
在 OpenShift 环境中,ConfigMap 是存储非敏感配置数据的重要资源。当需要通过自动化脚本或应用程序来读取这些配置时,使用 OpenShift Python 客户端库是一个高效且强大的选择。本文将深入探讨如何利用该库来获取 ConfigMap 的详细数据,并提供两种实现方法,重点推荐其中一种更符合 Pythonic 风格的实践。
1. 准备工作
首先,请确保已安装 OpenShift Python 客户端库。如果尚未安装,可以通过 pip 进行安装:
pip install openshift-client-python
此外,运行脚本的用户需要具备足够的权限来访问 OpenShift 项目和 ConfigMap 资源。
2. 方法一:通过 oc.invoke 模拟命令行操作
oc.invoke 函数允许你在 Python 脚本中执行与 oc 命令行工具相同的命令。这种方法对于熟悉 oc 命令的用户来说直观易懂,但它本质上是执行外部命令并解析其标准输出。
立即学习“Python免费学习笔记(深入)”;
问题背景:
直接运行 oc get configmaps 只能获取 ConfigMap 的名称和一些元数据,而无法获取其内部的 data 字段。为了获取详细数据,我们需要像在命令行中一样,指定输出格式为 JSON,例如 oc get configmap
实现步骤:
- 遍历项目: 首先,使用 oc.selector('projects') 获取所有项目的列表。
- 切换项目上下文: 对于每个项目,使用 oc.invoke('project', project_name) 切换到该项目。
- 获取 ConfigMap 名称: 使用 oc.invoke('get', ['configmaps', '-o', 'name']) 获取当前项目下所有 ConfigMap 的名称列表。
- 逐个获取详细数据: 对于每个 ConfigMap 名称,再次使用 oc.invoke 并指定 -o json 选项来获取其完整的 JSON 描述,然后解析 JSON 字符串以提取 data 字段。
示例代码:
SHOPEX仿M18紫色版 ,适合综合商城,服饰商城.化妆品商城等使用.程序基于SHOPEX4.8.5 最新版制作. 安装方法:1.解压上传程序至网站根目录.. 访问:域名/bak.(用户名:admin 密码:123456)2.进入帝国备份王后,配置数据库信息.选择-www.taomoban.net目录.还原数据库.3.修改FTP目录下的config/config.php 数据库连接信息.4.登陆
import openshift as oc
import json
def get_configmap_data_via_invoke():
"""
使用 oc.invoke 方法获取所有项目的 ConfigMap 数据。
此方法模拟命令行操作,需解析 JSON 字符串。
"""
print("--- 使用 oc.invoke 方法获取 ConfigMap 数据 ---")
projects_selector = oc.selector('projects')
for project in projects_selector.objects():
project_name = project.name()
print(f"\n正在处理项目: {project_name}")
# 切换到当前项目
oc.invoke('project', project_name)
# 获取当前项目下所有 ConfigMap 的名称列表
# -o name 确保输出只包含资源名称,每行一个
configmap_names_output = oc.invoke('get', ['configmaps', '-o', 'name']).out()
configmap_names = [
line.strip().split('/')[-1] # 移除 'configmap/' 前缀
for line in configmap_names_output.splitlines() if line.strip()
]
if not configmap_names:
print(f" 项目 {project_name} 中没有找到 ConfigMap。")
continue
for cm_name in configmap_names:
try:
# 获取单个 ConfigMap 的完整 JSON 数据
cm_json_output = oc.invoke('get', ['configmap', cm_name, '-o', 'json']).out()
manifest = json.loads(cm_json_output)
data = manifest.get('data', {})
print(f" ConfigMap: {cm_name}, 数据: {data}")
except Exception as e:
print(f" 获取 ConfigMap '{cm_name}' 数据失败: {e}")
if __name__ == '__main__':
get_configmap_data_via_invoke()注意事项: 虽然 oc.invoke 方法可行,但它涉及到字符串解析和 JSON 反序列化,这增加了代码的复杂性,并且在处理大量资源时可能不如直接使用 API 交互高效。
3. 方法二:使用 oc.selector 进行直接 API 交互(推荐)
oc.selector 是 OpenShift Python 客户端库中更推荐的用法,它允许你以更 Pythonic 的方式直接与 OpenShift API 对象交互,而无需解析命令行输出。这种方法返回的是 Python 对象,可以直接访问其属性和方法。
实现步骤:
- 遍历项目: 同样使用 oc.selector('projects') 获取项目列表。
- 进入项目上下文: 使用 with oc.project(project_name): 语句块,可以安全地在特定项目上下文中执行操作,无需手动切换。
- 选择 ConfigMap: 在项目上下文内,使用 oc.selector('configmaps') 来选择当前项目中的所有 ConfigMap。
- 遍历 ConfigMap 对象: 迭代 configmaps.objects() 将返回 ConfigMap 的 API 对象实例。
- 直接访问数据: 每个 ConfigMap 对象都有一个 as_dict() 方法,可以将其转换为 Python 字典,从而直接访问 data 字段。
示例代码:
import openshift as oc
def get_configmap_data_via_selector():
"""
使用 oc.selector 方法获取所有项目的 ConfigMap 数据。
此方法直接与 OpenShift API 对象交互,是推荐的做法。
"""
print("--- 使用 oc.selector 方法获取 ConfigMap 数据 (推荐) ---")
projects_selector = oc.selector('projects')
for project in projects_selector.objects():
project_name = project.name()
print(f"\n正在处理项目: {project_name}")
# 进入项目上下文
with oc.project(project_name):
configmaps_selector = oc.selector('configmaps')
# 检查是否有 ConfigMap
if not configmaps_selector.objects():
print(f" 项目 {project_name} 中没有找到 ConfigMap。")
continue
for cm in configmaps_selector.objects():
try:
# 直接从 ConfigMap 对象中获取数据
# as_dict() 将 API 对象转换为 Python 字典
data = cm.as_dict().get('data', {})
print(f" ConfigMap: {cm.name()}, 数据: {data}")
except Exception as e:
print(f" 获取 ConfigMap '{cm.name()}' 数据失败: {e}")
if __name__ == '__main__':
get_configmap_data_via_selector()优点:
- 更简洁的代码: 无需手动解析 JSON 字符串。
- 更健壮: 直接操作 Python 对象,减少因命令行输出格式变化而导致的错误。
- 更符合 Pythonic 风格: 与 Python 的面向对象特性更好地结合。
- 性能更优: 避免了额外的进程创建和字符串处理开销。
4. 总结与最佳实践
本文详细介绍了两种使用 OpenShift Python 客户端库获取 ConfigMap 数据的方法。虽然 oc.invoke 提供了一种模拟命令行操作的途径,但 强烈推荐使用 oc.selector 进行直接的 API 交互。oc.selector 方法不仅代码更简洁、可读性更强,而且在处理 OpenShift 资源时也更加健壮和高效。
在实际应用中,除了获取数据,你可能还需要对 ConfigMap 进行创建、更新或删除操作。OpenShift Python 客户端库同样提供了相应的接口,通常也是通过 oc.selector 获取到资源对象后,调用其对应的方法(如 update()、delete() 等)来实现。始终优先选择直接的 API 交互方式,以构建更可靠和可维护的自动化解决方案。









