微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过将 dict2items 和 JMESPath 与 ansible 结合,从复杂的 json 查询键

如何解决通过将 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
      }}

换句话说:

  1. 将 dict 转换为列表或 key/value
  2. 仅选择定义了 value.state.more 的元素
  3. 仅选择 "admin" 参数中具有 value.state.more.type 的元素
  4. 仅为每个元素提取 key 参数
  5. 获取列表中的第一个元素

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。