Ansible如何解析循环注册的变量 提取Harbor接口返回的Docker镜像标签
提取方法说明
循环注册的images变量顶层的results字段存储了所有循环请求的返回结果,每个子元素对应一次repo_list的遍历执行结果,包含两个核心字段:
item:当前循环的仓库名(即你需要的myimage/myotherimage)json:当前仓库的接口返回内容,包含镜像的tags数组
方案1:输出按仓库分组的标签列表(推荐)
直接使用json_query一步生成结构化数据,结构为[{仓库名: [标签1, 标签2...]}, ...],方便后续按仓库维度处理:
- name: 按仓库分组提取所有镜像标签 set_fact: repo_image_tags: "{{ images.results | json_query('[].{repo: item, tags: json[].tags[].name}') }}"
执行后输出示例:
[ { "repo": "myimage", "tags": ["MYTAG_ELASTICSEARCH", "v2.1.0"] }, { "repo": "myotherimage", "tags": ["v1.0.0", "latest"] } ]
提示:如果执行
json_query时报错,需要先在Ansible控制节点安装依赖:pip install jmespath
方案2:输出平铺的完整镜像路径列表
如果需要直接用于后续的docker pull操作,可以直接生成仓库:标签格式的平铺列表:
- name: 生成平铺的完整镜像列表 set_fact: all_image_paths: >- {{ all_image_paths | default([]) + [item.0.item ~ ':' ~ item.1] }} loop: "{{ images.results | subelements('json[].tags[].name', skip_missing=True) }}" loop_control: label: "{{ item.0.item }}"
执行后输出示例:
["myimage:MYTAG_ELASTICSEARCH", "myimage:v2.1.0", "myotherimage:v1.0.0", "myotherimage:latest"]
注意事项
- 对于没有任何镜像或标签的空仓库,通过
skip_missing=True参数可以自动跳过,避免任务执行报错 - 如果需要生成完整的Harbor拉取地址,只需要在路径前拼接Harbor域名和项目名即可:
{{ harbor_url }}/{{ harbor_project }}/{{ 镜像路径 }}
内容的提问来源于stack exchange,提问作者diggnsaegg
相关产品推荐
相关产品推荐

