Ansible如何对多节点命令输出进行合并去重排序
Ansible实现集群节点crictl镜像列表汇总方案
实现思路
完全基于Ansible原生能力+Jinja2模板语法实现,无需调用额外shell命令处理,核心逻辑分为三步:
- 集群所有节点执行
crictl images采集本地镜像列表 - 控制端统一拉取所有节点的输出结果,在模板中完成表头过滤、列筛选、去重、排序操作
- 生成最终汇总文件
完整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
相关产品推荐
相关产品推荐

