Разбор значения из нетривиального JSON с помощью модуля Ansibles uri - PullRequest
0 голосов
/ 09 января 2019

У меня есть (в показанном примере я уменьшил его, удалив много строк) нетривиальный JSON, полученный с сервера Spark:

{
  "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 объект' не имеет атрибута 'fusion'

Я просмотрел два сообщения SO ( 1 и 2 ), которые выглядят как дубликаты моего вопроса, но не могут извлечь из них информацию о том, как решить мою текущую проблему.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Вы можете использовать фильтр json_query для получения ваших результатов. https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html

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

редактировать: В ответ на ваш комментарий тот факт, что мы получили пустую строку, заставляет меня поверить, что запрос неверен. Может быть сложно найти точный запрос при использовании фильтра json_query, поэтому я обычно заранее использую инструмент jsonpath. Я связал один в своем комментарии ниже, но лично я использую аддон jsonUtils в intelliJ, чтобы найти мой путь (который все еще нуждается в корректировке, потому что пути обрабатываются немного по-разному между этими двумя).

Если ваш JSON выглядел так:

{
  value: "theValue"
}

тогда

json_query('value')

будет работать.

Путь, который вы передаете json_query, не соответствует тому, что вы пытаетесь сделать.

Если ваш объект верхнего уровня был назван fusion_spark_worker_memory (без точек), тогда ваш запрос должен работать. Точки отбрасывают вещи, я верю. Там может быть способ избежать тех, кто в запросе ...

редактировать 2: заводной механизм для победы! Он бил меня в это оба раза. : bow:

0 голосов
/ 09 января 2019

Ключи в элементе 'json' структуры данных содержат буквенные точки, а не представляют структуру. Это вызовет проблемы, потому что Ansible не будет знать, рассматривать их как буквальные, если используется точечная нотация. Поэтому для обозначения используйте квадратную скобку, а не пунктир:

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

(На первый взгляд это выглядело как проблема со строкой в ​​кодировке JSON, требующей декодирования, которую можно было бы обработать: "{{ spark_worker_cfg.json | from_json }}")

...