Verwenden Sie benutzerdefinierte Python-Skripte mit StackStorm

Python ist als benutzerdefiniertes Skript für StackStorm Action verfügbar.

Schauen wir uns hier den Ablauf und die Verwendung für die Verwendung von Python-Skripten mit StackStorm an.

Komponenten des Python-Skripts

Es gibt die folgenden zwei.

Wenn Sie eine statische Konfigurationsdatei verwenden möchten, verwenden Sie eine andere Konfigurationsdatei.

Flow um sich zu bewegen

Es wird der Fluss sein.

Führen Sie das Python-Skript tatsächlich als Aktion aus

Lassen Sie uns von hier aus sehen, wie das Python-Skript tatsächlich als Aktion ausgeführt wird. Es wird davon ausgegangen, dass die Zertifizierung im Voraus abgeschlossen wurde. Das Folgende ist ein Beispiel für die Authentifizierung mit st2admin / st2admin.

$ export ST2_AUTH_TOKEN=$(st2 auth st2admin -p st2admin -t)

Erstellen Sie die erforderlichen Skripte und Konfigurationsdateien

Wie oben erwähnt, müssen Sie zwei Dateien erstellen. Beide müssen sich unter / opt / stackstorm / packs / <Paketname> / action / befinden. Erstellen Sie es hier mit dem Packnamen test.

metadata

Ich denke, das ist ziemlich leicht zu sehen. entry_point schreibt den relativen Pfad von / opt / stackstorm / packs / <Paketname> / action.

/opt/stackstorm/packs/test/actions/python-test.yaml


---
name: "python-test"
runner_type: "python-script"
description: "this is a sample script of python"
enabled: true
entry_point: "python-test.py"
parameters:
  param1:
    type: "string"
    description: "parameter 1"
    required: true
    position: 0
  param2:
    type: "string"
    description: "parameter 2"
    required: true
    position: 1
    default: "default parameter 2"

Python-Skript

Da dieses Skript von StackStorm aufgerufen wird, gibt es eine Methode selbst, aber es scheint gut zu denken, dass die run -Methode am Ende aufgerufen wird [^ 1].

/opt/stackstorm/packs/test/actions/python-test.py


import sys

from st2actions.runners.pythonrunner import Action

class PythonTestAction(Action):
    def __init__(self, config):
        self.config = config

    def run(self, param1, param2):
        print(param1, param2)
        print(self.config["test_param1"])
        return (True, param1 + "," + param2)

Ich übergebe config im Konstruktor, der mit der Konfigurationsdatei funktioniert, die ich als nächstes einführen werde.

Konfigurationsdatei

/opt/stackstorm/packs/test/config.yaml


test_param1: "static_param1"

Wenn Sie "config.yaml" direkt unter "" einfügen, wird der darin geschriebene Einstellungswert vom Konstruktor in das Objekt "config" eingelesen, wenn das Python-Skript ausgeführt wird [^ 2 ].

Erstellen Sie eine Python-Ausführungsumgebung in StackStorm

Jetzt möchte ich mich bei StackStorm registrieren und ausführen ... aber selbst wenn ich mich so registriere und ausführe, tritt ein Fehler auf. (Die Registrierung ist erfolgreich, aber die Ausführung führt zu einem Fehler.)

Um alle Aktionen zu registrieren, führen Sie zunächst den Befehl st2ctl reload --register-action aus. Dies ist ein Befehl, der alle Einstellungen unter "/ opt / stackstorm / " erneut liest.

