如何用单行Jinja表达式将Ansible test1格式字典转为指定角色组映射
可以通过单行Jinja表达式实现,你原来的表达式不符合预期是因为test1里的value存在列表类型,直接join会把整个列表当字符串拼接,没有展开处理。
解决方案
将如下表达式写入你的playbook即可:
- name: 生成符合要求的角色组映射字符串 debug: msg: "{{ test1 | dict2items | map('json_query', '{role: key, groups: value}') | map('combine', {'groups': [].__class__(groups)}) | subelements('groups') | map('reverse') | map('join', ': ') | join(', ') }}"
执行后输出结果即为目标格式:groupA: role1, groupB: role2, groupC: role2, groupD: role3
逻辑说明
dict2items:将test1字典转换为包含key(角色名)、value(对应组)的列表结构- 后续
map操作:将所有组统一转为列表格式,避免单个字符串类型的组无法遍历展开 subelements:将每个角色对应的组列表展开,生成「角色+对应单个组」的配对- 反转配对顺序后逐对用
:拼接,最后整体用,拼接为目标字符串
无额外依赖兼容写法
如果你的环境没有安装jmespath依赖(json_query需要用到),可以用下面这个原生支持的写法:
{{ test1 | dict2items | map('items') | map('flatten') | map('zip', ['role', 'groups']) | map('list') | map('from_list') | map('combine', {'groups': [groups] if groups is string else groups}) | subelements('groups') | map('reverse') | map('join', ': ') | join(', ') }}
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

