我有这个(在显示的示例中,我通过删除许多行来减少了它)从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'
答案 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!他两次都击败了我。 :弓: