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

如何在Ansible中将普通列表转换为对象列表?

问题描述

现有Ansible变量列表:

users:
  - readonly
  - write

需要将其转换为包含固定database字段的字典列表:

userDict:
  - {'username': readonly, 'database': admin}
  - {'username': write, 'database': admin}

已知可以通过Jinja循环实现:

userDict: |
  {% set ret = [] %}
  {% for item in users %}
  {%   set _ = ret.append({'username': item, 'database': 'admin'}) %}
  {% endfor %}
  {{ ret }}

希望找到更简洁的filter链式调用方案,替代上述循环写法。

简洁Filter实现方案

可以通过map与combine filter的链式调用实现,推荐写法如下:

userDict: "{{ users | map('community.general.dict_kv', 'username') | map('combine', {'database': 'admin'}) | list }}"

各Filter作用说明

  • map('community.general.dict_kv', 'username'):把列表中每个字符串转为以username为键、字符串本身为值的字典,例如readonly会生成{'username': 'readonly'}
  • map('combine', {'database': 'admin'}):将每个字典与固定的{'database': 'admin'}合并,补充固定字段
  • list:将map返回的迭代器转换为标准列表类型

如果你的环境未安装community.general集合,也可以用Jinja正则表达式替代dict_kv:

userDict: "{{ users | map('regex_replace', '^(.*)$', '{\"username\": \"\\1\"}') | map('from_json') | map('combine', {'database': 'admin'}) | list }}"

前者写法更直观简洁,优先推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:37:03