Ansible json_query () с переменной в качестве ключа - PullRequest
0 голосов
/ 09 января 2020

У меня следующий 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

1 Ответ

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

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

  1. В jmespath идентификаторы заключаются в двойные кавычки. Одинарные кавычки используются для строк. См. спецификацию jmespath .
  2. Все выражение jmespath, которое вы передаете json_query, должно быть строкой yaml / jinja2. Как вы написали, .link будет интерпретироваться как идентификатор переменной 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
...