我正在用Ansible JSON的命令查询一个API,这个API返回一个带有网络信息的command对象。
我想根据服务器的公网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获取服务器的内网ip?
发布于 2017-09-04 10:58:57
您可能需要花一些时间通读一下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"
}发布于 2017-08-30 21:15:40
---
- 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施展魔法的地方。
https://stackoverflow.com/questions/45957217
复制相似问题