2017-08-30 28 views
0

commandのコマンドを使用して、APIにクエリを実行しています。 APIは、ネットワーク情報を持つJSONオブジェクトを返します。AnsibleでJSONデータをフィルタリングする方法は?

パブリックIPに基づいてサーバーのプライベートIPを取得したいと考えています。私はこれがJSON query filterで可能であることを知っていますが、私はどのように理解できません。

コード:

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を得るのですが

- 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出力がどのように見えるのですか?

答えて

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" 

はあなたを与える: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 

+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" 
} 
関連する問題