【问题标题】:query key from complex json by combining dict2items and JMESPath with ansible通过将 dict2items 和 JMESPath 与 ansible 相结合,从复杂的 json 中查询键
【发布时间】:2021-07-06 03:24:58
【问题描述】:

我正在寻找基于查询结果的返回值,到目前为止我没有得到想要的结果。 json 看起来像这样,来自 ansible var

{
  "header": {
    "nodes": {
        "node1": {
            "last_shutdown": "date",
            "level": {
                "kind_node": {}
            },
            "state": {
                "running": "true",
                "more": {
                    "type": "admin"
            }
        }
    },
        "node2": {
            "last_shutdown": "date",
            "level": {
                "kind_node": {}
            },
            "state": {
                "running": "true",
                "more": {
                    "type": "engine"
            }
        }
    },
        "node3": {
            "last_shutdown": "date",
            "level": {
                "kind_node": {}
            },
            "state": {
                "running": "true",
                "more": {
                    "type": "engine"
            }
        }
      }
    }
  }
}
  

到目前为止,我已经尝试使用 dict2items 但没有运气。目前,我得到一个空列表。

     set_fact:
       my_var: "{{ nodes | dict2items | json_query('[?value.state.more.type==`admin`]') }}"

基本上,这个任务应该设置 my_var ==> node1 因为它是管理员。非常感谢任何帮助。

【问题讨论】:

    标签: json ansible ansible-2.x jmespath


    【解决方案1】:

    您不需要json_query。它会起作用,但我强烈建议您仅在默认核心 ansible 过滤器根本无法完成这项工作时使用它。

    此外,您的 jmespath 表达式(我没有测试验证)将返回与参数匹配的元素的完整列表,而不仅仅是节点名称。

    简而言之(注意:更新后即使某些元素在 state 键中不包含 more 属性,它也能正常工作)

    - set_fact:
        my_var: >-
          {{
            nodes 
            | dict2items
            | selectattr('value.state.more', 'defined')
            | selectattr('value.state.more.type', '==', 'admin')
            | map(attribute='key')
            | first
          }}
    

    换句话说:

    1. 将 dict 转换为列表或 key/value
    2. 只选择定义了value.state.more的元素
    3. 仅选择在value.state.more.type 参数中具有"admin" 的元素
    4. 仅提取每个元素的 key 参数
    5. 获取列表中的第一个元素

    【讨论】:

    • 我收到以下错误,```"变量未定义!:'dict object' 没有属性 'more'"。顺便说一句,在你回复之前我已经更新了 json。
    • 如果元素树不包含more,则会遇到上述错误。否则提供的解决方案有效。
    • 这不是您描述的情况。您必须通过提供相关数据集来具体化。我更新了解决方案,以便它可以在这种情况下工作。
    • 正确,我错过了那个用例。我能够使用您更新的解决方案过滤更多并处理其他情况。感谢您对此的帮助。一切就绪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2016-06-09
    相关资源
    最近更新 更多