ansible json_query Как определить значение по умолчанию для отсутствующего ключа

У меня есть некоторые переменные:

  vars:
    foo:
      - {name: "bar", path: "/tmp"}
      - {name: "zob" }
    default: "/home"

Я хотел бы сделать json_query, который извлекает имя и путь, а когда путь не определен, принимает значение по умолчанию.

Результат, который я хотел бы, это

  - {name: "bar", path: "/tmp"}
  - {name: "zob", path: "/home"}

Есть ли возможность в json_query определить значение по умолчанию, когда ключ не определен?

Спасибо, Рауль


person Raoul Debaze    schedule 26.06.2020    source источник
comment
Вместо того, чтобы определять значение по умолчанию в части переменных, вы можете использовать определение в части кода, используя значения по умолчанию. но зависит от варианта использования, который здесь не объясняется полностью. Если вам нужен конкретный ответ, отредактируйте вопрос и предоставьте дополнительную информацию. Лучший   -  person Baptiste Mille-Mathias    schedule 26.06.2020


Ответы (1)


Следующее объединит все элементы вашего списка с хэш-картой по умолчанию, перекрывающей существующие значения, если они переопределены с помощью функции merge jmespath. . Это работает для path в примере, но при необходимости вы можете добавить больше сопоставлений.

---
- hosts: localhost
  gather_facts: false

  vars:
    foo:
      - {name: "bar", path: "/tmp"}
      - {name: "zob" }
    foo_defaults:
      path: "/home"

  tasks:
    - debug:
        msg: "{{ foo | json_query(query) }}"
      vars:
        query: >-
          [].merge(`{{ foo_defaults | to_json }}`, @)

Который дает

PLAY [localhost] ***********************************************************************************************************************************************************************************************************************

TASK [debug] ***************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "name": "bar",
            "path": "/tmp"
        },
        {
            "name": "zob",
            "path": "/home"
        }
    ]
}

PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
person Zeitounator    schedule 26.06.2020