CodeZine(コードジン)

特集ページ一覧

StackStormで始める運用自動化 ~入門編~

StackStorm入門(1)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

ワークフローを記述する

 本編の最後にワークフロー(Workflow)の設定について解説します。

 内部アーキテクチャの節で、アクションは1つの目的に特化したプログラムコードで、ワークフローはそれらを組み合わせたものだと解説しました。通常、運用を自動化しようとした場合、ある入力イベントに対して1つのアクションの実行で済むということはありません。

 例えば、DMM.comラボの場合仮想基盤にVMWareを使い、リソース管理にRacktablesを使っています。また、タスクやドキュメント管理にはAtlassianのソリューションを使っているほか、LBやネットワーク機器など、さまざまな機器・サービスを跨いだ運用を日々行っています。

 StackStormのワークフローは、こうしたさまざまなサービスに対するアクションを組み合わせて実行させることで、一連の運用作業を自動化させることができます。さらに、入力やアクションの結果に応じて処理の流れを制御させることで、より柔軟なワークフローを定義することができます。

ワークフローの記述

 StackStormはワークフローの記述に2つの方法を提供しています。1つは、シンプルなワークフローを簡単に記述できるStackStormのワークフローサービスActionChainを利用する方法。もう一つは、より複雑で柔軟なワークフローを記述できるOpenStackのワークフローサービスMistralを利用する方法です。

 ここでは前者のActionChainを利用します。なお、作成するワークフローのソースコードは以下のリポジトリで公開しています。

 例として、以下に示すようなVMを作成してからプロビジョニングを行い、サービスインするまでのワークフローを記述します。

ワークフロー(setup-vm)の例
ワークフロー(setup-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

 引数で指定したnameipaddrdomainは、メタデータファイルで記述したワークフローに渡すパラメータになります。ここで指定しなかったパラメータは、メタデータファイルの定義に沿ってデフォルトの値が内部で設定されます。これらの値はワークフロー内部のアクションで参照されます。以下は上記コマンドの実行結果になります。

ワークフローの実行結果
ワークフローの実行結果

 4つのアクション(create-vmprovision-vmregister-dnsregister-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-dnsclear-vmが実行され、それぞれ正常終了したことが確認できました。

 このように、ワークフローを用いることで複数のアクションを組み合わせた複雑な処理を記述することができます。また、各アクションの実行結果に応じて柔軟にフローを制御できることも確認できました。

 さらに、先述のトリガと紐付けるルールを記述することで、こうした処理をイベントドリブンに行うこともできるようになります。

おわりに

 StackStormと本稿の内容によって読者の皆さんの運用環境の自動化のお役に立てれば幸いです。

 次回は、より本格的にStackStormを使う方向けに機能拡張と運用のポイントについて解説します。お楽しみに。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:StackStorm入門

著者プロフィール

  • 大山 裕泰(株式会社DMM.comラボ)(オオヤマ ヒロヤス)

    DMM.com ラボ所属ソフトウェアエンジニア。アリエル・ネットワーク株式会社、グリー株式会社を経て現在に至る。最近は主にインフラ基盤の構築、運用、機能開発を行う。共著書に「次世代ネットワーク制御技術 OpenFlow入門」がある。

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5