使用Ansibles uri模块从非平凡JSON解析值

时间:2019-01-09 08:03:24

标签: ansible uri

我有这个(在显示的示例中,我通过删除许多行来减少了它)从Spark服务器检索的非平凡JSON:

{
  "spark.worker.cleanup.enabled": true,
  "spark.worker.ui.retainedDrivers": 50,
  "spark.worker.cleanup.appDataTtl": 7200,
  "fusion.spark.worker.webui.port": 8082,
  "fusion.spark.worker.memory": "4g",
  "fusion.spark.worker.port": 8769,
  "spark.worker.timeout": 30
}

我尝试阅读fusion.spark.worker.memory,但没有这样做。在我的调试语句中,我可以看到其中的信息:

msg: "Spark memory: {{spark_worker_cfg.json}}显示如下:

ok: [process1] => {
    "msg": "Spark memory: {u'spark.worker.ui.retainedDrivers': 50, u'spark.worker.cleanup.enabled': True, u'fusion.spark.worker.port': 8769, u'spark.worker.cleanup.appDataTtl': 7200, u'spark.worker.timeout': 30, u'fusion.spark.worker.memory': u'4g', u'fusion.spark.worker.webui.port': 8082}"
}

使用var: spark_worker_cfg进行的转储显示以下内容:

ok: [process1] => {
    "spark_worker_cfg": {
        "changed": false,
        "connection": "close",
        "content_length": "279",
        "content_type": "application/json",
        "cookies": {},
        "cookies_string": "",
        "failed": false,
        "fusion_request_id": "Pj2zeWThLw",
        "json": {
            "fusion.spark.worker.memory": "4g",
            "fusion.spark.worker.port": 8769,
            "fusion.spark.worker.webui.port": 8082,
            "spark.worker.cleanup.appDataTtl": 7200,
            "spark.worker.cleanup.enabled": true,
            "spark.worker.timeout": 30,
            "spark.worker.ui.retainedDrivers": 50
        },
        "msg": "OK (279 bytes)",
        "redirected": false,
        "server": "Jetty(9.4.12.v20180830)",
        "status": 200,
        "url": "http://localhost:8765/api/v1/configurations?prefix=spark.worker"
    }
}

我无法使用{{spark_worker_cfg.json.fusion.spark.worker.memory}}访问该值,我的问题似乎是由包含点的名称引起的:

  

任务包括带有未定义变量的选项。错误是:   'dict object'没有属性'fusion'

我看过两个SO帖子(12),它们看起来像是我的问题的重复副本,但无法从中得出如何解决当前问题的信息。

2 个答案:

答案 0 :(得分:2)

数据结构的“ json”元素中的键包含文字点,而不是表示结构。这将引起问题,因为如果使用点符号,Ansible将不知道将它们视为文字。因此,请使用方括号符号来引用它们,而不是用点划线:

- debug:
    msg: "{{ spark_worker_cfg['json']['fusion.spark.worker.memory'] }}"

(乍看之下,这似乎是一个需要解码的JSON编码字符串的问题,可以通过"{{ spark_worker_cfg.json | from_json }}"处理)

答案 1 :(得分:1)

您可以使用json_query过滤器获取结果。 https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

JACK = 1_1_1_1_1_1_1

编辑: 根据您的评论,我们返回了一个空字符串,这使我相信查询不正确。在使用json_query过滤器时找到确切的查询可能会令人沮丧,因此我通常通常事先使用jsonpath工具。我已经在下面的评论中链接了一个,但是我个人使用intelliJ中的jsonUtils插件来找到我的路径(由于两个路径之间的处理方式有所不同,因此仍需要进行调整)。

如果您的json看起来像这样:

msg="{{ spark_worker_cfg.json | json_query('fusion.spark.worker.memory') }}

然后

{
  value: "theValue"
}

会工作。

您传递给json_query的路径与您尝试执行的操作不正确。

如果您的顶级对象被命名为fusion_spark_worker_memory(不包含句点),那么您的查询应该可以使用。我相信,点点滴滴的东西。可能有一种方法可以逃避查询中的内容...

编辑2:赢得胜利的Clockworknet!他两次都击败了我。 :弓:

相关问题