如何在Ansible中将循环生成的多变量结果存入指定格式列表?
解决方法
你可以通过每次循环生成单个字典,再将其追加到目标列表的方式实现需求,避免combine过滤器导致的键名覆盖问题。具体实现如下:
- 先初始化一个空列表用于存储结果
- 在循环中为每个
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
相关产品推荐
相关产品推荐

