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

如何在Ansible中将循环生成的多变量结果存入指定格式列表?

解决方法

你可以通过每次循环生成单个字典,再将其追加到目标列表的方式实现需求,避免combine过滤器导致的键名覆盖问题。具体实现如下:

  1. 先初始化一个空列表用于存储结果
  2. 在循环中为每个item生成包含三个字段的字典,再将这个字典追加到列表末尾

修改后的Ansible任务示例:

- name: Initialize ping stats list
  set_fact:
    ping_stats: []

- name: Extract and collect ping data
  set_fact:
    ping_stats: "{{ ping_stats | default([]) + [
      {
        'packets_received': item | regex_search('(\\d*) packets received', '\\1') | first,
        'packet_loss': item | regex_search('(\\d*)% packet loss', '\\1') | first,
        'latency': item | regex_search('(\\d*\\.\\d*)\\/(\\d*\\.\\d*)\\/(\\d*\\.\\d*) ms', '\\1', '\\2', '\\3')
      }
    ] }}"
  loop: "{{ ping_output['results'] }}"

关键说明

  • 用default([])处理列表未初始化的场景,避免触发报错
  • 每次循环通过+运算符将新字典追加到ping_stats列表,而非覆盖原有内容
  • 替换[0]为| first更安全,能避免正则无匹配结果时出现索引越界问题(若需兼容无匹配场景,可额外添加default(''),比如item | regex_search(...) | first | default(''))

执行完成后,ping_stats变量会呈现你需要的格式:

[
  {"packets_received": "value1", "packet_loss": "value1", "latency": ["min1", "avg1", "max1"]},
  {"packets_received": "value2", "packet_loss": "value2", "latency": ["min2", "avg2", "max2"]}
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:12:20