如何用Python hvac库递归列出Vault指定引擎下所有目录与密钥
实现方案
要递归获取指定KV V2引擎下的全量目录和密钥,按以下逻辑实现即可:
- 调用
list_secrets查询某路径下的条目时,若查询引擎根目录,path参数传空字符串'',单独指定mount_point为你的引擎名称,不要把引擎名填入path参数 - 递归判断返回的条目类型:结尾带
/的是子目录,需要再次调用list接口遍历;不带/的是密钥,调用读接口拉取内容 - 结果可直接组装为嵌套字典,导出为JSON格式
完整可运行代码
import os import json import hvac # 初始化Vault客户端 client = hvac.Client( url=os.environ['VAULT_URL'], token=os.environ['VAULT_TOKEN'] ) def get_all_secrets_from_engine(mount_point: str, current_path: str = '') -> dict: """ 递归获取指定KV V2引擎下的所有密钥 :param mount_point: 引擎挂载点名称 :param current_path: 当前遍历的路径,初始调用留空即可 :return: 嵌套结构的字典,对应目录和密钥内容 """ result = {} # 列出当前路径下的所有条目 list_resp = client.secrets.kv.v2.list_secrets( path=current_path, mount_point=mount_point ) keys = list_resp['data']['keys'] for key in keys: if key.endswith('/'): # 是子目录,递归遍历 sub_dir_name = key.rstrip('/') result[sub_dir_name] = get_all_secrets_from_engine( mount_point=mount_point, current_path=f"{current_path}{key}" ) else: # 是密钥,读取最新版本内容 secret_resp = client.secrets.kv.v2.read_secret_version( path=f"{current_path}{key}", mount_point=mount_point ) result[key] = secret_resp['data']['data'] return result # 调用示例,替换为你的引擎名称 engine_name = 'myEngine' all_secrets = get_all_secrets_from_engine(engine_name) # 打印JSON格式结果 print(json.dumps(all_secrets, indent=2, ensure_ascii=False))
注意事项
- 该实现默认你的账号拥有该引擎下所有路径的list和read权限,否则会抛出权限异常
- 如果需要保留密钥的版本信息、元数据等内容,可以自行修改读取密钥部分的赋值逻辑,把需要的字段存入结果即可
内容的提问来源于stack exchange,提问作者praiseHellRaiseDale
相关产品推荐
相关产品推荐

