Ansible中的JSON解析技巧

引言

在使用Ansible进行自动化配置和管理时,处理JSON数据是一个常见的任务。最近,我在处理证书生成工具的输出时,遇到了一个关于JSON解析的问题。今天,我将与大家分享如何在Ansible中解析JSON数据,特别是当数据以字符串形式存储时。

问题描述

假设我们有一个证书生成工具,它输出如下格式的证书信息:

{
    "cert": "abc123......",
    "id": 10,
    "key": "abc123....."
}

当我们在Ansible中使用这个工具,并将输出注册为变量时,变量会以如下方式存储,其中certkey属性是base64编码的:

{
    "cert_output": {
        "changed": true,
        "delta": "0:00:00.673537",
        "end": "2024-05-14 13:34:45.492559",
        "failed": false,
        "msg": "",
        "rc": 0,
        "start": "2024-05-14 13:34:44.819022",
        "stderr": "",
        "stderr_lines": [],
        "stdout": "{\"id\":233370662,\"cert\":\"abc123...\",\"key\":\"abc123...\"}",
    }
}

问题在于如何从这个嵌套的JSON结构中提取出certkey的值。

尝试与错误

最初,我尝试使用set_factjson_query来解析JSON,但遇到了以下错误:

- set_fact:
    cert: "{{ cert_output.stdout|from_json|json_query('.cert') }}"
    key: "{{ cert_output.stdout|from_json|json_query('.key') }}"

这个方法失败了,因为json_query在这种情况下解析失败,提示JMESPathError in json_query filter plugin

解决方案

经过研究和测试,我发现了两种有效的方法来解析这个JSON数据:

方法一:直接访问JSON属性

Ansible可以直接处理JSON数据,不需要使用JMESPath语法。只要将JSON字符串转换为JSON对象,就可以使用点号表示法直接访问其属性:

- set_fact:
    cert: "{{ (cert_output.stdout | from_json).cert }}"
    key: "{{ (cert_output.stdout | from_json).key }}"

这个方法简单且有效,结果如下:

ok: [localhost] => changed=false 
  ansible_facts:
    cert: abc123...
    key: abc123...

方法二:使用json_query的正确语法

如果仍然希望使用json_query,那么应该使用无点号的语法来访问根节点的属性:

- set_fact:
    cert: "{{ cert_output.stdout | from_json | json_query('cert') }}"
    key: "{{ cert_output.stdout | from_json | json_query('key') }}"

处理列表中的字典

如果证书输出是一个列表,例如:

[{ "cert": "abc123......", "id": 10, "key": "abc123....." }]

可以使用map过滤器来提取所有证书或密钥:

- set_fact:
    certs: "{{ (cert_output.stdout | from_json) | map(attribute='cert') | list }}"
    keys: "{{ (cert_output.stdout | from_json) | map(attribute='key') | list }}"

这样可以得到一个包含所有证书或密钥的列表。

结论

在Ansible中处理JSON数据需要注意数据的格式和解析方法。通过使用正确的过滤器和语法,我们可以轻松地从复杂的JSON结构中提取所需的数据。希望这篇博客能帮助你更好地理解和应用Ansible中的JSON解析技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值