首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ansible中过滤JSON数据?

如何在Ansible中过滤JSON数据?
EN

Stack Overflow用户
提问于 2017-08-30 17:52:55
回答 2查看 10.5K关注 0票数 1

我正在用Ansible JSON的命令查询一个API,这个API返回一个带有网络信息的command对象。

我想根据服务器的公网ip获取服务器的内网ip。我知道用JSON query filter可以做到这一点,但我不知道怎么做。

代码:

代码语言:javascript
复制
- name: Get RPN topology
  command: 'curl -X GET -H "Authorization: Bearer {{ onlineApiToken }}" "https://api.online.net/api/v1/rpn/group"'
  register: RPN
  delegate_to: 127.0.0.1

这是RPN.stdout输出的样子:

代码语言:javascript
复制
    TASK [debug] ****************************************************************************************
ok: [ps1] => {
    "changed": false, 
    "msg": [
        {
            "id": 7406, 
            "members": [
                {
                    "id": 0000, 
                    "ip": "x.x.x.x", 
                    "owner": "buzut", 
                    "private_ip": "10.91.154.39", 
                    "speed": 100, 
                    "status": "active"
                }, 
                {
                    "id": 1111, 
                    "ip": "y.y.y.y", 
                    "owner": "buzut", 
                    "private_ip": "10.91.120.148", 
                    "speed": 100, 
                    "status": "active"
                }, 
                {
                    "id": 2222, 
                    "ip": "z.z.z.z", 
                    "owner": "buzut", 
                    "private_ip": "10.91.165.215", 
                    "speed": 1000, 
                    "status": "active"
                }
            ], 
            "name": "MySQL", 
            "owner": "buzut", 
            "shared": false, 
            "status": "updating"
        }
    ]
}

问题:如何根据服务器的公网ip获取服务器的内网ip?

EN

回答 2

Stack Overflow用户

发布于 2017-09-04 10:58:57

您可能需要花一些时间通读一下JMESPath Examples,以便熟悉json_query过滤器所支持的语法。下面给出了你想要的结果:

代码语言:javascript
复制
- hosts: localhost
  gather_facts: false
  vars:
    RPN:
      stdout: >-
        [
          {
            "id": 7406,
            "members": [
              {
                "id": 0,
                "ip": "x.x.x.x",
                "owner": "buzut",
                "private_ip": "10.91.154.39",
                "speed": 100,
                "status": "active"
              },
              {
                "id": 1111,
                "ip": "y.y.y.y",
                "owner": "buzut",
                "private_ip": "10.91.120.148",
                "speed": 100,
                "status": "active"
              },
              {
                "id": 2222,
                "ip": "z.z.z.z",
                "owner": "buzut",
                "private_ip": "10.91.165.215",
                "speed": 1000,
                "status": "active"
              }
            ],
            "name": "MySQL",
            "owner": "buzut",
            "shared": false,
            "status": "updating"
          }
        ]

  tasks:
    - name: lookup server based on public ip
      debug:
        var: item
      with_items: "{{RPN.stdout|from_json|json_query(public_to_private_ip)}}"
      vars:
        public_to_private_ip: >-
          [].members[?ip=='{{ public_ip }}'].private_ip

如果我这样称呼它:

代码语言:javascript
复制
ansible-playbook playbook.yml -e public_ip=y.y.y.y

我得到了:

代码语言:javascript
复制
TASK [lookup server based on public ip] ****************************************
ok: [localhost] => (item=10.91.120.148) => {
    "item": "10.91.120.148"
}

如果我这样称呼它:

代码语言:javascript
复制
ansible-playbook playbook.yml -e public_ip=z.z.z.z

我得到了:

代码语言:javascript
复制
TASK [lookup server based on public ip] ****************************************
ok: [localhost] => (item=10.91.165.215) => {
    "item": "10.91.165.215"
}
票数 2
EN

Stack Overflow用户

发布于 2017-08-30 21:15:40

代码语言:javascript
复制
---
- name: play1
  hosts: localhost
  gather_facts: false
  vars:
    public_ip: "x.x.x.x"

  tasks:

  - name: Print data
    debug: var=RPN

  - name: Lookup value in json var
    debug: var=item
    with_items: "{{RPN|json_query(public_to_private_ip)}}"
    vars:
      public_to_private_ip: "members[?ip=='{{ public_ip }}'].private_ip"

为您提供:

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

TASK [Print data] **************************************************************
ok: [localhost] => {
    "RPN": {
        "id": 7406,
        "members": [
            {
                "id": "0000",
                "ip": "x.x.x.x",
                "owner": "buzut",
                "private_ip": "10.91.154.39",
                "speed": 100,
                "status": "active"
            },
            {
                "id": 1111,
                "ip": "y.y.y.y",
                "owner": "buzut",
                "private_ip": "10.91.120.148",
                "speed": 100,
                "status": "active"
            },
            {
                "id": 2222,
                "ip": "z.z.z.z",
                "owner": "buzut",
                "private_ip": "10.91.165.215",
                "speed": 1000,
                "status": "active"
            }
        ],
        "name": "MySQL",
        "owner": "buzut",
        "shared": false,
        "status": "updating"
    }
}

TASK [Lookup value in json var] ************************************************
ok: [localhost] => (item=10.91.154.39) => {
    "item": "10.91.154.39"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

就是members[?ip=='{{ public_ip }}'].private_ip施展魔法的地方。

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

https://stackoverflow.com/questions/45957217

复制
相关文章

相似问题

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