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.
Il y a les deux suivants.
Si vous souhaitez utiliser un fichier de configuration statique, utilisez un autre fichier de configuration.
Ce sera le flux.
À 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)
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 /
/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"
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.
/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 ].
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
.
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».
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.
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.
Il est temps de modifier YAML (métadonnées). Si vous modifiez simplement le script python, vous n'avez pas besoin de recharger.
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
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].
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