特别是我要在清单中的服务器上给任务分配的列表中缺少帐户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”
答案 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