微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 jmespath 将复杂数据结构中的多个数组连接起来

如何解决使用 jmespath 将复杂数据结构中的多个数组连接起来

我正在尝试将在复杂数据结构中描述的 NFS 导出 转换为 nfs-server 守护进程接受的配置选项,然后在 ansible 中使用。 >

我有

    nfs_exports:
    - path: /export/home
      state: present
      options:
      - clients: "192.168.0.0/24"
        permissions:
        - "rw"
        - "sync"
        - "no_root_squash"
        - "fsid=0"
    - path: /export/public
      state: present
      options:
      - clients: "192.168.0.0/24"
        permissions:
        - "rw"
        - "sync"
        - "root_squash"
        - "fsid=0"
      - clients: "*"
        permissions:
        - "ro"
        - "async"
        - "all_squash"
        - "fsid=1"

必须变成:

        [
            {
                "options": "192.168.0.0/24(rw,sync,no_root_squash,fsid=0)","path": "/export/home","state": "present"
            },{
                "options": "192.168.0.0/24(rw,root_squash,fsid=0) *(ro,async,all_squash,fsid=1)","path": "/export/public","state": "present"
            }
        ]

到目前为止,我可以使用 {{ nfs_exports | json_query(query) }}

query: "[].{path:path,state:state,options:options.join(` `,[].join(``,[clients,`(`,join(`,`,permissions),`)`]))}"

得到

{
        "options": "192.168.0.0/24(rw,"state": "present"
},{
        "options": "192.168.0.0/24(rw,fsid=0)*(ro,"state": "present"
}

这可能很简单,但我无法通过最后一个选项加入,空格 ' '删除。 因此,如果有人知道正确的查询,我们将不胜感激。

解决方法

给定查询:

[].{ path: path,state: state,options: join(' ',options[].join('',[clients,'(',join(',',permissions),')'])) }

关于 JSON

{
  "nfs_exports": [
    {
      "path": "/export/home","state": "present","options": [
        {
          "clients": "192.168.0.0/24","permissions": [
            "rw","sync","no_root_squash","fsid=0"
          ]
        }
      ]
    },{
      "path": "/export/public","root_squash","fsid=0"
          ]
        },{
          "clients": "*","permissions": [
            "ro","async","all_squash","fsid=1"
          ]
        }
      ]
    }
  ]
}

它会给你你预期的输出:

[
  {
    "path": "/export/home","options": "192.168.0.0/24(rw,sync,no_root_squash,fsid=0)"
  },{
    "path": "/export/public",root_squash,fsid=0) *(ro,async,all_squash,fsid=1)"
  }
]

请注意:字符串文字 `` 不适用于空格字符串,因为如文档中所述,它将被解析为 JSON:

文字表达式是允许指定任意 JSON 对象的表达式

来源:https://jmespath.org/specification.html#literal-expressions


当您达到以下目的时,这很容易:

[].{ path: path,options: options[].join('',')']) }

你似乎已经实现了,这给了

[
  {
    "path": "/export/home","options": [
      "192.168.0.0/24(rw,fsid=0)"
    ]
  },fsid=0)","*(ro,fsid=1)"
    ]
  }
]

因为您只需要将 options 中的整个数组与一个空格作为粘合字符连接起来。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。