SlideShare a Scribd company logo
意識の低い自動化 
すごいshellscript
定型作業を 
自動化する話
自動化してますか 
日々発生する定型作業 
3回以上同じ事を手でやりたくない 
• アプリケーションのデプロイ 
• サーバの設定 
• ダンプファイルの作成 
• ゴミファイルの削除 
• etc, etc…
我々には自動化ツールがある 
その他いろいろ
我々には自動化ツールがある 
学習コストが高い 
変化が激しすぎる 
その他いろいろ
学習コストが高い 
手でやれば2分で終わることを 
自動化するのに 
2分以上 
学習コストをかけたくない 
新しいツールをいろいろインストールしないといけないとか 
新しい言語/DSLを覚えないといけないとか 
新しい概念を覚えないといけないとか(kitchen? playbook?) 
面白いし興味深いけどやりたいことはそれじゃない
変化が激しすぎる 
chef-soloユーザのみなさん、 
chef-zeroへの移行は順調ですか 
我々は自動化して楽したいのであって 
自動化スクリプトのメンテをしたいわけではにぃ 
来年も再来年もノーメンテで自動化スクリプトを使いたい
結果、こうなるじゃろ
学習コストが少なく 
十分に枯れた 
自動化ツールが 
どこかにないものか 
意識が低くても使える自動化ツールが欲しい
ある
Shell script
Shell script
自動化ツールとしてのShell script 
一応考えてみよう 
利点 
• 学習コストがほぼゼロ 
• デプロイ先サーバへのインストール不要 
• なんでもできる 
• これ以上無いくらい枯れている 
欠点 
• 記述が煩雑すぎる 
• エラー処理に弱い 
• 冪等性を保証しづらい 
• ちょっと複雑なことをしようとすると 
誰も読めないスクリプトができあがる
比較 
シェルスクリプトchef / puppet / 
capistorano等 
文法シェルコマンド 
そのまま独自文法(DSL) 
記述の簡潔さ煩雑簡潔 
エラー処理弱いできる 
冪等性弱いできる 
対象サーバでの 
事前準備不要ツールによる 
枯れ具合ほぼノーメンテツールによっては 
頻繁なメンテが必要
比較 
シェルスクリプトchef / puppet / 
これが欲しい 
capistorano等理想のツール 
文法シェルコマンド 
そのまま独自文法(DSL) シェルスクリプト 
そのまま 
記述の簡潔さ煩雑簡潔簡潔 
エラー処理弱いできるできる 
冪等性弱いできるできる 
対象サーバでの 
事前準備不要ツールによる不要 
枯れ具合ほぼノーメンテツールによっては 
頻繁なメンテが必要ほぼノーメンテ
デプロイ先サーバでの事前準備が不要で 
学習コストがシェルスクリプト並に低く 
メンテナンスしやすい簡潔な記述ができ 
エラーを柔軟に処理できて 
冪等性も担保できちゃったりする 
枯れた自動化ツールがどこかにないものか
ある
Pythonic remote execution Fabric 
http://www.fabfile.org/
Fabricとは 
• Python製の自動化ツール 
• シェルスクリプトをベースに記述 
• シンプルなコマンド体系 
• 柔軟な例外処理 
• 冪等性もあるよ
1分で覚えるFabricスクリプトの書き方 
• run(<shellscript>) 
引数に渡したシェルスクリプトを実行 
def uname():! 
run('uname -s')! 
• sudo(<shellscript>) 
引数に渡したシェルスクリプトをsudoをつけて実行 
def update_packages():! 
sudo(‘apt-get update') 
• local(<shellscript>) 
引数に渡したシェルスクリプトを手元で実行 
def uname():! 
local('uname -s')
1分で覚える 
Fabricスクリプトの書き方 
• Pythonの関数名がそのままタスク名になる 
• 書いたスクリプトは 
fabfile.pyという名前で保存する 
• fab -H <server address> <task name> で実行
1分で覚える 
Fabricスクリプトの書き方 
fabfile.py 
from fabric.api import run! 
! 
def uname():! 
run('uname -s')! 
$ fab -H localhost,192.168.33.10 uname 
↑を実行するとlocalhostと192.168.33.10に対して 
uname -sが実行され、その結果が表示される
例外処理 
シェルから返ってきた値をもとにハンドリングできる 
例: 
ユニットテストに失敗したら警告を出して 
続行するかどうか確認 
def test():! 
with settings(warn_only=True):! 
result = local('./manage.py test my_app', capture=True)! 
if result.failed 
! ! and not confirm("Tests failed. Continue anyway?"):! 
abort("Aborting at user request.")!
冪等性 
ここでは以下のようなことを冪等性と呼ぶことにする 
(異論は認める) 
• パッケージがインストールされているか調べ 
入っていなければインストール 
• ファイルが存在するかどうか調べ 
存在しなければ作成 
• ファイル内に特定の文字列があるか調べ 
なければ追記 
• etc, etc…
冪等性 
シェルスクリプトだけでも一応できる(はず) 
例: 
パッケージがインストールされているか調べ 
入っていなければインストール 
def setup_package(package = "apache2"):! 
! if run("dpkg -s %s | grep 'Status:' ; true" % 
! (package)).find("installed") == -1:! 
sudo("aptitude install '%s'" % (package)) 
ここでtrueを返すのがポイント☆ミ
意識の低い自動化
シェルスクリプトだけでは辛すぎるので 
fabricのアドオンを使おう
Cuisine Chef-like functionality for Fabric 
https://github.com/sebastien/cuisine
Cuisineで冪等性を担保 
パッケージ・ファイル・ディレクトリ・ユーザ等 
必要そうな諸々について冪等性を担保する 
APIを提供してくれるアドオン 
例: 
パッケージがインストールされているか調べ 
入っていなければインストール 
def setup_package(package = “apache2"):! 
package_ensure("%s" % (package))
Cuisineで冪等性を担保 
特にドキュメント等はないが 
APIの命名規則はシンプルなので困ることはないと思う 
APIの一覧が見たければIPythonのコマンド補完で見よう 
APIの例: 
cuisine.package_ensure()! 
cuisine.file_ensure()! 
cuisine.user_ensure()
枯れ具合 
Python界隈なので、破壊的変更には慎重な文化 
たぶんPython2.7のサポートが切れる2020年まで 
ノーメンテで使える
まとめ
おさらい 
シェルスクリプトchef / puppet / 
capistorano等fabric 
文法シェルコマンド 
そのまま独自文法(DSL) シェルスクリプト 
そのまま 
記述の簡潔さ煩雑簡潔簡潔 
エラー処理弱いできるできる 
冪等性弱いできるできる 
対象サーバでの 
事前準備不要ツールによる不要 
枯れ具合ほぼノーメンテツールによっては 
頻繁なメンテが必要ほぼノーメンテ
まとめ 
• Fabricをつかうと簡単に 
定型処理をスクリプト化できるよ 
• シェルスクリプトベースだから 
覚えやすいよ 
• 例外処理や冪等性もあるよ 
• 枯れているよ
まとめ 
• 意識レベルを低く保ったまま 
• 定型作業を自動化して 
• 寝る時間を確保しましょう 
• Try Fabric!
補足
怠惰なfabfileのつくりかた 
必要になってからつくる 
• 2回までは手作業でやる 
• 3回目をやる前に、historyファイルを開いて 
実行したコマンド一覧を書き出す 
• fabfileに書き写す 
• おしまい
Q. 
Capistoranoとの違いは? 
A. 
だいたい一緒なのでは 
Fabric capistorano 
文法シェルスクリプトベース独自文法(DSL) 
記述の簡潔さ簡潔簡潔 
エラー処理できるできる 
冪等性Cuisineを使えばない
世界的にはFabricのほうが使われているらしい
Q. 
fabfileが肥大化するのでは? 
A. 
その通り。 
肥大化を防ぐために、 
ある程度の大きさになったら 
Pythonパッケージとして 
分割するべき。
Q. 
並列実行できる? 
A. 
できる。 
最大同時接続数も制限できる。
Q. 
対応しているPythonのバージョンは? 
A. 
2.5-2.7。

More Related Content

意識の低い自動化