Utilisez des scripts personnalisés Python avec StackStorm

Python est disponible en tant que script personnalisé pour l'action StackStorm.

Ici, jetons un coup d'œil au flux et à l'utilisation des scripts Python avec StackStorm.

Composants du script python

Il y a les deux suivants.

Si vous souhaitez utiliser un fichier de configuration statique, utilisez un autre fichier de configuration.

Flux pour bouger

Ce sera le flux.

Exécutez en fait le script Python en tant qu'action

À partir de là, voyons le déroulement de l'exécution réelle du script python en tant qu'action. On suppose que la certification a été effectuée à l'avance. Voici un exemple d'authentification avec st2admin / st2admin.

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

Créez les scripts et fichiers de configuration nécessaires

Comme mentionné ci-dessus, vous devez créer deux fichiers. Les deux doivent être sous / opt / stackstorm / packs / <nom du pack> / actions /. Ici, créez-le avec le nom du pack test.

metadata

Je pense que cela se voit assez facilement. ʻEntry_point écrit le chemin relatif de / opt / stackstorm / packs / / actions`.

/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"

script python

Puisque ce script est appelé depuis StackStorm, il existe une méthode elle-même, mais il semble bon de penser que la méthode run sera appelée à la fin [^ 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)

Je passe config dans le constructeur, qui fonctionne avec le fichier de configuration que je présenterai ensuite.

fichier de configuration

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


test_param1: "static_param1"

Si vous mettez config.yaml directement sous <nom du pack>, la valeur de réglage qui y est écrite sera lue dans l'objet appelé config par le constructeur lorsque le script python est exécuté [^ 2 ].

Créer un environnement d'exécution python sur StackStorm

Maintenant, je voudrais m'inscrire auprès de StackStorm et l'exécuter ... mais même si je m'enregistre et l'exécute tel quel, une erreur se produira. (L'enregistrement réussit, mais l'exécution entraîne une erreur)

Tout d'abord, pour enregistrer toutes les actions, exécutez la commande st2ctl reload --register-actions. C'est une commande qui relira tous les paramètres sous / opt / stackstorm / <nom du pack>.

$ 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

Il est en fait enregistré.

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

Maintenant, si vous essayez d'exécuter ..., une erreur se produira.

$ 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)
"

Il y a un message au milieu, mais cela signifie qu'il n'y a pas d'environnement d'exécution pour python dans le pack appelé test. Il semble que l'environnement d'exécution est divisé pour chaque pack par virtualenv. Donc, si vous divisez correctement le pack, il semble que vous puissiez éviter d'encombrer l'environnement d'exécution.

Maintenant, créons l'environnement en fonction du message. Il dit "appuyez sur la commande comme ceci" avec précaution, alors exécutez-la exactement telle quelle.

$ 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: ''

Tous sont INFO et DEBUG, donc il ne semble y avoir aucun problème. Comme vous pouvez le voir dans le dernier message, il y a un environnement python dans / opt / stackstorm / virtualenvs / test.

Exécution de l'action (exécution du script Python)

Maintenant que l'enregistrement lui-même est terminé, essayons à nouveau.

$ 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

    '

Comme mentionné ci-dessus, ce qui est produit par «print» est stocké dans «stdout», et ce qui est retourné par «return» est stocké dans «result».

Résumé

Donc, c'est facile, mais j'ai vu le flux d'exécution de scripts python. Il peut y avoir quelques composants, mais il semble que vous puissiez exécuter python en tant que flux de travail très facilement.

D'autres choses qui m'intéressaient

Que se passe-t-il si je modifie l'action et la recharge pendant que l'action est en cours d'exécution?

Cela n'a pas aidé. Ce qui n'est pas interrompu ou déplacé continuera à se déplacer. Les modifications seront reflétées à partir de la prochaine exécution. Par conséquent, il semble qu'il n'y a pas lieu de s'inquiéter d'arrêter ceux qui existent et qui fonctionnent.

Quand avez-vous besoin de recharger?

Il est temps de modifier YAML (métadonnées). Si vous modifiez simplement le script python, vous n'avez pas besoin de recharger.

Que faire si je supprime le fichier et le recharge?

Cela n'a pas aidé. Vous pouvez utiliser la commande st2ctl reload --register-actions pour refléter quelque chose qui n'a jamais existé auparavant, Au contraire, même si vous supprimez le fichier et exécutez la commande ci-dessus, il ne sera pas supprimé. (L'action reste enregistrée) Par conséquent, si vous souhaitez l'effacer, vous devez l'effacer explicitement comme suit.

st2 action delete test.python-test

Quels paramètres peuvent être utilisés autres que l'argument?

Quand il s'agit de scripts Python, il semble que vous ne pouvez fondamentalement que les ajouter explicitement aux arguments ou les lire à partir des variables d'environnement [^ 3].

Quel type d'argument peut être utilisé?

Il semble qu'il y ait diverses choses sous le dictionnaire sous la forme de {{action_context}} [^ 4]. Par exemple, WebHook est l'utilisateur et Workflow est l'ID de l'action parent. Cependant, je ne l'ai pas essayé.

Recommended Posts

Utilisez des scripts personnalisés Python avec StackStorm
Étapes pour développer Django avec VSCode
Utilisez des scripts personnalisés Python avec StackStorm
[GUI avec Python] PyQt5-Widget personnalisé-
[Azure] Hit Custom Vision Service avec Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Pyinstaller transforme les scripts Python en .exes qui peuvent être exécutés sous Windows
Vérifier automatiquement les scripts Python avec GitHub + Travis-CI + pycodestyle
Communication série avec Python
Zip, décompressez avec python
Django 1.11 a démarré avec Python3.6
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Apprendre Python avec ChemTHEATER 03
Recherche séquentielle avec Python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python
Utiliser mecab avec Python 3
[Python] Redirection avec CGIHTTPServer
Utiliser Kinesis avec Python
Premiers pas avec Python
Utiliser DynamoDB avec Python
Getter Zundko avec python
Gérez Excel avec python
Loi d'Ohm avec Python
Jugement des nombres premiers avec python
Exécutez Blender avec python
Résoudre des maths avec Python
Python à partir de Windows 7