JMESPath - 如何修剪树

时间:2017-12-05 18:07:30

标签: ansible

我有一个JSON数据结构(实际上是YAML)并希望重新格式化结构,但无法弄清楚如何使其正常工作。这将在Ansible的jinja2模板中使用。我试图使用的工具是json_query过滤器,它使用JMESPath。

输入:

"users": {
  "Administrators": [
    "user1",
    "user2": {
       "ssh_keys": "...."
    },
    "user3"
  ],
  "Users": [
     "user4"
  ]
}

我想将此JSON改为此(在此过程中剥离ssh_key部分)

"Administrators": [
  "user1",
  "user2",
  "user3"
],
"Users": [
  "user4"
]

我怎么能在jinja2中这样做?我发现json_query过滤器似乎是适合这项工作的工具,但还没有找到一个能够完成我要找的工作的查询。

1 个答案:

答案 0 :(得分:1)

首先,如果可以,我建议重新格式化json。 一个好的格式会使这非常容易,例如:

"users": {
  "Administrators": [
    {"name": "user1, "ssh_keys": None},
    {"name": "user2, "ssh_keys": "...."},
    {"name": "user3, "ssh_keys": None},
  ],
  "Users": [
     "user4"
  ]
}

如果你不能这样做,试试这个(这是指Administrators,但适用于任何事情):

 - set_fact:
      admins: "{{ (users | json_query(item) | default([])) | union(admins | default([])) }}"
   with_items:
      - "Administrators[?type(@) == 'object'][keys(@)][][]"
      - "Administrators[?type(@)=='string']"

这将创建一个admins数组,其中只包含来自用户json的用户名。 你可以设置另一个包含管理员和用户的事实