Neulich habe ich Junos 'Commit Script von On-Box Python eingeführt. Darin habe ich etwas Flauschiges wie "Etwas wie ChatOps" als Beispiel dafür geschrieben, was mit Commit Script realisiert werden kann.
Also (?), Dieses Mal ist es so etwas wie ChatOps, also habe ich ein Commit-Skript geschrieben, um es nach dem Commit mit dem Junos-Router an Slack zu senden. (Sie können wütend werden, wenn Sie so etwas ChatOps nennen, aber bitte verzeihen Sie es als einfaches Beispiel.)
Das Skript sieht folgendermaßen aus: Die URL sollte entsprechend ersetzt werden.
post-slack.py
from junos import Junos_Context
import json
import urllib
import urllib2
def post_slack(_username, _text):
url = 'https://hooks.slack.com/services/************'
headers = {'Content-Type': 'application/json'}
params = json.dumps({"username": _username, "text": _text})
req = urllib2.Request(url, params, headers)
res = urllib2.urlopen(req)
if res.getcode() != 200:
message = '{0} {1} failed: {2}'.format(method, uri, res.getcode())
raise SlackPostError(message)
def main():
login_name = Junos_Context['user-context']['login-name']
host_name = Junos_Context['hostname']
product_name = Junos_Context['product']
name = 'Junos Router({0})'.format(host_name)
type = 'commit'
if Junos_Context['commit-context'].has_key('commit-check'):
type = 'commit check'
elif Junos_Context['commit-context'].has_key('commit-confirm'):
type = 'commit confirmed'
elif Junos_Context['commit-context'].has_key('commit-boot'):
print 'boot-time commit should be ignored'
sys.exit()
comment = ''
if Junos_Context['commit-context'].has_key('commit-comment'):
comment = ' with comment: {0}'.format(Junos_Context['commit-context']['commit-comment'])
text = 'User {0} trying {1} to {2}({3}){4}.'.format(login_name, type, host_name, product_name, comment)
post_slack(name, text)
if __name__ == '__main__':
main()
Es funktioniert so.
Es ist ein einfaches Skript. Wenn Sie es also lesen, werden Sie es verstehen, aber ich werde es kurz erklären.
Dieses Skript erstellt eine Nachricht, wenn ein Commit-Ereignis auftritt, je nachdem, um welche Art von Commit-Ereignis es sich handelt, und sendet sie an Slack. Im Commit-Skript können Sie auf eine Variable namens "Junos_Context" verweisen, um Informationen darüber zu erhalten, wer das Commit-Ereignis ausgeführt hat und warum. Beispielsweise können Sie folgende Eingabe erhalten:
junos_context.json
{
"product": "vmx",
"user-context": {
"login-name": "root",
"user": "root",
"class-name": "super-user",
"uid": "0"
},
"routing-engine-name": "re0",
"script-type": "commit",
"re-master": null,
"hostname": "vmx1",
"pid": "17688",
"tty": "/dev/pts/1",
"commit-context": {
"database-path": "/var/run/db/juniper.db",
"commit-check": null
},
"chassis": "others",
"localtime": "Tue Dec 27 19:36:45 2016",
"localtime-iso": "2016-12-27 19:36:45 UTC"
}
Wenn Sie dieses Ergebnis lesen, können Sie sehen, dass das Produkt "vmx" mit dem Hostnamen "vmx1" vom Benutzer "root" Commit Checked wurde. Welche Parameter enthalten sind, ist [Offizielles Dokument](https://www.juniper.net/techpubs/en_US/junos16.1/topics/reference/general/junos-script-automation-junos-xsl-global- Da es in params-and-var.html zusammengefasst ist, wird die Nachricht basierend auf den Bedingungen generiert, z. B. ob es sich um eine Festschreibungsprüfung handelt, ob es sich um eine bestätigte Festschreibung handelt und ob ein Kommentar vorliegt.
Der Teil, der an Slack gesendet werden soll, wird als post_slack-Methode ausgeschnitten. Es wird jedoch lediglich ein Parameter generiert, der den Inhalt enthält, den Sie im JSON-Format veröffentlichen möchten, und mit Urllib2 POST.
Das Commit-Skript weiß übrigens nicht, ob das Commit erfolgreich war oder nicht. Selbst wenn das Commit fehlschlägt, wird es an Slack gesendet.
Recommended Posts