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

Ansible Playbook嵌套数组遍历错误:用户与对应Topic权限不匹配

问题描述

我在使用Ansible遍历JSON文件时遇到问题:当前代码会遍历所有用户的topicPermissions,而非每个用户对应的专属权限。理想状态是为每个用户生成其对应的Topic及权限配置,示例如下:

user: Larry
  - topic: TopicX
    Permission: read, describe

  - topic: TopicY
    Permission: write, describe 

接着处理Tommy的相关配置。

以下是我的Playbook代码:

- name: Create ACL for each user
  vars:
    my_json_data: "{{ lookup('file', 'test.json') }}"
  shell: "rpk acl create --allow-principal {{ item.0.id }} --operation {{ item.1.permissions }} --topic {{ item.1.topic }}"
  with_nested:
    - "{{ my_json_data.user }}"
    - "{{ my_json_data.user | json_query('[].topicPermissions[].{permissions: permissions, topic: topic}') }}"
  when: item.1.permissions is defined and item.1.topic is defined

我的JSON数据文件:

{
    "admin":[
       {
          "roleId": "placeholder",
          "secretPath": "placeholder",
          "vaultAddr": "placeholder",
          "brokers": "placeholder",
          "containerName": "placeholder"
       }
    ],
    "topicsToCreate":[
       "TopicX", "TopicY", "TopicZ"
    ],
    "user":[
       {
       "id":"Larry",
       "userpassword":"placeholder",
       "consumerGroupPermissions":[
          {
             "groupId":"Apple",
             "groupPermissions":"read,describe"
          }
       ],
       "topicPermissions":[
          {
             "topic":"TopicX",
             "permissions":"read,describe"
          },
          {
             "topic":"TopicY",
             "permissions":"write,describe"
          }
       ]
       },
       {
          "id":"Tommy",
          "userpassword":"placeholder",
          "consumerGroupPermissions":[
             {
                "groupId":"Apple",
                "groupPermissions":"read,write,describe"
             }
          ],
          "topicPermissions":[
             {
                "topic":"TopicZ",
                "permissions":"read,write,describe"
             },
             {
                "topic":"TopicY",
                "permissions":"write,describe"
             },
             {
                "topic":"TopicX",
                "permissions":"read,describe"
             }
          ]
      }
    ]
 }

请问我哪里出错了?


问题原因

你用with_nested的逻辑完全错误:这个插件会把第一个列表里的每个用户和第二个列表里的所有用户的topicPermissions做笛卡尔积,相当于每个用户都会绑定所有用户的权限,自然会出现遍历所有权限的问题。

第二个列表{{ my_json_data.user | json_query('[].topicPermissions[].{permissions: permissions, topic: topic}') }}已经把所有用户的topicPermissions提取出来合并成一个大列表,和用户本身完全失去了关联。

修正方案

改用subelements插件,它专门用来遍历嵌套列表——把每个用户(父元素)和其对应的topicPermissions(子元素)关联起来,不会混入其他用户的权限。

修正后的Playbook代码:

- name: Create ACL for each user
  vars:
    my_json_data: "{{ lookup('file', 'test.json') }}"
  shell: "rpk acl create --allow-principal {{ item.0.id }} --operation {{ item.1.permissions }} --topic {{ item.1.topic }}"
  with_subelements:
    - "{{ my_json_data.user }}"
    - topicPermissions
  when: item.1.permissions is defined and item.1.topic is defined

说明

  • with_subelements的第一个参数是父列表(这里是所有用户),第二个参数是每个父元素里要遍历的子列表键名(topicPermissions)。
  • 执行时,item.0会是当前用户对象(比如Larry或Tommy),item.1会是该用户下的单个topicPermissions条目,完美实现“每个用户对应自己的权限”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:35:35