Zum Inhalt springen Weiter zur Suche
Testversion
Blog

aXAPI mit Python

A10 bietet eine aXAPI-Schnittstelle, die REST-Webservice-Aufrufe verwendet, um Konfigurationsänderungen vorzunehmen. Hier finden Sie einen kurzen Überblick über die Funktionsweise.

  1. Abrufen einer Sitzungs-ID über einen HTTPS-Aufruf mit Benutzernamen und Passwort.
  2. Bauen Sie Ihren HTTPS-Postkörper in dem im Leitfaden angegebenen Format auf (XML oder JSon).
  3. Stellen Sie eine POST-Anfrage an das Gerät.

Hier ist der Code in Abschnitte unterteilt, die der Übersicht oben entsprechen:

Schritt 1. Ermitteln der Sitzungs-ID

#!/usr/bin/env python

#

# v1, September 27, 2013

# by Eric Chou

#

# Reference: AX_aXAPI_Ref_v2-20121010.pdf

#

import httplib, json, urllib, urllib2

# Gets the session ID to host 172.31.31.121 (Student 12)

c = httplib.HTTPSConnection(""172.31.31.121"")

c.request(""GET"", ""/services/rest/V2/?method=authenticate&username=admin&password=a10&format=json"")

response = c.getresponse()

data = json.loads(response.read())

session_id = data['session_id']

print ""Session Created. Session ID: "" + session_id

Schritt 2. Konstruieren Sie den HTTP-Post-Body

Beachten Sie, dass ich die Sitzungs-ID wieder verwende, weil die Zeit noch nicht abgelaufen ist. Ich überspringe die wiederholten Schritte, um mehr zu erstellen, weil das Einzige, was sich unterscheidet, der HTTP-Body ist. Das vollständige Skript finden Sie am Ende des Beitrags.
###############################

#  Step 1. Create Servers     #

###############################

# Create slb servers s1 10.0.2.128

# Construct HTTP URL and Post Body

post_body = json.dumps(

{""server"":

{

""name"": ""s1"",

""host"": ""10.0.2.128"",

""health_monitor"": ""(default)"",

""port_list"": [

{""port_num"": 80,

""protocol"": 2,}

],

}

}

)

url = ""https: //172.31.31.121/services/rest/V2/?&session_id="" + session_id + ""&format=json&method=slb.server.create""

print ""URL Created. URL: "" + url + "" body: "" + post_body

(Wiederholen Sie den Vorgang für alle erforderlichen Konfigurationsaufgaben)

Schritt 3. Den Antrag stellen

# Making request

req = urllib2.Request(url, post_body)

rsp = urllib2.urlopen(req)

content = rsp.read()

print ""Result: "" + content

Das war's! Einfach, elegant und mit minimalem Aufwand wiederholbar 🙂 .

Hier ist die leere Konfiguration des Geräts vor dem Skript:

AX12#sh run | s slb<

AX12#

AX12#

Hier ist die Ausgabe nach der Ausführung:

>>>

Session Created. Session ID: 69be80219842402d45f0488c52b782

URL Created. URL: https ://172.31.31.121/services/rest/V2/?&session_id=69be80219842402d45f0488c52b782&format=json&method=slb.server.create body: {""server"": {""host"": ""10.0.2.128"", ""name"": ""s1"", ""port_list"": [{""protocol"": 2, ""port_num"": 80}], ""health_monitor"": ""(default)""}}

Result: {""response"": {""status"": ""OK""}}

URL Created. URL: https ://172.31.31.121/services/rest/V2/?&session_id=69be80219842402d45f0488c52b782&format=json&method=slb.server.create body: {""server"": {""host"": ""10.0.2.129"", ""name"": ""s2"", ""port_list"": [{""protocol"": 2, ""port_num"": 80}], ""health_monitor"": ""(default)""}}

Result: {""response"": {""status"": ""OK""}}

URL Created. URL: https ://172.31.31.121/services/rest/V2/?&session_id=69be80219842402d45f0488c52b782&format=json&method=slb.service_group.create body: {""service_group"": {""protocol"": 2, ""name"": ""http"", ""member_list"": [{""port"": 80, ""server"": ""s1""}, {""port"": 80, ""server"": ""s2""}], ""health_monitor"": ""ping""}}

Result: {""response"": {""status"": ""OK""}}

URL Created. URL: https ://172.31.31.121/services/rest/V2/?&session_id=69be80219842402d45f0488c52b782&format=json&method=slb.virtual_server.create body: {""virtual_server"": {""subnet"": {""mask_len"": 24, ""address"": ""10.0.1.122""}, ""vport_list"": [{""service_group"": ""http"", ""protocol"": 2, ""port"": 80}], ""name"": ""vip1""}}

Result: {""response"": {""status"": ""OK""}}

>>>

Gerätekonfiguration nach

AX12#sh run | s slb

