ワークフローを記述する
本編の最後にワークフロー(Workflow)の設定について解説します。
内部アーキテクチャの節で、アクションは1つの目的に特化したプログラムコードで、ワークフローはそれらを組み合わせたものだと解説しました。通常、運用を自動化しようとした場合、ある入力イベントに対して1つのアクションの実行で済むということはありません。
例えば、DMM.comラボの場合仮想基盤にVMWareを使い、リソース管理にRacktablesを使っています。また、タスクやドキュメント管理にはAtlassianのソリューションを使っているほか、LBやネットワーク機器など、さまざまな機器・サービスを跨いだ運用を日々行っています。
StackStormのワークフローは、こうしたさまざまなサービスに対するアクションを組み合わせて実行させることで、一連の運用作業を自動化させることができます。さらに、入力やアクションの結果に応じて処理の流れを制御させることで、より柔軟なワークフローを定義することができます。
ワークフローの記述
StackStormはワークフローの記述に2つの方法を提供しています。1つは、シンプルなワークフローを簡単に記述できるStackStormのワークフローサービスActionChainを利用する方法。もう一つは、より複雑で柔軟なワークフローを記述できるOpenStackのワークフローサービスMistralを利用する方法です。
ここでは前者のActionChainを利用します。なお、作成するワークフローのソースコードは以下のリポジトリで公開しています。
例として、以下に示すようなVMを作成してからプロビジョニングを行い、サービスインするまでのワークフローを記述します。
ユーザは、具体的な処理のフローを定義するActionChain定義ファイルと、ActionChainに渡すパラメータなどを設定するメタデータファイルの2つを記述します。
以下は、上記のワークフローを実現する定義ファイルとメタデータファイルになります。
### ワークフローのメタデータファイル
---
name: "setup_vm"
description: "An example to automate VM setup operation"
runner_type: "action-chain"
enabled: true
entry_point: "workflows/setup_vm.yaml"
parameters:
name:
type: "string"
required: true
ipaddr:
type: "string"
default: ""
domain:
type: "string"
default: "dmm.local"
vcpu:
type: "integer"
default: 1
ram:
type: "integer"
default: 1 # [GB]
storage:
type: "integer"
default: 100 # [GB]
### ワークフローの定義ファイル
---
default: create-vm
chain:
- name: create-vm
ref: core.local
parameters:
cmd: "echo '[create-vm] {{name}}'"
on-success: provision-vm
- name: provision-vm
ref: core.local
parameters:
cmd: "echo '[provision-vm] {{action_context}}'"
on-success: register-dns
on-failure: unregister-dns
- name: register-dns
ref: core.local
parameters:
cmd: "echo '[register-dns] {{name}}'"
on-success: register-lb
on-failure: unregister-dns
- name: register-lb
ref: core.local
parameters:
cmd: "echo '[register-lb] {{name}}'"
on-failure: unregister-dns
- name: unregister-dns
ref: core.local
parameters:
cmd: "echo '[unregister-dns] {{name}}'"
on-success: clear-vm
- name: clear-vm
ref: core.local
parameters:
cmd: "echo '[clear-vm] {{name}}'"
上記のように、それぞれYAML形式で記述します。メタデータファイルでは、ワークフローの定義ファイルのパスentry_pointと、ワークフローに渡すパラメータparametersを規定しています。
また、定義ファイルでは、図に示した流れでアクションを実行する設定を記述しています。各アクションのon-successパラメータは、実行したアクションが正常終了した場合に実行する次のアクションを指し、on-failureパラメータは逆に異常終了した場合に実行する次のアクションを指します。正常終了/異常終了の判定は、StackStormのアクションの実行環境(ActionRunner)ごとに異なりますが、ここで指定しているアクションcore.localの場合は、コマンドの終了ステータスコード(0が返ってきた場合には正常終了、それ以外は異常終了)で判定します。
なお、ここでは各アクションの実行コマンドはそれぞれ、何も実行しないで正常終了するダミーコマンドを用います。
動かしてみる
それでは、上記のワークフローを実際に動かしてみます。作成したワークフロー定義ファイル、およびメタデータファイルをStackStormに登録し、ワークフロー中で実行するダミーのコマンドをシステムにデプロイします。
冒頭で示したサンプルのリポジトリに、これらの操作を行うMakefileを記述しましたので、これを実行します。
vagrant@st2-node:~$ git clone https://github.com/userlocalhost2000/st2-workflow-example.git vagrant@st2-node:~$ cd st2-workflow-example/ vagrant@st2-node:~/st2-workflow-example$ make
それではワークフローdefault.setup-vmを実行します。適当なトリガと紐付けたルールを作成し、イベントを発生させるでもよいですが、面倒なので以下のようにst2runコマンドでワークフロー単体実行させます。
$ st2 run default.setup_vm name=hoge ipaddr=192.168.1.10 domain=st2.dmm.local
引数で指定したname、ipaddr、domainは、メタデータファイルで記述したワークフローに渡すパラメータになります。ここで指定しなかったパラメータは、メタデータファイルの定義に沿ってデフォルトの値が内部で設定されます。これらの値はワークフロー内部のアクションで参照されます。以下は上記コマンドの実行結果になります。
4つのアクション(create-vm、provision-vm、register-dns、register-lb)が実行され、それぞれ正常終了したことが確認できます。
ここでアクションregister-lbで実行するコマンド/usr/local/bin/register-lbが異常終了するよう、以下の修正を行います。
--- usr/local/bin/register-lb 2016-11-29 10:19:15.443999545 +0000 +++ /usr/local/bin/register-lb 2016-11-29 10:18:42.183376547 +0000 @@ -1 +1,3 @@ #!/bin/sh + +exit 1
そして、先ほどと同様にワークフローdefault.setup_vmを実行してください。
register-lbが失敗した結果、unregister-dnsとclear-vmが実行され、それぞれ正常終了したことが確認できました。
このように、ワークフローを用いることで複数のアクションを組み合わせた複雑な処理を記述することができます。また、各アクションの実行結果に応じて柔軟にフローを制御できることも確認できました。
さらに、先述のトリガと紐付けるルールを記述することで、こうした処理をイベントドリブンに行うこともできるようになります。
おわりに
StackStormと本稿の内容によって読者の皆さんの運用環境の自動化のお役に立てれば幸いです。
次回は、より本格的にStackStormを使う方向けに機能拡張と運用のポイントについて解説します。お楽しみに。
