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

