回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个Ansible输出,看起来像这样,但是在没有转义字符串的情况下很难将其解析为JSON</p>
<pre><code>{
"msg": [
"{",
"\t\"inprog\" : [",
"\t\t{",
"\t\t\t\"desc\" : \"conn174272\",",
"\t\t\t\"threadId\" : \"139899377280768\",",
"\t\t\t\"connectionId\" : 174272,",
"\t\t\t\"client\" : \"127.0.0.1:43365\",",
"\t\t\t\"active\" : true,",
"\t\t\t\"opid\" : 35571992,",
"\t\t\t\"secs_running\" : 0,",
"\t\t\t\"microsecs_running\" : NumberLong(16),",
"\t\t\t\"op\" : \"command\",",
"\t\t\t\"ns\" : \"admin.$cmd\",",
"\t\t\t\"query\" : {",
"\t\t\t\t\"currentOp\" : 1",
"\t\t\t},",
"\t\t\t\"numYields\" : 0,",
"\t\t\t\"locks\" : {",
"\t\t\t\t",
"\t\t\t},",
"\t\t\t\"waitingForLock\" : false,",
"\t\t\t\"lockStats\" : {",
"\t\t\t\t",
"\t\t\t}",
"\t\t}",
"\t],",
"\t\"ok\" : 1",
"}"
]
}
</code></pre>
<p>理想情况下,输出应类似于:</p>
<pre><code>{
"inprog": [
{
"desc": "conn5404",
"threadId": "139922277680896",
"connectionId": 5404,
"client": "127.0.0.1:50726",
"active": true,
"opid": 225819,
"secs_running": 0,
"microsecs_running": NumberLong(20),
"op": "command",
"ns": "admin.$cmd",
"query": {
"currentOp": 1
},
"numYields": 0,
"locks": {
},
"waitingForLock": false,
"lockStats": {
}
}]
}
</code></pre>
<p>我试过JMESPath和<a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#filters-for-formatting-data" rel="nofollow noreferrer">Ansible filters</a>但是运气不好。任何提示都会有帮助。最近的尝试是</p>
<pre><code>- name: get ops
shell:
cmd: mongo --eval "db.currentOp()"
register: currentOp
- debug:
msg: "{{ currentOp.stdout_lines[2:] | to_json }}"
</code></pre>
<p>这导致:</p>
<pre><code>{
"msg": "[\"{\", \"\\t\\\"inprog\\\" : [\", \"\\t\\t{\", \"\\t\\t\\t\\\"desc\\\" : \\\"conn174318\\\",\", \"\\t\\t\\t\\\"threadId\\\" : \\\"139899381491456\\\",\", \"\\t\\t\\t\\\"connectionId\\\" : 174318,\", \"\\t\\t\\t\\\"client\\\" : \\\"127.0.0.1:43374\\\",\", \"\\t\\t\\t\\\"active\\\" : true,\", \"\\t\\t\\t\\\"opid\\\" : 35579590,\", \"\\t\\t\\t\\\"secs_running\\\" : 0,\", \"\\t\\t\\t\\\"microsecs_running\\\" : NumberLong(15),\", \"\\t\\t\\t\\\"op\\\" : \\\"command\\\",\", \"\\t\\t\\t\\\"ns\\\" : \\\"admin.$cmd\\\",\", \"\\t\\t\\t\\\"query\\\" : {\", \"\\t\\t\\t\\t\\\"currentOp\\\" : 1\", \"\\t\\t\\t},\", \"\\t\\t\\t\\\"numYields\\\" : 0,\", \"\\t\\t\\t\\\"locks\\\" : {\", \"\\t\\t\\t\\t\", \"\\t\\t\\t},\", \"\\t\\t\\t\\\"waitingForLock\\\" : false,\", \"\\t\\t\\t\\\"lockStats\\\" : {\", \"\\t\\t\\t\\t\", \"\\t\\t\\t}\", \"\\t\\t}\", \"\\t],\", \"\\t\\\"ok\\\" : 1\", \"}\"]"
}
</code></pre>
<p>其思想是从输出创建一个新的json数组。例如,<code>[{"secs_running": 123, "opid": 1232342}]</code></p>