【问题标题】:How to use advance Ansible playbook conditionals to parse json?如何使用高级 Ansible 剧本条件来解析 json?
【发布时间】:2015-08-27 23:03:31
【问题描述】:

我正在尝试创建一个剧本,它使用 uri 模块在 ElasticSearch 中创建新的观察者任务。但是,当我不断遇到错误时,检查寄存器有效负载的条件似乎有问题; "评估条件时出错:payload.contents.find("true") != -1"

从 uri 模块评估返回的 json 的正确方法是什么?

Related files on gist

(顺便说一句,我正在通过 vagrant 运行此 playbook 进行配置,因此通过转储变量 playbook 进行调试几乎是不可能的,并且 playbook 在注册之前就死了。)

【问题讨论】:

  • 您是否尝试过使用debug 模块查看您的payload 变量的内容?也请直接在问题中发布您的代码的相关部分。如果那个要点消失了,那么这个问题在没有上下文的情况下将毫无用处。
  • @Mxx 是的!并且剧本在到达该规则集之前就下降了。 (顺便说一句,我从不删除要点,但如果需要,我可以在问题中发布代码。只是没有在此处发布它们,因此问题不会被标记为审查)
  • 进一步挖掘将显示 cluster_health_watch_body 作为字典传递给 uri() 模块的 body 参数。然而,添加 jinja 过滤器to_json 完全破坏了剧本。欢迎任何帮助找出造成这种情况的原因?

标签: jinja2 ansible ansible-playbook


【解决方案1】:

怎么样:

changed_when: (payload.content | from_json).created | bool

【讨论】:

  • @Matt_Davis 我在您的回答中看到了逻辑,但是出现了两件事; 1)这不起作用,因为我遇到了一个意外的类型错误,因为 ansible/jinja 是预期的字符串或缓冲区类型。 2) 也进入测试的是为created 返回的值为“True”,即var created = String("True") 布尔值true/false。两者是否相关在这一点上超出了我的范围。为什么模板会失败?
  • 无法访问您的实际 URL 端点以进行测试,我不确定它为什么会失败...我建议您将 changed_when 注释掉并尝试构建模板表达式随后的调试语句尝试找出问题所在。的原因|最后的 bool 是为了说明“created”的内容可以是带引号的字符串“true/false”而不是裸布尔。
  • 归结为编译后的模板作为 python 字典而不是字符串传递给 uri(body)。它仍然会发布模板,但之后它不会解析任何返回的 json。
  • 是的,这样就行了... to_json 似乎无关/错误,因为模板的输出应该已经是字符串化的 JSON(to_json 用于将 dicts 转换为 json 字符串)。
【解决方案2】:

看起来因为我使用的是EPEL build,所以问题与Ansible Pull Request #1011 有关,因为设置为 json 的 body_type 没有正确地将变量识别为字符串值,因为 body 被传递给 uri 作为代替字典。

解决这个问题的方法是使用 lookup('template', '...') 而不是变量

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 2021-10-31
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多