You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible如何对多节点命令输出进行合并去重排序

Ansible实现集群节点crictl镜像列表汇总方案

实现思路

完全基于Ansible原生能力+Jinja2模板语法实现,无需调用额外shell命令处理,核心逻辑分为三步:

  1. 集群所有节点执行crictl images采集本地镜像列表
  2. 控制端统一拉取所有节点的输出结果,在模板中完成表头过滤、列筛选、去重、排序操作
  3. 生成最终汇总文件

完整Playbook示例

---
- name: 集群容器镜像列表汇总
  hosts: kube_cluster
  gather_facts: no
  tasks:
    - name: 采集节点本地镜像列表
      ansible.builtin.command: crictl images
      register: cri_images
      changed_when: false
      # 若普通用户无crictl执行权限可取消下面注释
      # become: yes

    - name: 控制端生成汇总文件
      ansible.builtin.template:
        src: merged_images.j2
        dest: ./cluster_merged_images.txt
        mode: '0644'
      delegate_to: localhost
      run_once: true

Jinja2模板(merged_images.j2)

{# 自定义输出列索引,对应crictl images默认表头顺序:
0=REPOSITORY  1=TAG  2=IMAGE ID  3=CREATED  4=SIZE
按需修改下方数组即可调整输出列 #}
{% set output_columns = [0, 1, 2] %}

{% set all_image_entries = [] %}

{# 遍历所有集群节点的输出结果 #}
{% for node in ansible_play_hosts %}
  {% for line in hostvars[node]['cri_images']['stdout_lines'] %}
    {# 跳过表头行与空行 #}
    {% if loop.first or not line.strip() %}
      {% continue %}
    {% endif %}
    {# 按任意空白字符分割行,选取指定列拼接为条目 #}
    {% set cols = line.split() %}
    {% set entry = output_columns | map('extract', cols) | join(' ') %}
    {% do all_image_entries.append(entry) %}
  {% endfor %}
{% endfor %}

{# 去重+排序后输出 #}
{% for image in all_image_entries | unique | sort %}
{{ image }}
{% endfor %}

关键逻辑说明

  • 表头移除:通过loop.first判断当前行是否为输出的第一行(表头),直接跳过处理
  • 自定义列:仅需修改output_columns数组中的索引值即可调整输出内容,例如仅保留镜像名和标签可修改为[0, 1]
  • 去重:使用Jinja2原生unique过滤器完成列表条目去重
  • 排序:使用Jinja2原生sort过滤器完成字符串自然排序

内容的提问来源于stack exchange,提问作者Monger39

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:15:02