2017-08-30 96 views
0

我使用Ansible command的命令查询API。该API返回一个包含网络信息的JSON对象。如何过滤Ansible中的JSON数据?

我想根据其公有IP获取服务器的私有IP。我知道这可能与JSON query filter但我不知道如何。

代码:

- 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输出如下:

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,是根据它公开招标?

回答

0
--- 
- 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" 

为您提供:

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

非常感谢您的回答,但它仍然无效:(可能是因为'RPN' var包含嵌套对象:'RPN.stdout'如文章中所示。我尝试使用'with_items:“{{RPN.stdout [0] ...'而不是您提供的内容,但目前尚未成功。 – Buzut

0

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

- 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 

如果我把这种喜欢:

ansible-playbook playbook.yml -e public_ip=y.y.y.y 

我得到:

TASK [lookup server based on public ip] **************************************** 
ok: [localhost] => (item=10.91.120.148) => { 
    "item": "10.91.120.148" 
} 

如果我叫它为:

ansible-playbook playbook.yml -e public_ip=z.z.z.z 

我收到:

TASK [lookup server based on public ip] **************************************** 
ok: [localhost] => (item=10.91.165.215) => { 
    "item": "10.91.165.215" 
}