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
相关产品推荐
相关产品推荐

