Python 使用Ansible筛选器获取属性值
我试图从JSON数据中获取属性值 以下是我的JSON数据:Python 使用Ansible筛选器获取属性值,python,json,ansible,ansible-playbook,ansible-2.x,Python,Json,Ansible,Ansible Playbook,Ansible 2.x,我试图从JSON数据中获取属性值 以下是我的JSON数据: { "user1": "{\n \"data\":[\n {\n \"secure\": [\n {\n \"key\": \"-----BEGIN KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----\"\n }\n ],\n \"owner\": \"sha
{
"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数据,所以我使用到\u JSON
和从\u JSON
将其转换为有效的JSON。上面的JSON数据就是我得到的结果
代码:
在第三个集合\u fact
中,我试图获取位置属性值。但它显示了这样一个错误:
字段“args”的值无效,似乎包含未定义的变量。错误是:“项”未定义
“\”{\n\\“数据\\”:[\n{\n\\“安全\\”:[\n{\n\\“密钥\\”:\“----开始私钥----BEGINPRIVATE密钥----nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwl+TIU8LXOJOJXB/ii/eh\ngYEP3\n----END私钥---\\\”\n}\n}\n\\“所有者\\”:\\\“shalloke\\”,\n\\“位置\\:“gl\\”\n\n\n\n
那么,如何使用Ansible循环从上述JSON数据结果中获取位置值呢?请检查
filepath/myfile.JSON
中的键是否跨越多行?我们需要在JSON中避免换行。使用\n
替换换行符
支持将user1
作为从JSON解析的映射。但是,filepath/myfile.JSON
中的JSON可能无效。因此,在第二个集合\u fact
中,无法解析这个无效的JSON。因此,user1
只是一个字符串。而且它不包含条目数据
{
"data":[
{
"secure": [
{
"key": "-----BEGIN KEY-----\nMIIEowIBAAKCAQEAgOh+Afb0oQEnvHifHuzBwhCP3\n-----END KEY-----"
}
],
"owner": "shallake",
"position": "gl"
}
]
}
将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
- 结果(仅限相关任务):
现在你的错误是:
您的myfile.json
不是正确的json文件
您似乎查看了Ansible的日志,并将其从屏幕复制到文件中。正如您已经看到的,它将不是有效的JSON格式(它将包含转义引号和换行符,这将阻止导入它)
如果您想将Ansible字典复制到一个文件中,可以使用以下任务(我假设数据位于data\u from\u json
变量中,如上面示例playbook的末尾所示):
to_nice_json
在这里是可选的,但是它将产生与上面的myfile.json
非常相似的输出(键的顺序可能会改变,缩进)。这是我从我的代码集中得到的结果\u事实:user1:“{user | from_json}”,我试图得到“位置”json数据结果的属性值。我已经尝试过了,现在我将我的数据转换为如下“\”{\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”----BEGINPRIVATE key----------\\nMIIeowibaakcaqueagoh+Afb0oQEnvHifHuzBwl+Tiu8lXbojXb/ii/eh\\ngYEP3\\n--------------END私钥------\\\\\\\\\\\\\\\n\\n],\\n\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ansible@jake我不知道你想要什么。你可以通过“{{user2['data']|map(attribute='position')|list}}}”
获取位置列表。我这样做是为了单独获取“position”属性。但它显示为失败!=>{“failed”:true,“msg”:“字段'args'有一个无效值,它似乎包含一个未定义的变量。错误是:'unicode object'没有属性'data'\n如何使用ANSIBLE not with python处理:第6行第61列(char 110)处的无效控制字符”在ansible中,由于json数据的安全键值中有空格,所以会出现此错误。
---
- 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"
}
- local_action: copy content={{ data_from_json | to_nice_json }} dest=./myfile2.json