首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Ansible解析JSON

从Ansible解析JSON
EN

Stack Overflow用户
提问于 2019-10-23 21:17:37
回答 1查看 59关注 0票数 0

我在网上寻找,但我找不到解决方案,场景相当复杂。我有一个json数组,值如下:

代码语言:javascript
复制
[
  {
      "IP1": "1.2.3.4"
      "IP1_VLAN": "900 - CLOUD-DEV"
      "IP1_Role": "Management"
      "IP2": "4.5.6.7"
      "IP2_VLAN": "901 - CLOUD-DEV"
      "IP2_Role": "Production"
      "IP2": "8.9.10.11"
      "IP2_VLAN": "902 - CLOUD-DEV"
      "IP2_Role": "Backup"
  }
]   

我的目标是:“选择具有管理角色的IP并告诉我地址”,它应该选择IP*_Role == Management并在本例中告诉我1.2.3.4

你知道怎么处理这件事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-23 22:31:02

在我的评论之后,我的2美分答案是:搜索你的实际数据结构将是困难和丑陋的。如果您可以选择稍微更改一下,事情就会变得容易得多。

下面是一个使用以下演示手册中的yaml声明的列表的示例。使用带有相关jmespath表达式(即调试任务中的query变量)的json_query提取数据

代码语言:javascript
复制
---
- hosts: localhost
  gather_facts: False

  vars:
    my_ips:
      - ip: "1.2.3.4"
        vlan: "900 - CLOUD-DEV"
        role: "Management"
      - ip: "4.5.6.7"
        vlan: "901 - CLOUD-DEV"
        role: "Production"
      - ip: "8.9.10.11"
        vlan: "902 - CLOUD-DEV"
        role: "Backup"

  tasks:
    - name: Get ips per role
      vars:
        query: >-
          [?role=='{{ item }}']
      debug:
        msg: "List of ips for role {{ item }}: {{ my_ips | json_query(query) }}"
      loop:
        - Management
        - Production
        - Backup

这给了我们

代码语言:javascript
复制
PLAY [localhost] ********************************************************************************************************************************************************************************************************************************************************

TASK [Get ips per role] *************************************************************************************************************************************************************************************************************************************************
Wednesday 23 October 2019  16:14:23 +0200 (0:00:00.043)       0:00:00.043 ***** 
ok: [localhost] => (item=Management) => {
    "msg": "List of ips for role Management: [{'ip': '1.2.3.4', 'vlan': '900 - CLOUD-DEV', 'role': 'Management'}]"
}
ok: [localhost] => (item=Production) => {
    "msg": "List of ips for role Production: [{'ip': '4.5.6.7', 'vlan': '901 - CLOUD-DEV', 'role': 'Production'}]"
}
ok: [localhost] => (item=Backup) => {
    "msg": "List of ips for role Backup: [{'ip': '8.9.10.11', 'vlan': '902 - CLOUD-DEV', 'role': 'Backup'}]"
}

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在普通json中等效的变量声明为:

代码语言:javascript
复制
[
  {
    "ip": "1.2.3.4",
    "vlan": "900 - CLOUD-DEV",
    "role": "Management"
  },
  {
    "ip": "4.5.6.7",
    "vlan": "901 - CLOUD-DEV",
    "role": "Production"
  },
  {
    "ip": "8.9.10.11",
    "vlan": "902 - CLOUD-DEV",
    "role": "Backup"
  }
]

如果您必须从外部字符串加载此文件(例如,加载文件...),您可以在攻略中使用from_json filter

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58523793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档