如何从Ansible k8s_info结果中提取状态为Succeeded的Pod名称列表
提取Kubernetes中状态为Succeeded的Traefik Pod名称列表
背景
你已经通过kubernetes.core.k8s_info模块获取了kube-system命名空间下,匹配traefik、traefik-crd标签的Pod的名称与状态信息,需要从中筛选出status.phase为Succeeded的Pod名称列表。以下是两种可靠的实现方法:
方法1:使用json_query过滤
k8s_info模块返回的resources字段是包含所有Pod对象的列表,每个Pod对象包含metadata.name和status.phase结构。使用json_query可以直接通过JMESPath表达式筛选目标数据。
示例Playbook片段
- name: 获取kube-system中traefik相关Pod信息 kubernetes.core.k8s_info: namespace: kube-system kind: Pod label_selectors: - app in (traefik, traefik-crd) register: traefik_pods - name: 提取状态为Succeeded的Pod名称列表 set_fact: succeeded_traefik_pods: "{{ traefik_pods.resources | json_query('[?status.phase == `Succeeded`].metadata.name') }}" - name: 查看筛选结果 debug: var: succeeded_traefik_pods
关键说明
- JMESPath表达式
[?status.phase ==Succeeded].metadata.name的含义:[?...]:遍历列表,筛选满足条件的元素status.phase ==Succeeded``:匹配状态阶段为Succeeded的Pod.metadata.name:提取匹配元素的名称字段
- 注意使用反引号
`包裹Succeeded,避免与外层双引号冲突。
方法2:使用Ansible原生过滤器(无需JMESPath)
如果你对json_query语法不熟悉,可使用Ansible内置的selectattr和map过滤器组合实现筛选:
示例Playbook片段
- name: 获取kube-system中traefik相关Pod信息 kubernetes.core.k8s_info: namespace: kube-system kind: Pod label_selectors: - app in (traefik, traefik-crd) register: traefik_pods - name: 提取状态为Succeeded的Pod名称列表(原生过滤器方式) set_fact: succeeded_traefik_pods: "{{ traefik_pods.resources | selectattr('status.phase', 'equalto', 'Succeeded') | map(attribute='metadata.name') | list }}" - name: 查看筛选结果 debug: var: succeeded_traefik_pods
关键说明
selectattr('status.phase', 'equalto', 'Succeeded'):筛选出状态阶段匹配Succeeded的Pod对象map(attribute='metadata.name'):从筛选后的对象中提取名称字段list:将结果转换为列表格式
常见错误排查
- 路径错误:确保引用的是
traefik_pods.resources而非直接traefik_pods,因为模块返回的核心数据都在resources字段内 - 大小写不匹配:Kubernetes的
status.phase值为大写开头(如Succeeded、Running),需严格匹配字符串 - 引号冲突:使用
json_query时,内层字符串优先用反引号包裹,避免与外层双引号转义问题
内容的提问来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

