如何用Python快速将kubectl节点输出转为节点IP字典
提取Kubectl节点输出为IP映射字典的高效方法
方法一:用Kubectl内置格式化(最推荐)
不用额外处理文本,直接让kubectl输出目标格式,效率最高:
1. 输出纯键值对
执行命令直接拿到节点名和对应IP:
kubectl get nodes -o custom-columns=NAME:.metadata.name,INTERNAL-IP:.status.addresses[?(@.type=="InternalIP")].address --no-headers
输出示例:
cp-node-1 xxx cp-node-2 yyy cp-node-3 zzz
2. 直接生成Python字典格式
结合jsonpath快速生成可复用的字典结构:
kubectl get nodes -o jsonpath='{range .items[*]}"{.metadata.name}": "{.status.addresses[?(@.type=="InternalIP")].address}",{"\n"}'
把输出稍作整理(去掉最后一个逗号)就能直接作为Python字典使用,或者用一行Python转换:
node_ip = dict(line.split(maxsplit=1) for line in '''cp-node-1 xxx cp-node-2 yyy cp-node-3 zzz'''.splitlines() if line.strip())
方法二:正则表达式处理原始文本
如果已经拿到了原始的命令输出文本,用正则快速提取:
import re raw_output = ''' NAME STATUS ROLES AGE VERSION INTERNAL-IP cp-node-1 Ready control-plane xxx xxx xxx cp-node-2 Ready control-plane xxx xxx yyy cp-node-3 Ready control-plane xxx xxx zzz ''' # 匹配每行的节点名和内部IP,跳过表头 pattern = re.compile(r'\s*(\S+)\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)') node_ip = {} for line in raw_output.splitlines(): match = pattern.match(line) if match and not line.strip().startswith('NAME'): node_name, ip = match.groups() node_ip[node_name] = ip # 调用示例 print(node_ip['cp-node-1']) # 输出 xxx
正则逻辑:跳过开头空白,捕获第一个非空白串(节点名),跳过中间无关字段,最后捕获内部IP。
内容的提问来源于stack exchange,提问作者Lakshmi Narayanan
相关产品推荐
相关产品推荐

