Skip to content

Instantly share code, notes, and snippets.

@key-amb
Last active August 29, 2015 14:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save key-amb/80fee9c2d0489719c707 to your computer and use it in GitHub Desktop.
Save key-amb/80fee9c2d0489719c707 to your computer and use it in GitHub Desktop.
すべての"作業手順書"をDSL化してSCMに放り込みたい

すべての"作業手順書"をDSL化してSCMに放り込みたい

DSL化したい作業の例

  • アプリケーションのローリングアップデートのため、サービスアウトしてほげほげして確認してサービスイン
# コマンドイメージ
lb-cli del web01 # LBからノードを切り離す
tail /path/to/accesslog # サービスアウト確認
update app  # アプリケーションアップデート
restart app # アプリケーション再起動
check app --version # アプリケーションのバージョン確認
lb-cli add web01 # LBにノード追加
tail /path/to/accesslog # アクセスログ確認
: # 次のノードに続く
  • 構成管理ツールでコード化されてないサーバ構築手順。
# イメージ
wget http://example.com/path/to/package.tar.gz
tar xvzf package
cd package
configure --prefix=/opt/package
make; make install
/opt/package/bin/app --version # 動くかチェック

DSL化すると何がうれしいか

  • 類似作業をやるとき、コードを再利用できる
  • SCMにノウハウが溜まっていく。検索できるよ。
    • 手順書とっておけばいいけど、コードのほうが再利用性高そうな気がする。
    • そもそも手順書とっておかなかったら(略)

なぜDSLなのか

シェルスクリプトでもいいじゃん、という想定質問に対して。

たぶんちょっと複雑なことをしようとするとシェルだとハードルがあることがあるのではないか。
DSLにして関数化したり、外部ライブラリの力を借りた方がハードルが下がるのではないか、と思ったので。

例えば、以下のようなケース:

  • コケたら先に進んでほしくないとき、シェルだと終了コードを調べてアボートしたりしないといけない。(set -eしとけやというのはあるが、それだけで済まないことはありそう)
  • アクセスログ確認して異常がないか確かめたり、アクセス止まってることを確認したり

DSL化の要件

  • NOT (以下のようであってはいけない)
    • 「DSLめんどいしよくわからないから、直接シェルコマンド叩いた方が速い」
    • 「DSL中で何やってるかよくわからない」

DSL化方法の案

  • Rake が一番筋がいいのではないか
    • Rakefile に書く
    • 作業単位でディレクトリ切ってもいい
    • Ruby の場合、specinfra と infrataster というライブラリがあって、サーバの状態・振る舞いをテストできるので、「ほげほげした後 xxx を確認したい」というときに使えるのではないか
    • なんかこういうことク社さんやってそう。もっと別のやり方かもしれないけど
    • (追記) capistrano もアリかもという示唆を頂きました。コメント参照。Ruby 詳しくないので、まだあまり比較検討できてない。
  • make はちょっと。。
  • オレオレDSLもちょっと。。
  • たぶん次点候補はシェルスクリプトべた書き
    • これでもだいたいやりたいことはできるとは思うけど、たぶん「めんどいし、直接サーバ上で作業した方が速い」になりそう

いつやるの?

今でしょ。

何かで試したい。

@key-amb
Copy link
Author

key-amb commented Apr 22, 2015

Twitter でコメントもらいました。
niku4i++

@key_amb capistrano3のrun_locallyが参考になるかも。capのDSLのas :adminでsudoできたり、within: 'dir' でcdできたり便利ですね

— Nobuhiro Nikushi (@niku4i) 2015, 4月 22
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

@key_amb 実装のdispatch先はこの辺ですねえ https://t.co/ytfYD6cNNx

— Nobuhiro Nikushi (@niku4i) 2015, 4月 22
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment