[PYTHON] Wie man NAPALM aus dem Web erreicht (NetDevOpsSec echte Lösung)

Einführung

Dieser Artikel ist vom 14. Dezember 2016 in NetOpsCoding Adventskalender 2016.

CLI wird häufig zum Betreiben von Netzwerkgeräten verwendet, ist jedoch mit einem Programm mit CLI (-_-;) nur schwer zu handhaben.

Einige Ingenieure, hauptsächlich Spotify, haben eine Bibliothek namens "Napalm" erstellt, um die Handhabung des Programms zu vereinfachen. (Paramiko Basis) https://github.com/napalm-automation/napalm

Aktuelles Beispiel

Dieses Mal werde ich versuchen, die Konfiguration mit der Konfiguration von Junos + CGI + Napalm aus dem Web zu laden. Wenn Sie einen Befehl aus dem Web ausführen möchten (z. B. eine Firewall-Richtlinie hinzufügen), bereiten Sie das folgende HTML / CGI vor.

firewall-policy.html


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<form action="cgi-bin/firewall-policy.py" method="post">
    srcaddress:<input type="text" name="srcaddress">
    srcnetmask:<input type="text" name="srcnetmask">
    destaddress:<input type="text" name="destaddress">
    destnetmask:<input type="text" name="destnetmask">
    applicationname:<input type="text" name="applicationname">
    policy_then:<input type="text" name="policy_then">
    <input type="submit" value="Go">
</form>
</body>
</html>

firewall-policy.py


#!/usr/bin/python


##
(srxipaddr, srxuser, srxpasswd)=('192.168.xx.xx', 'xx', 'xx')
##

import cgi
from napalm import get_network_driver

fs = cgi.FieldStorage()

js={}
for key in fs.keys():
  js[key]=fs[key].value

##
# do import stuff
##
candidate_config_template="""
security policies from-zone untrust to-zone untrust policy automation-policy {{
   match {{
       source-address automation-policy-src;
       destination-address automation-policy-dest;
       application {applicationname};
       }}
       then {{
           {policy_then};
   }}
}}
security zones security-zone untrust address-book {{
   address automation-policy-src {srcaddress}/{srcnetmask};
   address automation-policy-dest {destaddress}/{destnetmask};
}}
"""
candidate_config=candidate_config_template.format(**js)

driver = get_network_driver('junos')
device = driver(srxipaddr, srxuser,  srxpasswd)
device.open()
print (candidate_config)
device.load_merge_candidate(config=candidate_config)
print (device.compare_config())
device.commit_config()
device.close()

Als Punkt

--Konvertieren Sie das vom Webformular empfangene Argument in dict (= JSON = YAML) und wenden Sie es dann auf die Konfigurationsvorlage an

Ich frage mich, ob ...

Weitere Informationen finden Sie unten. http://qiita.com/taijijiji/items/a3f21c8b9e7a0d3afdc6 http://www.slideshare.net/JuniperJapan/interop-tokyo-2016junos-automation

Dank der wunderbaren Blogs der Pioniere ist es leicht vorbei ... (-o-;)

Dies ist ein wenig einsam, weil es sehr leicht endet, daher möchte ich ein komplizierteres Beispiel betrachten (-_-;)

Was ist der Genehmigungsablauf?

Wie bereits geschrieben, wird bei Routinearbeiten im Web der Ablauf von Benutzeranweisungen (kurz Argumente) unten dargestellt.

  1. Antragsteller (= Arbeitnehmer) -> Webanwendung-> Napalm

In diesem Fluss jedoch

Es gibt eine Einschränkung, dass es nur verwendet werden kann, wenn sie identisch sind, und dies wird zu einem Problem im tatsächlichen Betrieb.

Dies bedeutet, dass in einer Unternehmensumgebung, in der IT-Vorgänge überwacht werden. Es gibt eine Einschränkung, dass "Antragsteller (Anbieter von Anwendungsentwicklungen usw.)" Die Produktionsumgebung nicht direkt betreiben können.

(Referenz) http://forza.cocolog-nifty.com/blog/2015/02/itdevops-691f.html http://blogs.itmedia.co.jp/infra/2013/09/devops1devops-7abb.html

In diesem Fall genehmigt der Genehmigende den vom Antragsteller beschriebenen Inhalt, und dann führt der Arbeitnehmer die Arbeit aus. Bei ITIL-fähigen Tools (normalerweise intensiv bei Audits) wird dies als Bildschirm festgelegt und die Arbeit ist eine angehängte Datei.

Daher ist der realistische Fluss in diesem Fall wie folgt.

  1. Bewerber-> Arbeitsanweisungen (Excel usw.) -> ITIL-Tools-> (Workflow) -> Arbeitnehmer
  2. Worker-> Web App-> Napalm

In diesem Fall schreibt der Antragsteller den Arbeitsauftrag so detailliert wie möglich. Es gibt eine Grenze für die Informationen, die auf Japanisch erklärt werden können ... Beim Betrachten des Amazon-Bildschirms hatte ich das Gefühl, alle Bestellungen per E-Mail zu senden.

――Wo und wann liefern Sie es aus? ――Wenn Sie es zuerst auswählen können, wird es separat versendet? ――Was ist die Zahlungsmethode?

Um ehrlich zu sein, ist es schwierig, genau auf einen Schlag zu sagen. des Weiteren,

――Wie viele Aktien haben Sie überhaupt?

Usw., einschließlich der Überprüfung der Inhalte, die ohne Überprüfung mit dem System nicht verstanden werden können, usw. Ich halte es für wünschenswert, dass Bewerber ein Bewerbungsformular erstellen, das auf einer Art Webanwendung basiert.

Ich denke also, dass der ideale Fluss wie folgt ist.

  1. Antragsteller-> Webanwendung-> Eingabeinhalt als JSON exportieren
  2. Antragsteller-> ITIL-Tool (JSON beigefügt) -> (Workflow) -> Worker
  3. Worker-> Web App (JSON importieren) -> Napalm

Wenn dies erreicht werden kann, gibt es die folgenden Vorteile.

--Applicant (Dev): Sie können ein Anforderungsformular erstellen, während Sie prüfen, ob der Inhalt selbst mit einer Webanwendung bearbeitet werden kann, wodurch die Interaktion mit den Mitarbeitern verringert wird --Worker (Net, Ops): Die Arbeit beschränkt sich auf den JSON-Import, es ist nicht erforderlich, die eigentliche Maschine zu bedienen, weniger Interaktion mit dem Antragsteller

Ich habe versucht, das Tool zu implementieren

In Bezug auf die oben genannten Probleme habe ich versucht, die folgenden Tools zu implementieren, während ich das Front-Miso gemacht habe. https://github.com/tnaganawa/execjson

Das Bildschirmbild des Werkzeugs sieht wie folgt aus. advent-calendar-2016.png

Zunächst gibt der Antragsteller die eingegebenen Inhalte für jede auszuführende Arbeit in das Webformular ein (im Beispiel Hinzufügen einer Firewall-Richtlinie). Klicken Sie auf "Exportieren", wenn Sie fertig sind, und der JSON wird exportiert, damit Sie ihn durch den Genehmigungsablauf leiten können.

sample.json


{
    "jobapplcode": "", 
    "jobenvcode": "Prod", 
    "joblist": [
        {
            "args": [
                {
                    "applicationname": "junos-vnc", 
                    "destaddress": "192.168.12.11", 
                    "destnetmask": "32", 
                    "policy_then": "permit", 
                    "srcaddress": "192.168.11.11", 
                    "srcnetmask": "32"
                }
            ], 
            "id": "1", 
            "iffail": "stop", 
            "name": "addfirewallpolicy", 
            "time": ""
        }
    ]
}

Danach sollte der Worker, der den JSON erhalten hat, den JSON erneut mit 'load' importieren, 'execjson' drücken und der Prozess sollte diesmal beginnen zu fließen.

