회사에서 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)
'<툴, 프로그램 관련> > [Script]' 카테고리의 다른 글
Outlook에서 Python Script 실행하기 (0) | 2021.03.16 |
---|---|
MAC Address 포맷 변경 크롬 익스텐션 (0) | 2021.02.10 |
AKiPS 활용해보기 (0) | 2021.01.29 |
[CLI Script] VTP domain gathering pexpect module (0) | 2020.06.02 |
SecureCRT python script to update hostname and banner (0) | 2020.03.04 |