slb server s1 10.0.2.128

   conn-limit 8000000 no-logging

   port 80  tcp

slb server s2 10.0.2.129

   conn-limit 8000000 no-logging

   port 80  tcp

slb service-group http tcp

    health-check ping

    member s1:80

    member s2:80

slb virtual-server vip1 10.0.1.122 /24

   port 80  tcp

      service-group http

AX12#

Und jetzt kann ich die fantastische Webseite sehen, indem ich eine Anfrage an den von s1 bedienten VIP stelle:

eine Anfrage an das von s1 bediente VIP stellen

aXAPI ist ziemlich cool. Ich werde wahrscheinlich mehr damit spielen und meine Fortschritte hier posten.

Viel Spaß beim Coding! Hinterlassen Sie mir einen Kommentar, wie Sie aXAPI-Integrationsskripte gerne sehen würden 🙂 .

Hier ist das vollständige Skript:

Anmerkung. Wie Sie sehen können, wäre der nächste Schritt zur Optimierung, den HTTP-Body als Funktion zu konstruieren, um den Code zu reduzieren. Auch die Verwendung von Multiprozessen als Thread wäre schön.
#!/usr/bin/env python


#

# v1, September 27, 2013

# by Eric Chou

#

# Reference: AX_aXAPI_Ref_v2-20121010.pdf

#


import httplib, json, urllib, urllib2


# Gets the session ID to host 172.31.31.121 (Student 12)

c = httplib.HTTPSConnection(""172.31.31.121"")

c.request(""GET"", ""/services/rest/V2/?method=authenticate&username=admin&password=a10&format=json"")

response = c.getresponse()

data = json.loads(response.read())

session_id = data['session_id']

print ""Session Created. Session ID: "" + session_id


###############################

#  Step 1. Create Servers     #

###############################


# Create slb servers s1 10.0.2.128

# Construct HTTP URL and Post Body

post_body = json.dumps(

{""server"":

{

""name"": ""s1"",

""host"": ""10.0.2.128"",

""health_monitor"": ""(default)"",

""port_list"": [

{""port_num"": 80,

""protocol"": 2,}

],

}

}

)

url = ""https ://172.31.31.121/services/rest/V2/?&session_id="" + session_id + ""&format=json&method=slb.server.create""

print ""URL Created. URL: "" + url + "" body: "" + post_body


# Making request

req = urllib2.Request(url, post_body)

rsp = urllib2.urlopen(req)

content = rsp.read()

print ""Result: "" + content


# Create slb server s2 10.0.2.129

post_body = json.dumps(

{""server"":

{

""name"": ""s2"",

""host"": ""10.0.2.129"",

""health_monitor"": ""(default)"",

""port_list"": [

{""port_num"": 80,

""protocol"": 2,}

],

}

}

)

url = ""https ://172.31.31.121/services/rest/V2/?&session_id="" + session_id + ""&format=json&method=slb.server.create""

print ""URL Created. URL: "" + url + "" body: "" + post_body


# Making request

req = urllib2.Request(url, post_body)

rsp = urllib2.urlopen(req)

content = rsp.read()

print ""Result: "" + content


####################################

#  Step 2. Create Service Group    #

####################################


# Create service group http with member server s1 and s2

post_body = json.dumps(

{""service_group"":

{

""name"": ""http"",

""protocol"": 2,

""health_monitor"": ""ping"",

""member_list"": [

{""server"": ""s1"",

""port"": 80,},

{""server"": ""s2"",

""port"": 80,},

],

}

}

)

url = ""https ://172.31.31.121/services/rest/V2/?&session_id="" + session_id + ""&format=json&method=slb.service_group.create""

print ""URL Created. URL: "" + url + "" body: "" + post_body


# Making request

req = urllib2.Request(url, post_body)

rsp = urllib2.urlopen(req)

content = rsp.read()

print ""Result: "" + content


#####################################

#  Step 3. Create Virtual Server    #

#####################################


# Create virtual server

post_body = json.dumps(

{""virtual_server"":

{

""name"": ""vip1"",

""subnet"":

{

""address"": ""10.0.1.122"",

""mask_len"": 24,

},

""vport_list"": [

{""protocol"": 2,

""port"": 80,

""service_group"": ""http"",

},

],

}

}

)

url = ""https ://172.31.31.121/services/rest/V2/?&session_id="" + session_id + ""&format=json&method=slb.virtual_server.create""

print ""URL Created. URL: "" + url + "" body: "" + post_body


# Making request

req = urllib2.Request(url, post_body)

rsp = urllib2.urlopen(req)

content = rsp.read()

print ""Result: "" + content


Paul Nicholson
|
Oktober 3, 2013

Paul Nicholson verfügt über 24 Jahre Erfahrung in der Arbeit mit Internet- und Sicherheitsunternehmen in den USA und Großbritannien. In seiner jetzigen Position ist Nicholson verantwortlich für die globale... Mehr lesen