【问题标题】:join multiple arrays in complex data structure with jmespath使用 jmespath 连接复杂数据结构中的多个数组
【发布时间】:2021-04-14 18:32:06
【问题描述】:

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

我有:

    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,sync,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,sync,no_root_squash,fsid=0)",
        "path": "/export/home",
        "state": "present"
},
{
        "options": "192.168.0.0/24(rw,sync,root_squash,fsid=0)*(ro,async,all_squash,fsid=1)",
        "path": "/export/public",
        "state": "present"
}

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

【问题讨论】:

    标签: ansible jinja2 jmespath


    【解决方案1】:

    给定查询:

    [].{ 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",
          "state": "present",
          "options": [
            {
              "clients": "192.168.0.0/24",
              "permissions": [
                "rw",
                "sync",
                "root_squash",
                "fsid=0"
              ]
            },
            {
              "clients": "*",
              "permissions": [
                "ro",
                "async",
                "all_squash",
                "fsid=1"
              ]
            }
          ]
        }
      ]
    }
    

    它会给你预期的输出:

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

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

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

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


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

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

    这是你似乎已经实现的目标

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

    因为您只剩下在options 中加入整个数组,并用空格作为粘合字符。

    【讨论】:

    • 谢谢。不知何故,我错过了由 jmespath 解释的事实。最后,我将选项保留为数组并将它们加入到剧本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多