如何解决通过将 dict2items 和 JMESPath 与 ansible 结合,从复杂的 json 查询键
我希望根据查询结果返回值,到目前为止我没有得到想要的结果。 json 看起来像这样并且来自 ansible var
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandBox')
chrome_options.add_argument('--disable-dev-shm-usage')
wd = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
wd.get("https://waterauthority.com.fj/en/mybill/")
meter_id = wd.find_element_by_id("colour")
meter_id.send_keys('123')
wd.find_element_by_name("colour").send_keys(Keys.RETURN)
delay = 10
try:
myElem = webdriverwait(wd,delay).until(EC.visibility_of_element_located((By.ID,'formstatus')))
print(myElem)
except TimeoutException:
print ("No work")
到目前为止我已经尝试使用 dict2items 但没有成功。目前,我得到的是一个空列表。
no work
基本上,这个任务应该设置 my_var ==> node1 因为它是管理员。非常感谢任何帮助。
解决方法
为此您不需要 json_query
。它可以工作,但我强烈建议您仅在默认核心 ansible 过滤器根本无法完成工作时才使用它。
此外,您的 jmespath
表达式(我没有测试验证)将返回匹配参数的元素的完整列表,而不仅仅是节点名称。
简而言之(注意:更新以便即使某些元素在 more
键内不包含 state
属性也能工作)
- set_fact:
my_var: >-
{{
nodes
| dict2items
| selectattr('value.state.more','defined')
| selectattr('value.state.more.type','==','admin')
| map(attribute='key')
| first
}}
换句话说:
- 将 dict 转换为列表或
key
/value
对 - 仅选择定义了
value.state.more
的元素 - 仅选择
"admin"
参数中具有value.state.more.type
的元素 - 仅为每个元素提取
key
参数 - 获取列表中的第一个元素
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。