• 意識の低い自動化 すごい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()
 引数に渡したシェルスクリプトを実行
 def uname():! run('uname -s')! • sudo()
 引数に渡したシェルスクリプトをsudoをつけて実行
 def update_packages():! sudo(‘apt-get update') • local()
 引数に渡したシェルスクリプトを手元で実行
 def uname():! local('uname -s')
  • • Pythonの関数名がそのままタスク名になる • 書いたスクリプトは
 fabfile.pyという名前で保存する • fab -H で実行 1分で覚える
 Fabricスクリプトの書き方
  • 1分で覚える
 Fabricスクリプトの書き方 from fabric.api import run! ! def uname():! run('uname -s')! fabfile.py $ 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の命名規則はシンプルなので困ることはないと思う cuisine.package_ensure()! cuisine.file_ensure()! cuisine.user_ensure() APIの例: APIの一覧が見たければIPythonのコマンド補完で見よう
  • 枯れ具合 Python界隈なので、破壊的変更には慎重な文化 たぶんPython2.7のサポートが切れる2020年まで ノーメンテで使える
  • まとめ
  • おさらい シェルスクリプト chef / puppet / capistorano等 fabric 文法 シェルコマンド
そのまま 独自文法(DSL) シェルスクリプト 
 そのまま 記述の簡潔さ 煩雑 簡潔 簡潔 エラー処理 弱い できる できる 冪等性 弱い できる できる 対象サーバでの
 事前準備 不要 ツールによる 不要 枯れ具合 ほぼノーメンテ ツールによっては 頻繁なメンテが必要 ほぼノーメンテ
  • まとめ • Fabricをつかうと簡単に
 定型処理をスクリプト化できるよ • シェルスクリプトベースだから
 覚えやすいよ • 例外処理や冪等性もあるよ • 枯れているよ
  • まとめ • 意識レベルを低く保ったまま • 定型作業を自動化して • 寝る時間を確保しましょう • Try Fabric!
  • 補足
  • • 2回までは手作業でやる • 3回目をやる前に、historyファイルを開いて
 実行したコマンド一覧を書き出す • fabfileに書き写す • おしまい 必要になってからつくる 怠惰なfabfileのつくりかた
  • Q. 
 Capistoranoとの違いは? A. 
 だいたい一緒なのでは Fabric capistorano 文法 シェルスクリプトベース 独自文法(DSL) 記述の簡潔さ 簡潔 簡潔 エラー処理 できる できる 冪等性 Cuisineを使えば ない
  • 世界的にはFabricのほうが使われているらしい
  • Q. 
 fabfileが肥大化するのでは? A. 
 その通り。 肥大化を防ぐために、 ある程度の大きさになったら Pythonパッケージとして 分割するべき。
  • Q. 
 並列実行できる? A. 
 できる。 最大同時接続数も制限できる。
  • Q. 
 対応しているPythonのバージョンは? A. 
 2.5-2.7。
Please download to view
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
...

意識の低い自動化

by greenasparagus

on

Report

Category:

Engineering

Download: 0

Comment: 0

45,514

views

Comments

Description

意識を低く保ったまま、定型作業を自動化する話です。
※どうも言葉足らずで誤解させてしまっているようなので補足を書きました。ご覧ください http://qiita.com/greenspa/items/fff535d2ae5da36e36fe
Download 意識の低い自動化

Transcript

  • 意識の低い自動化 すごい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()
 引数に渡したシェルスクリプトを実行
 def uname():! run('uname -s')! • sudo()
 引数に渡したシェルスクリプトをsudoをつけて実行
 def update_packages():! sudo(‘apt-get update') • local()
 引数に渡したシェルスクリプトを手元で実行
 def uname():! local('uname -s')
  • • Pythonの関数名がそのままタスク名になる • 書いたスクリプトは
 fabfile.pyという名前で保存する • fab -H で実行 1分で覚える
 Fabricスクリプトの書き方
  • 1分で覚える
 Fabricスクリプトの書き方 from fabric.api import run! ! def uname():! run('uname -s')! fabfile.py $ 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の命名規則はシンプルなので困ることはないと思う cuisine.package_ensure()! cuisine.file_ensure()! cuisine.user_ensure() APIの例: APIの一覧が見たければIPythonのコマンド補完で見よう
  • 枯れ具合 Python界隈なので、破壊的変更には慎重な文化 たぶんPython2.7のサポートが切れる2020年まで ノーメンテで使える
  • まとめ
  • おさらい シェルスクリプト chef / puppet / capistorano等 fabric 文法 シェルコマンド
そのまま 独自文法(DSL) シェルスクリプト 
 そのまま 記述の簡潔さ 煩雑 簡潔 簡潔 エラー処理 弱い できる できる 冪等性 弱い できる できる 対象サーバでの
 事前準備 不要 ツールによる 不要 枯れ具合 ほぼノーメンテ ツールによっては 頻繁なメンテが必要 ほぼノーメンテ
  • まとめ • Fabricをつかうと簡単に
 定型処理をスクリプト化できるよ • シェルスクリプトベースだから
 覚えやすいよ • 例外処理や冪等性もあるよ • 枯れているよ
  • まとめ • 意識レベルを低く保ったまま • 定型作業を自動化して • 寝る時間を確保しましょう • Try Fabric!
  • 補足
  • • 2回までは手作業でやる • 3回目をやる前に、historyファイルを開いて
 実行したコマンド一覧を書き出す • fabfileに書き写す • おしまい 必要になってからつくる 怠惰なfabfileのつくりかた
  • Q. 
 Capistoranoとの違いは? A. 
 だいたい一緒なのでは Fabric capistorano 文法 シェルスクリプトベース 独自文法(DSL) 記述の簡潔さ 簡潔 簡潔 エラー処理 できる できる 冪等性 Cuisineを使えば ない
  • 世界的にはFabricのほうが使われているらしい
  • Q. 
 fabfileが肥大化するのでは? A. 
 その通り。 肥大化を防ぐために、 ある程度の大きさになったら Pythonパッケージとして 分割するべき。
  • Q. 
 並列実行できる? A. 
 できる。 最大同時接続数も制限できる。
  • Q. 
 対応しているPythonのバージョンは? A. 
 2.5-2.7。
Fly UP