首先,我知道这是一个重复的问题:我在这里找到了类似的话题: Searching for key in a list of dicts in Ansible,Ansible lookup values from complex structure?
我不知道我是否必须直接在这些主题中问我的问题,如果是的话,我真诚的道歉。
无论如何,在Ansible中,我需要从Web应用程序中提取API查询中的特定ID。 我有此代码:
- name: API query
uri:
method: GET
url: "{{ apiquery }}"
headers:
Content-Type: application/json
App-Token: "{{ appToken }}"
Session-Token: "{{ currentSessionToken.json.session_token }}"
register: wantedState
- name: DEBUG | wantedState output
debug:
msg: "{{ wantedState }}"
消息是这样的:
ok: [localhost] => {
"msg": {
"accept_range": "State 1000",
"access_control_expose_headers": "content-type, content-range, accept-range",
"cache_control": "no-store, no-cache, must-revalidate",
"changed": false,
"connection": "close",
"content_length": "138",
"content_range": "0-1/2",
"content_type": "application/json; charset=UTF-8",
"cookies": {},
"cookies_string": "",
"date": "Thu, 24 Jan 2019 11:51:42 GMT",
"expires": "Mon, 26 Jul 1997 05:00:00 GMT",
"failed": false,
"json": {
"content-range": "0-1/2",
"count": 2,
"data": [
{
"1": "state1",
"2": 12
},
{
"1": "state11",
"2": 10
}
],
"order": "ASC",
"sort": 1,
"totalcount": 2
},
"msg": "OK (138 bytes)",
"pragma": "no-cache",
"redirected": false,
"server": "Apache/2.4.18 (Ubuntu)",
"status": 200,
"url": "..."
}
}
我需要获取与stateName变量关联的正确ID。
我遵循了另外两个主题中的建议,我的语法是:
- name: DEBUG | Displaying ID
debug:
msg: "{{ (wantedState.json.data | selectattr('1', 'equalto', stateName) | list | first).2 }}"
我收到以下错误消息:
"msg": "The task includes an option with an undefined variable. The error was: dict object has no element 1"
我不知道为什么我的查询无法正常运行,以致于……
预先感谢
西蒙(Simon)
答案 0 :(得分:0)
Jinja2将类似整数的字符串转换为数字。
因此,'1'
和'2'
用于引用列表的第一和第二个元素。
我不知道有什么方法可以在Jinja2中禁用此行为。
您通常使用正确的语法。如果您的数据项具有键a
和b
而不是1
和2
,那么就可以了。
对于您的情况,可以使用JMESPath过滤项目:
- name: DEBUG | Displaying ID
debug:
msg: "{{ (wantedState.json.data | json_query('[?\"1\"==`'+stateName+'`]') | first)['2'] }}"
请注意:
1
周围的msg: "..."
中['2']
(字符串)而不是.2
(int)访问结果值