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

Ansible 2.7循环执行Docker Pull并提取存储镜像SHA值求助

实现方案

核心思路

基于postgresql_query获取的镜像列表,循环遍历每个镜像条目,依次执行docker pull拉取镜像,再通过指定命令提取镜像完整SHA值,最后将SHA值按需存储(示例包含变量存储、本地文件存储两种方式)。

完整Playbook示例

- name: 拉取镜像并提取SHA值
  hosts: your_target_hosts
  gather_facts: false
  vars:
    # 自行定义PostgreSQL连接参数,或通过inventory传递
    pg_host: "your_pg_host"
    pg_port: 5432
    pg_db: "your_db"
    pg_user: "your_user"
    pg_password: "your_password"
    # 存储所有镜像的SHA值(键为镜像地址+标签,值为SHA)
    image_sha_map: {}

  tasks:
    - name: 从PostgreSQL查询镜像信息
      postgresql_query:
        login_host: "{{ pg_host }}"
        login_port: "{{ pg_port }}"
        login_db: "{{ pg_db }}"
        login_user: "{{ pg_user }}"
        login_password: "{{ pg_password }}"
        query: "SELECT docker_image_url, docker_image_tag FROM your_image_table;"
      register: image_query_result

    - name: 循环处理每个镜像
      block:
        - name: 拉取Docker镜像
          command: "docker pull {{ item.docker_image_url }}:{{ item.docker_image_tag }}"
          register: pull_result
          changed_when: "'Downloaded newer image' in pull_result.stdout"

        - name: 提取镜像完整SHA值
          command: "docker images --no-trunc --quiet {{ item.docker_image_url }}:{{ item.docker_image_tag }}"
          register: image_sha_result

        - name: 将SHA值存入字典变量
          set_fact:
            image_sha_map: "{{ image_sha_map | combine({ '%s:%s' | format(item.docker_image_url, item.docker_image_tag): image_sha_result.stdout }) }}"

        - name: 将SHA值追加写入本地文件
          lineinfile:
            path: "/path/to/image_sha_records.txt"
            line: "{{ item.docker_image_url }}:{{ item.docker_image_tag }} -> {{ image_sha_result.stdout }}"
            create: true
      loop: "{{ image_query_result.rows }}"
      loop_control:
        label: "{{ item.docker_image_url }}:{{ item.docker_image_tag }}" # 简化循环日志输出

    - name: 打印所有镜像SHA值(可选,用于验证)
      debug:
        var: image_sha_map

关键细节说明

  • 循环控制:通过loop_control的label参数简化循环日志,避免冗长条目干扰查看。
  • 幂等性处理:针对docker pull命令,仅当输出包含Downloaded newer image时标记为“changed”,符合Ansible幂等性要求。
  • SHA值提取:docker images --no-trunc --quiet返回镜像完整长SHA值,直接通过stdout字段获取即可。
  • 存储方式:
    • 变量存储:用set_fact将SHA值存入字典,后续可用于更新数据库、生成配置等任务。
    • 文件存储:通过lineinfile模块将镜像地址与对应SHA追加写入文件,方便后续查阅。

可选扩展:将SHA值写回PostgreSQL

若需把提取的SHA值更新回原数据库表,可在循环内添加以下任务:

- name: 将SHA值更新回PostgreSQL
  postgresql_query:
    login_host: "{{ pg_host }}"
    login_port: "{{ pg_port }}"
    login_db: "{{ pg_db }}"
    login_user: "{{ pg_user }}"
    login_password: "{{ pg_password }}"
    query: "UPDATE your_image_table SET docker_image_sha = %s WHERE docker_image_url = %s AND docker_image_tag = %s;"
    args:
      - "{{ image_sha_result.stdout }}"
      - "{{ item.docker_image_url }}"
      - "{{ item.docker_image_tag }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 02:05:36