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

如何用单行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

逻辑说明

  1. dict2items:将test1字典转换为包含key(角色名)、value(对应组)的列表结构
  2. 后续map操作:将所有组统一转为列表格式,避免单个字符串类型的组无法遍历展开
  3. subelements:将每个角色对应的组列表展开,生成「角色+对应单个组」的配对
  4. 反转配对顺序后逐对用: 拼接,最后整体用, 拼接为目标字符串

无额外依赖兼容写法

如果你的环境没有安装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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:27:00