Upgrade to Pro — share decks privately, control downloads, hide ads and more …

明日からできる、st2のActionのつくりかた

 明日からできる、st2のActionのつくりかた

TechNight Shiodome #8 で発表したやつ。

Wataru Manji

May 29, 2018
Tweet

More Decks by Wataru Manji

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前: 萬治 渉 (マンジ ワタル) • 所属: ◦

    NTTテクノクロス株式会社 IoTイノベーション事業部 ◦ 日本StackStormユーザ会 • 仕事: ◦ OpenStack基盤の設計、運用、保守 ◦ StackStorm関係色々 ◦ その他AnsibleとかNWとか色々 • 連絡先: • Twitter: @_manji0 • Mail: [email protected]
  2. Action作成のノウハウはいっぱいある • Action入出力を定義する方法 • ActionのPythonコードの記述方法 • etc ◦ Workflow内で扱いやすいActionの入出力とは ◦

    Actionの適切な粒度とは ◦ Actionコードの形式別の記述方法 ◦ 開発中Actionのテスト方法 ◦ ... おおまかな勉強順序
  3. その中で今回話すこと • Action入出力を定義する方法 ◦ 入力: ActionのMetadataについて ◦ 出力: Actionの出力形式、および構造化データの扱いについて •

    ActionのPythonコードの記述方法 ◦ 基本的な形式と要素の解説 • etcは話す時間が無いのでまたいつか
  4. チョット分かるActionの構造 metadata ・Actionコードの形式、path ・入力の定義 Actionコード ・実行内容の記述 ・return値の定義 st2 ・metadataに書かれた 情報の管理

    ・実行リクエストの解釈 metadataで指定された Action-Codeを 指定された入力で起動 実行結果をst2にreturn 事前にst2へActionの 情報を渡す
  5. それぞれ、どこで定義しているの? • 入力: metadata内 ◦ metadata内での定義記述箇所 ◦ 指定できるオプション • 出力:

    Actionコード内 ◦ st2の出力定義 ◦ Actionコード内での出力方法 ◦ 構造化データの取り扱い 順番に解説。
  6. 入力の定義: metadata.parameters • metadata: ActionやWorkflowの名前、コード位置や入力を定義するファイル • parametersセクションで入力を定義する ◦ 入力の名前 ◦

    入力値の型 ◦ 入力値の初期値 ◦ 入力の必須/任意の選択 ◦ etc... • metadataで定義していない入力は基本的に使うことができない (やり方はあるが、今回は解説しない)
  7. metadata.parametersの記述方法(基本) # 前略 parameters: hostname: type: string required: true hoge:

    type: string ... • YAMLの辞書形式で書いていく • ここでは、”hostname”と”hoge”の2つの 入力を定義している • “type”の指定は必須! • “required”はオプション。 trueは「起動時の入力を必須とする」 という意味。 required以外のオプションについては後述。
  8. 個々のparameterに指定できるオプションたち • required ◦ Action起動時にその入力値が指定されていない場合、エラーを出すことができる ◦ デフォルトはFalse • description ◦

    その入力の役割、意味などを自由に記述することができる。あった方が親切 • default ◦ 入力の初期値を設定できる ◦ requiredと組み合わせることもできるが、意味が無くなる • enum ◦ 入力値を選択式にする • immutable ◦ 入力値をユーザから入力できないようにする ◦ defaultとセットで使うのが基本 • position ◦ 入力の順序を定義する
  9. 出力II: 構造化データの取り扱い • Pythonで実装する場合 ◦ result以下に構造化データを出力することができる ◦ dictをそのまま渡せばOK ◦ ネストしててもリストが混ざってても

    OK ◦ 型も保持される • それ以外で実装する場合 ◦ stdoutにJSON or YAMLのStringで出力する ◦ 別途Jinja Filterで構造化データに変換することで、後続 Actionなどで利用可能
  10. 出力I&II: Pythonでの出力方法 def run(self, **kwargs): sys.stdout.write(“ok”) ← stdout sys.stderr.write(“error”) ←

    stderr return (True, {“fuga”: “111”, “list”: [1, 2, 3]}) ↑return (status, result) True → succeeded False → failed status: succeeded exit_code: 0 result: fuga: “111” list: - 1 - 2 - 3 stdout: “ok” stderr: “error”
  11. Pythonでの書き方 from st2common.runners.base_action import Action class TestAction(Action): def run(self, arg1,

    arg2, **kwargs): # なんらかの処理 return (True, result) 特別な理由が無い限り、とりあえず書く
  12. Pythonでの書き方 from st2common.runners.base_action import Action class TestAction(Action): def run(self, arg1,

    arg2, **kwargs): # なんらかの処理 return (True, result) 名前は自由だが、Action名と対応が 取れるのが望ましい
  13. Pythonでの書き方 from st2common.runners.base_action import Action class TestAction(Action): def run(self, arg1,

    arg2, **kwargs): # なんらかの処理 return (True, result) st2は自動的にrunメソッドを実行するので、必須。 (同クラス内に、runから呼ばれるメソッドを独自に書いても OK)
  14. Pythonでの書き方 from st2common.runners.base_action import Action class TestAction(Action): def run(self, arg1,

    arg2, **kwargs): # なんらかの処理 return (True, result) 引数(入力)はmetadata.parametersで設定したものが名前付き で渡されるので、列挙してもいいし dictで拾ってもよい
  15. Pythonでの書き方 from st2common.runners.base_action import Action class TestAction(Action): def run(self, arg1,

    arg2, **kwargs): # なんらかの処理 return (True, result) • 何もreturnしない場合 ◦ status = succeededになる ◦ resultは空になる(None) • Trueだけ返した場合: 同上 • タプルを返した場合 ◦ 1つ目のBoolがActionの実行成否になる ◦ 2つ目のデータがそのまま resultに入る
  16. 応用: exit_codeを定義する from st2common.runners.base_action import Action class TestAction(Action): def run(self,

    arg1, arg2, **kwargs): # なんらかの処理 if hoge is None: sys.stderr.write(‘hoge err’) exit(2) exit(exit_code)で定義することが可能 status: failed --- exit_code: 2 result: None stdout: “” stderr: “hoge err” exit_code != 0の場合、 Actionは失敗する