使用json_qry从由gentent模块的ansible寄存器创建的复杂json对象中过滤出文本

时间:2019-06-19 16:53:18

标签: ansible jinja2 jmespath

特别是我要在清单中的服务器上给任务分配的列表中缺少帐户ID的“字符串”。

我在任务中运行getent模块,并将结果似乎是一个复杂的JSON对象,并将我想要的数据注册为一个名为“ item”的ket,并埋入了称为“ results”的对象数组中“结果”的对象。

我正在尝试为“失败”的任何键(其值为true)解析“结果”对象,并为“项目”(即帐户ID)提取该对象的键值。

我需要夸耀才能超越我的缺乏理解。

谢谢!

我没有尝试过。我不确定这是我的语法还是缺乏对如何解析或“解释”存储在“结果”中的JSON对象的了解

我认为我对qry变量的语法要求结果中的任何数组元素(对象数组)中具有键“ failed”且值为true的键,如果找到匹配项,则返回其值“项目”键。我知道它是否会返回列表。我需要的是一个字符串,但是除了空列表[]外,我没有得到任何结果。

我尝试了许多变体,但是结果总是空白。

 qry: "result.results[?failed == true].item"
 qry: "results[?failed == true].item"
 qry: "[?failed == true].item"

这是Ansible“ debug:var = result”

返回的JSON对象
TASK [debug] *******************************************************************
ok: [x.y.z.abc.com] => {
    "result": {
        "changed": false,
        "failed": true,
        "msg": "All items completed",
        "results": [
            {
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": false,
                "failed": true,
                "invocation": {
                    "module_args": {
                        "database": "passwd",
                        "fail_key": true,
                        "key": "abc123",
                        "split": null
                    }
                },
                "item": "abc123",
                "msg": "One or more supplied key could not be found in the database."
            },
            {
                "_ansible_item_result": true,
                "_ansible_no_log": false,
                "_ansible_parsed": true,
                "changed": false,
                "failed": true,
                "invocation": {
                    "module_args": {
                        "database": "passwd",
                        "fail_key": true,
                        "key": "pubsub",
                        "split": null
                    }
                },
                "item": "pubsub",
                "msg": "One or more supplied key could not be found in the database."
            }
        ]
    }
}

这是代码的剧本部分:

- name: "Account checks"
    ignore_errors: True
    with_items:
        - abc123
        - pubsub
    getent: database=passwd key={{ item }}
    register: result
  - debug: var=result
  - debug: msg="Account id is {{ result | json_query(qry) }} "
    vars:
        qry: "result.results[?failed == true].item"

这是我的json_qry调用的输出:

TASK [debug] *******************************************************************
ok: [xyz.abc.com] => {}

MSG:

Account id is

我想要的是这样的

“帐户ID为abc123,pubsub”

1 个答案:

答案 0 :(得分:0)

result是要传递给json_query的顶级构造,因此在开始处理数据时它不作为顶级元素存在。此外,检查字段而不进行比较将确保该字段存在并且其值不为假。

因此,获取您的信息的正确查询是:results[?failed].item

您已经猜到了,这将返回所有失败结果的item字符串列表。您只需要遍历该列表即可获取各个值。

在示例剧本下面。我将示例数据中的一个failed值更改为false进行说明。

---
- name: Parse result list with json_query
  hosts: localhost
  gather_facts: false

  vars:
    "result": {
      "changed": false,
      "failed": true,
      "msg": "All items completed",
      "results": [
      {
        "_ansible_item_result": true,
        "_ansible_no_log": false,
        "_ansible_parsed": true,
        "changed": false,
        "failed": true,
        "invocation": {
          "module_args": {
            "database": "passwd",
            "fail_key": true,
            "key": "abc123",
            "split": null
          }
        },
        "item": "abc123",
        "msg": "One or more supplied key could not be found in the database."
      },
      {
        "_ansible_item_result": true,
        "_ansible_no_log": false,
        "_ansible_parsed": true,
        "changed": false,
        "failed": false,
        "invocation": {
          "module_args": {
            "database": "passwd",
            "fail_key": true,
            "key": "pubsub",
            "split": null
          }
        },
        "item": "pubsub",
        "msg": "One or more supplied key could not be found in the database."
      }
      ]
    }

  tasks:

    - name: Get item value of failed results
      vars:
        query: results[?failed].item
      debug:
        msg: "The user id is {{ item }}"
      loop: "{{ result | json_query(query) }}"

给出:

PLAY [Parse result list with json_query] PLAY RECAP **********************************

TASK [Get item value of failed results] PLAY RECAP ***********************************
ok: [localhost] => (item=abc123) => {
    "msg": "The user id is abc123"
}


PLAY RECAP ***********************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0