$ sudo st2ctl reload --register-actions
Registering content...[flags = --register-actions]
2016-08-27 14:23:15,107 INFO [-] Connecting to database "st2" @ "0.0.0.0:27017" as user "None".
2016-08-27 14:23:15,376 INFO [-] =========================================================
2016-08-27 14:23:15,376 INFO [-] ############## Registering actions ######################
2016-08-27 14:23:15,376 INFO [-] =========================================================
2016-08-27 14:23:17,147 INFO [-] Registered 63 actions.
##### st2 components status #####
st2actionrunner PID: 4291
st2actionrunner PID: 4293
st2actionrunner PID: 4295
st2actionrunner PID: 4297
st2actionrunner PID: 4299
st2actionrunner PID: 4301
st2actionrunner PID: 4303
st2actionrunner PID: 4305
st2actionrunner PID: 4307
st2actionrunner PID: 4309
st2api PID: 4316
st2api PID: 4810
st2stream PID: 4378
st2stream PID: 4756
st2auth PID: 4388
st2auth PID: 4748
st2garbagecollector PID: 4396
st2notifier PID: 4404
st2resultstracker PID: 4416
st2rulesengine PID: 4428
st2sensorcontainer PID: 4440
st2chatops is not running.
mistral-server PID: 4486
mistral-api PID: 4481
mistral-api PID: 4769
mistral-api PID: 4770

Es ist tatsächlich registriert.

$ st2 action list -p test
+----------------------+------+-----------------------------------+
| ref                  | pack | description                       |
+----------------------+------+-----------------------------------+
| test.python-test     | test | this is a sample script of python |
+----------------------+------+-----------------------------------+

Wenn Sie nun versuchen, ... auszuführen, tritt ein Fehler auf.

$ st2 run test.python_test param1=p1
..
id: 57c1dbf1e368b912caaf8908
status: failed
parameters:
  param1: p1
result:
  error: '

    Virtual environment (/opt/stackstorm/virtualenvs/test) for pack "test" doesn''t exist. If you haven''t

    installed a pack using "packs.install" command, you can create a new virtual environment using

    "st2 run packs.setup_virtualenv packs=test" command''

    '
  traceback: "  File "/opt/stackstorm/st2/lib/python2.7/site-packages/st2actions/container/base.py", line 98, in _do_run
    (status, result, context) = runner.run(action_params)
  File "/opt/stackstorm/st2/lib/python2.7/site-packages/st2actions/runners/pythonrunner.py", line 118, in run
    raise Exception(msg)
"

In der Mitte befindet sich eine Meldung, die jedoch bedeutet, dass das Paket "Test" keine Ausführungsumgebung für Python enthält. Es scheint, dass die Ausführungsumgebung für jedes Paket durch "virtualenv" unterteilt ist. Wenn Sie das Paket also richtig aufteilen, können Sie anscheinend die Ausführungsumgebung nicht überladen.

Lassen Sie uns nun die Umgebung gemäß der Nachricht erstellen. Es heißt "Drücke den Befehl so" vorsichtig, also führe ihn genau so aus, wie er ist.

$ sudo st2 run packs.setup_virtualenv packs=test
....
id: 57c1dc6ce368b912caaf890b
status: succeeded
parameters:
  packs:
  - test
result:
  exit_code: 0
  result: 'Successfuly set up virtualenv for the following packs: test'
  stderr: 'st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Setting up virtualenv for pack "test"

    st2.actions.python.SetupVirtualEnvironmentAction: INFO     Virtualenv path "/opt/stackstorm/virtualenvs/test" doesn''t exist

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Creating virtualenv for pack "test" in "/opt/stackstorm/virtualenvs/test"

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Creating virtualenv in "/opt/stackstorm/virtualenvs/test" using Python binary "/opt/stackstorm/st2/bin/python"

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Running command "/opt/stackstorm/st2/bin/virtualenv -p /opt/stackstorm/st2/bin/python /opt/stackstorm/virtualenvs/test" to create virtualenv.

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Installing base requirements

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    No pack specific requirements found

    st2.actions.python.SetupVirtualEnvironmentAction: DEBUG    Virtualenv for pack "test" successfully created in "/opt/stackstorm/virtualenvs/test"

    '
  stdout: ''

Alle sind INFO und DEBUG, also scheint es kein Problem zu geben. Wie Sie in der letzten Nachricht sehen können, befindet sich in / opt / stackstorm / virtualenvs / test eine Python-Umgebung.

Ausführung der Aktion (Ausführung des Python-Skripts)

Nachdem die Registrierung selbst abgeschlossen wurde, versuchen wir es erneut.

$ st2 run test.python-test param1=p1
..
id: 57c1ed13e368b912caaf8962
status: succeeded
parameters:
  param1: p1
result:
  exit_code: 0
  result: p1,default parameter 2
  stderr: ''
  stdout: '(u''p1'', u''default parameter 2'')

    static_param1

    '

Wie oben erwähnt, wird das, was von "print" ausgegeben wird, in "stdout" gespeichert, und was von "return" zurückgegeben wird, wird in "result" gespeichert.

Zusammenfassung

Es ist also einfach, aber ich habe gesehen, wie Python-Skripte ausgeführt werden. Möglicherweise gibt es einige Komponenten, aber es sieht so aus, als könnten Sie Python sehr einfach als Workflow ausführen.

Andere Dinge, die mich interessierten

Was passiert, wenn ich die Aktion ändere und neu lade, während die Aktion ausgeführt wird?

Es hat nicht geholfen. Was nicht unterbrochen oder bewegt wird, bewegt sich weiter. Die Änderungen werden ab der nächsten Ausführung übernommen. Daher scheint es nicht nötig zu sein, die bestehenden und funktionierenden zu stoppen.

Wann müssen Sie neu laden?

Es ist Zeit, YAML (Metadaten) zu ändern. Wenn Sie nur das Python-Skript ändern, müssen Sie es nicht neu laden.

Was ist, wenn ich die Datei lösche und neu lade?

Es hat nicht geholfen. Sie können den Befehl st2ctl reload --register-action verwenden, um etwas wiederzugeben, das noch nie zuvor existiert hat. Im Gegenteil, selbst wenn Sie die Datei löschen und den obigen Befehl ausführen, wird sie nicht gelöscht. (Aktion bleibt registriert) Wenn Sie es löschen möchten, müssen Sie es daher explizit wie folgt löschen.

st2 action delete test.python-test

Welche Parameter können außer dem Argument verwendet werden?

Wenn es um Python-Skripte geht, können Sie sie anscheinend nur explizit zu den Argumenten hinzufügen oder aus Umgebungsvariablen lesen [^ 3].

Welche Art von Argument kann verwendet werden?

Es scheint, dass das Wörterbuch verschiedene Dinge in Form von {{action_context}} [^ 4] enthält. Beispielsweise ist WebHook der Benutzer und Workflow die ID der übergeordneten Aktion. Ich habe es jedoch nicht versucht.

Recommended Posts

Verwenden Sie benutzerdefinierte Python-Skripte mit StackStorm
Schritte zur Entwicklung von Django mit VSCode
Verwenden Sie benutzerdefinierte Python-Skripte mit StackStorm
[GUI mit Python] PyQt5 -Custom Widget-
[Azure] Klicken Sie mit Python auf Custom Vision Service
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Pyinstaller verwandelt Python-Skripte in EXE-Dateien, die unter Windows ausgeführt werden können
Überprüfen Sie Python-Skripte automatisch mit GitHub + Travis-CI + Pycodestyle
Serielle Kommunikation mit Python
Zip, entpacken mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Scraping in Python (Vorbereitung)
Python lernen mit ChemTHEATER 03
Sequentielle Suche mit Python
Führen Sie Python mit VBA aus
Umgang mit Yaml mit Python
Löse AtCoder 167 mit Python
Serielle Kommunikation mit Python
[Python] Verwenden Sie JSON mit Python
Python lernen mit ChemTHEATER 05-1
Lerne Python mit ChemTHEATER
Führen Sie prepDE.py mit python3 aus
1.1 Erste Schritte mit Python
Tweets mit Python sammeln
Binarisierung mit OpenCV / Python
3. 3. KI-Programmierung mit Python
Kernel-Methode mit Python
Nicht blockierend mit Python + uWSGI
Scraping mit Python + PhantomJS
Tweets mit Python posten
Verwenden Sie Mecab mit Python 3
[Python] Mit CGIHTTPServer umleiten
Kinesis mit Python betreiben
Erste Schritte mit Python
Verwenden Sie DynamoDB mit Python
Zundko Getter mit Python
Behandle Excel mit Python
Ohmsches Gesetz mit Python
Primzahlbeurteilung mit Python
Führen Sie Blender mit Python aus
Löse Mathe mit Python
Python ab Windows 7