0

我有以下 JSON 输入:

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

我想根据变量 {{ target }} 获取链接字符串(“google.com”...) {{ 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

4

1 回答 1

0

你的表达有几个问题:

  1. 在 jmespath 中,标识符用双引号引起来。单引号用于字符串。请参阅jmespath 规范
  2. 您传递给的整个 jmespath 表达式json_query应该是一个 yaml/jinja2 字符串。如您所写,.link将被解释为 jinja2/yaml var 标识符。
  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
于 2020-01-09T15:15:18.703 回答