使用包含破折号的键提取 JSON 值并通过 ansible 变量提供

问题描述 投票:0回答:1

我正在尝试从

ansible
中的 json 检索值,其中键包含破折号并通过变量提供。


我在

ansible
中有以下数据:

- set_fact:
    data: >-
      {
        "profile-id": 1234, "user_id": 6789
      }

众所周知要检索profile-id

,必须
引用密钥,例如:

- set_fact: value: >- {{ data | json_query("profile-id") }}
如果 

profile-id

 已注册在变量中,我如何检索该值?例如:
和以下变量:

- set_fact: lookup_key: profile-id
我尝试了不同的方法,但没有一个有效:

  • json_query("lookup_key")
     不能替代查找键
  • json_query(\"lookup_key\")
     尝试查找 
    "profile-id"
     而不是 
    profile-id
    ,未返回任何结果。
  • json_query(lookup_key | regex_replace('[-]', '\\-'))
    返回错误:
    Unknown token \\
我该如何处理?

ansible jmespath json-query
1个回答
0
投票
请注意,您的变量

data

确实包含JSON的
字符串表示,而不是JSON。

由于 Ansible 具有很强的 JSON 能力,并且 YAML 是 JSON 的超集,因此您的

data

 事实可以受益于以 JSON 或 YAML 表示:

# expressed as a JSON: data: { "profile-id": 1234, "user_id": 6789 } # or expressed as a YAML: data: profile-id: 1234 user_id: 6789
这将使您访问它的任务变得微不足道:

- set_fact: value: "{{ data['profile-id'] }}"
这会导致

ok: [localhost] => changed=false ansible_facts: value: '1234'

注意:上面的输出是使用选项 -v

 运行 playbook 时生成的,其中除其他有用信息外,还显示了 
set_fact
 任务的结果。


现在,如果您确实从另一个任务或 API 查询接收到 JSON 的字符串表示形式,那么您可以使用

from_json

 过滤器将该字符串解析为真正的 JSON,其中

- set_fact: value: >- {{ ( data | from_json)['profile-id'] }} vars: data: >- { "profile-id": 1234, "user_id": 6789 }
还会导致 

value

 设置为 
1234

    

© www.soinside.com 2019 - 2024. All rights reserved.