Ansible json_query () с переменной в качестве ключа

У меня есть следующий ввод JSON:

{
  "a goo": {
      "link": "google.com"
  }, 
  "b ms": {
      "link": "microsoft.com"
  }, 
  "c amz": {
    "link": "amazon.com"
  }
}

Я хочу получить строку ссылки ("google.com"…) в соответствии с переменной {{target}}. Содержимое переменной {{target}} будет содержать одно из следующих значений: "a goo", "b ms", "c amz" " нить.

Что-то вроде:

- name:
  set_fact:
    target: "c amz"
- debug:
    msg: "{{ input.json | json_query('{{ target }}'.link) }}"

Что должно показать:

   msg: "amazon.com"

Спасибо за совет.

+FE


person Ferite    schedule 09.01.2020    source источник


Ответы (1)


Несколько проблем в вашем выражении:

  1. В jmespath идентификаторы заключаются в двойные кавычки. Для строк используются одинарные кавычки. См. спецификацию jmespath.
  2. Все выражение jmespath, которое вы передаете json_query, должно быть строкой yaml / jinja2. Как вы это написали, .link будет интерпретироваться как идентификатор var jinja2 / yaml.
  3. Вы не должны включать маркеры шаблона jinja2 ({{ X }}). Более того, в вашем текущем выражении '{{ target }}' буквально интерпретируется как строка, а не как переменная, которую нужно расширить до своего значения.

Следующая инструкция демонстрирует один из способов исправить текущий сценарий и выполнить ваши требования:

---
 - hosts: localhost
   gather_facts: false

   vars:
     input:
       json: { 
         "a goo": { 
           "link": "google.com"
         },
         "b ms": { 
           "link": "microsoft.com"
         },
         "c amz": { 
           "link": "amazon.com"
         } 
       } 

   tasks:
     - name: Debug the var we want to show
       vars:
         target: "c amz"
       debug:
         msg: "{{ input.json | json_query('\"' + target + '\".link') }}"

Который дает:

$ ansible-playbook play.yml 

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

TASK [Debug the var we want to show] *******************************************************************************************************************************************
ok: [localhost] => {
    "msg": "amazon.com"
}

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