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

如何在Ansible中处理字典列表?部署后检查场景实现需求

在Ansible中实现静态与动态数据结合的方案

完全可行,以下是对应你需求的Playbook实现:

完整Playbook示例

---
- name: 部署后检查:合并静态与动态数据并调用uri模块
  hosts: your_target_hosts
  vars:
    # 硬编码的静态应用列表,对应Python中的ports变量
    apps:
      - name: "app 1"
        port: 1111
      - name: "app 2"
        port: 2222
      - name: "app 3"
        port: 3333

  tasks:
    - name: 为每个应用获取运行时metadata
      ansible.builtin.shell: "./get_metadata {{ item.name }}"
      loop: "{{ apps }}"
      register: metadata_results
      # 若get_metadata输出为JSON,可后续用stdout_json解析

    - name: 合并静态数据与动态metadata生成新列表
      ansible.builtin.set_fact:
        apps_with_metadata: >
          {{ metadata_results.results | map(lambda res: res.item | combine({'metadata': res.stdout})) | list }}

    - name: 调用uri模块处理每个应用(含静态+动态数据)
      ansible.builtin.uri:
        # 示例:使用静态port和动态metadata构造请求
        url: "http://localhost:{{ item.port }}/check?metadata={{ item.metadata | urlencode }}"
        method: GET
        status_code: 200
      loop: "{{ apps_with_metadata }}"
      register: uri_check_results

关键逻辑说明

  1. 静态变量定义:在vars块中硬编码应用列表,对应你Python代码里的ports列表。
  2. 收集动态数据:通过loop遍历静态列表,执行shell命令获取每个应用的metadata,结果注册到metadata_results中。每个结果项包含原静态字典(res.item)和命令输出(res.stdout)。
  3. 合并数据:使用map和combine过滤器,将原静态字典与动态获取的metadata字段合并,生成包含完整数据的新列表apps_with_metadata。
  4. 执行uri调用:遍历新列表,在uri模块中直接使用静态字段(如item.port)和动态字段(如item.metadata)完成请求。

注意事项

  • 若get_metadata的输出是JSON格式,可将res.stdout替换为res.stdout_json直接解析为字典。
  • 若需要对metadata做额外处理(如字符串截取、格式转换),可在combine前添加对应的过滤器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:20:32