본문 바로가기
<툴, 프로그램 관련>/[Script]

Infoblox WAPI example

by Aggies '19 2020. 12. 3.
반응형

회사에서 Bluecat DDI를 사용하다가 Infoblox로 migration한 이후 API를 활용하여 업무 자동화를 진행하고 있는데 Software Engineer는 아니지만 Network Engineer로써도 몇 줄안되는 간단한 Script만으로도 다양한 업무를 자동화하고 낭비되는 시간을 줄일 수 있다.

 

[Case 1] - 11:22:ee:55:77:99를 DHCP pool이라는 이름을 가진 filter에 extensible attribute와 함께 등록

test_server = 'https://server_name/wapi/v2.10.5/'
test_server_id = 'userid'
test_server_pw = 'userpassword'

payload = '{"mac": "11:22:ee:55:77:99", "filter" : "DHCP pool", "extattrs": {"Security Zone": {"value": "ANYTHING"}}}'

r = requests.post(f'{test_server}macfilteraddress?_return_fields%2B=extattrs&_return_as_object=1', 
data = payload, auth=(test_server_id, test_server_pw), verify=False, headers={'Accpet': 'application/json'})

 

[Case 2] - Case 1에서 등록한 MAC address를 검색

r = requests.get(f'{test_server}macfilteraddress?mac=11:22:ee:55:77:99', auth=(test_server_id, test_server_pw), 
verify=False, headers={'Accpet': 'application/json'})

 

[Case 2-1] - Case 1에서 등록한 MAC address를 extensible attributes를 포함하여 검색하는 경우

r = requests.get(f'{test_server}macfilteraddress?mac=11:22:ee:55:77:99&_return_fields%2B=extattrs&_return_as_object=1', auth=(test_server_id, test_server_pw),
verify=False, headers={'Accpet': 'application/json'})

 

[Case 3] Extensible record를 변경하는 경우

payload = '{"extattrs": {"Security Zone": {"value": "SUPER SECURE"}}}'
r = requests.get(f'{prod_server}macfilteraddress?filter={filter}&mac={mac}&_return_fields%2B=extattrs', auth=(prod_server_id, prod_server_pw),verify=False, headers={'Accpet': 'application/json'})
new_payload = json.loads(r.text)
object = new_payload[0].get('_ref')
       
securityZone = json.loads(payload)

securityZone.get('extattrs').get('Security Zone')['value'] = "ULTRA SECURE"
securityZone = json.dumps(securityZone)
        
r = requests.put(f'{prod_server}{object}/mac={mac}?_return_fields%2B=extattrs', 
data = securityZone, auth=(prod_server_id, prod_server_pw),verify=False, headers={'Accpet': 'application/json'})

Query에 사용되는 Argument에 따라서 return되는 값이 조금씩 다르기에 object라는 변수를 선언과 할당하는 시점의 syntax는 달라질 수 있다. 어떤 정보를 업데이트를 하려면 업데이트 할 대상(개체)이 필요하고 HTTP method로는 put을 활용해야 한다. 따라서, get을 통해서 정보를 업데이트 할 대상을 받아온 후 put을 통해 extensible 정보의 일부를 변경한다. 

 

[Case 4] Network에 permissions을 추가하는 경우

Network에서 permission 메뉴는 Superuser 권한을 갖는 ID로 접속했을 경우에만 보인다.

이 permissions을 이용하여 어떠한 네트워크에 대해 Read/Write 권한을 group에 부여하는 과정을 WAPI를 이용하였다.

r = requests.get(f'{test_server}network?network={network}&_return_as_object=1', auth=(test_server_id, test_server_pw),
verify=False, headers={'Accpet': 'application/json'})
    
payload = json.loads(r.text)
network_obj = payload.get('result')[0].get('_ref')

r = requests.post(f'{test_server}permission?object={network_obj}&group=API-TESTING&permission=WRITE', 
auth=(test_server_id, test_server_pw),verify=False, headers={'Accpet': 'application/json'})

 

[Case 5] MAC주소를 삭제

몇 번만 코드를 짜보면 어렵지않게 API를 작성하여 업무를 보다 효율적으로 할 수 있다. 물론, Infoblox는 기본적으로 csv를 활용한 import, export 기능이 굉장히 잘되어 있는 편이라서 bulk로 무언가를 작업할 때 어렵지 않게 할 수 있지만 나는 API를 활용하여 작업하는게 편하다. 삭제하고자 하는 MAC 주소를 검색 후, 그 reference 값을 보내주고 delete만 물러 주면 원하는 값을 삭제할 수 있다.  

    for elem in mac:
        r = requests.get(f'{prod_server}macfilteraddress?mac={elem}', auth=(prod_server_id, prod_server_pw),
        verify=False, headers={'Accpet': 'application/json'})
        pprint.pprint(r.text)

        new_payload = json.loads(r.text)
        object = new_payload[0].get('_ref')
        
        r = requests.delete(f'{prod_server}{object}/mac={mac}', auth=(prod_server_id, prod_server_pw),
        verify=False, headers={'Accpet': 'application/json'})
        
        print(r.status_code)
반응형