我正在尝试从
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 \\
。
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
任务的结果。
from_json
过滤器将该字符串解析为真正的 JSON,其中
- set_fact:
value: >-
{{ ( data | from_json)['profile-id'] }}
vars:
data: >-
{ "profile-id": 1234, "user_id": 6789 }
还会导致 value
设置为
1234