Zusammenfassung

Ich hoffe, dass die oben genannten Tools Ihnen einen Einstieg in die Automatisierung der Benutzeranforderungsarbeit ermöglichen. (Ich kann nichts sagen, weil es von der Umgebung abhängt) Tatsächlich stoppt der DevOps-Fluss normalerweise bei der Sicherheit, aber mit einem Tool wie dem oben genannten

Ich denke, es wäre besser, den Umfang der Verbesserungen schrittweise in der Reihenfolge von zu erweitern.

Recommended Posts

Wie man NAPALM aus dem Web erreicht (NetDevOpsSec echte Lösung)
So bedienen Sie Linux von der Konsole aus
So greifen Sie von außen auf den Datenspeicher zu
So erstellen Sie eine Anwendung aus der Cloud mithilfe des Django-Webframeworks
So öffnen Sie einen Webbrowser über Python
So bedienen Sie Linux von außen Vorgehensweise
So messen Sie die Leitungsgeschwindigkeit vom Terminal aus
So erstellen Sie einen Artikel über die Befehlszeile
So starten Sie Jupyter Notebook sofort vom Terminal aus
Wie man das Dokument der magischen Funktion (Linienmagie) trifft
So veröffentlichen Sie ein Ticket über die Shogun-API
Verwendung des Generators
Berechnen des aus ABC134-D gelernten Rechenaufwands
So melden Sie sich automatisch wie 1Password von der CLI an
So nehmen Sie erste Einstellungen für die Django-Projekterstellung vor
Wie benutzt man den Dekorateur?
So erhöhen Sie die Achse
So starten Sie die erste Projektion
[EC2] So installieren und laden Sie chromedriver über die Befehlszeile herunter
So extrahieren Sie die gewünschte Zeichenfolge aus einem Befehl in Zeile 4
So beheben Sie den Fehler, der in toimage aufgetreten ist (aus PIL.Image Import fromarray als toimage)
Wie berechnet man den Autokorrelationskoeffizienten?
Verwendung der Zip-Funktion
Verwendung des optparse-Moduls
Wie man SWIG von waf benutzt
Lesen des SNLI-Datensatzes
Klicken Sie auf die Web-API in Python
So starten Sie den Explorer über die WSL
So überschreiben Sie die Ausgabe auf die Konsole
So greifen Sie über Python auf Wikipedia zu
So konvertieren Sie von .mgz nach .nii.gz
Verwendung des ConfigParser-Moduls
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
So überprüfen Sie die lokale GAE über den iPhone-Browser im selben LAN
Lernaufzeichnung (4. Tag) #Wie man den absoluten Pfad vom relativen Pfad erhält
Versuchen Sie es mit Pythons Webframework Django (1) - Von der Installation bis zum Serverstart
[Django] So übergeben Sie Werte direkt von Vorlagen-Tags an JavaScript-Variablen
So zeigen Sie den Fortschrittsbalken an (tqdm)
So erstellen Sie einen Klon aus Github
Verwendung der Spark ML-Pipeline
So konvertieren Sie das Format einfach aus Markdown
So überprüfen Sie die Version von Django
So lösen Sie das Problem beim Verpacken des Behälters
So stellen Sie die Serverzeit auf japanische Zeit ein
[TF] Verwendung von Tensorboard von Keras
Verwendung von Multi-Core aus der Sicht mehrerer Sprachen
[Linux] Verwendung des Befehls echo
So erhalten Sie eine farbige Ausgabe an die Konsole
Zugriff auf RDS von Lambda (Python)
So erstellen Sie ein Repository aus Medien
Verwendung des IPython-Debuggers (ipdb)
[Python] So speichern Sie Bilder mit Beautiful Soup sofort im Web
[Python-Tipps] So rufen Sie mehrere Schlüssel mit dem Maximalwert aus dem Wörterbuch ab
Die Geschichte des Wechsels des Azure App Service-Websystems von Windows zu Linux