我正在尝试从JSON数据中获取属性值。
这是我的JSON数据:
{
"user1": "{\n \"data\":[\n {\n \"secure\": [\n {\n \"key\": \"-----BEGIN KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----\"\n }\n ],\n \"owner\": \"shallake\",\n \"position\": \"gl\"\n }\n ]\n}"
}
最初,我有无效的JSON数据,因此我使用to_json
和from_json
将其转换为有效的JSON。上面的JSON数据是我得到的结果。
代码:
- set_fact:
user: "{{ lookup('file','filepath/myfile.json') | to_json }}"
- set_fact:
user1: "{{ user | from_json}}"
- set_fact:
user3: "{{ item }}"
with_items: "{{ user1['data'] | map(attribute='position') | list }}"
在第三个set_fact
中,我试图获取位置属性值。但是它显示了这样的错误:
字段'args'具有无效值,该值似乎包含未定义的变量。错误是:'item'未定义
“\”{\ n \\“data \\”:[\ n {\ n \\“secure \\”:[\ n {\ n \\“key \\”:\\“ - --- BEGINPRIVATE KEY ----- \ nMIIEowIBAAKCAQEAgOh + Afb0oQEnvHifHuzBwl + Tiu8LXoJXb / ii / eh \ ngYEP3 \ n ----- END PRIVATE KEY ----- \\“\ n} \ n],\ n \ \“owner \\”:\\“shalloke \\”,\ n \\“position \\”:\\“gl \\”\ n} \ n] \ n} \ n \ n \“”
那么如何使用Ansible循环从上面的JSON数据结果中获取位置值?
答案 0 :(得分:0)
请检查filepath/myfile.json
中的密钥是否跨越多行?我们需要在JSON中转义换行符。使用\n
替换换行符。
支持user1
是从JSON解析的地图。但是,filepath/myfile.json
中的JSON可能无效。所以在第二个set_fact
中,无法解析这个无效的JSON。因此,user1
只是一个字符串。它不包含条目data
。
{
"data":[
{
"secure": [
{
"key": "-----BEGIN KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----"
}
],
"owner": "shallake",
"position": "gl"
}
]
}
答案 1 :(得分:0)
在将JSON格式的文件导入Ansible字典时,您应该使用from_json
(非to_json
)过滤器,或者根本不使用过滤器。
我指出了下面的错误,但首先是一个有效的例子:
myfile.json
:
{
"data": [
{
"secure": [
{
"key": "-----BEGIN KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----"
}
],
"owner": "shallake",
"position": "gl"
}
]
}
剧本:
---
- hosts: localhost
gather_facts: no
connection: local
tasks:
- set_fact:
data_from_json: "{{ lookup('file','./myfile.json') | from_json }}"
- set_fact:
position: "{{ item }}"
with_items: "{{ data_from_json['data'] | map(attribute='position') | list }}"
- name: Display extracted position
debug:
var: position
结果(仅限相关任务):
TASK [Display extracted position] *********************************************************************************************************
ok: [localhost] => {
"position": "gl"
}
现在你的错误:
您的myfile.json
不是正确的JSON文件。
您似乎查看了Ansible的日志,并将其从屏幕复制到文件中。正如您已经看到的那样,它将不是有效的JSON格式(它将包含转义引号和换行符,这将阻止导入它。)
如果要将Ansible字典复制到文件中,可以使用以下任务执行此操作(我假设此处的数据位于data_from_json
变量中,就像我上面的示例playbook末尾一样) :
- local_action: copy content={{ data_from_json | to_nice_json }} dest=./myfile2.json
to_nice_json
在这里是可选的,但它会产生与上面的myfile.json
非常相似的输出(键的顺序可能会改变和缩进)。