Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

3分でサーバオペレーションコマンドを作る技術

11,513 views

Published on

#pyconjp 2015 の LTで発表した際に利用した資料です
https://pycon.jp/2015/ja/schedule/presentation/93/

Published in: Technology
  • Be the first to comment

3分でサーバオペレーションコマンドを作る技術

  1. 1. GMO Pepabo, Inc. Kei IWASAKI 2015/10/10 PyConJP 2015 Lightning Talks 3分で サーバオペレーションコマンドを作る技術
  2. 2. お前誰?
  3. 3. お前誰? > Kei IWASAKI > twitter: @laugh_k > Github: laughk > GMO Pepabo, Inc. > 技術部インフラグループ > System Administrator > PyConJP 初参加!
  4. 4. 3分で
  5. 5. サーバオペレーション コマンドを作る技術
  6. 6. サーバオペレーションコマンド is 何?
  7. 7. Web系インフラエンジニアが 日々のサーバオペレーションを 楽にするためのコマンドラインツール
  8. 8. とりわけ
  9. 9. SSHで1台ずつログインをして 複数サーバに同様のコマンドを叩く たんぽぽワークを楽にする コマンドラインツール
  10. 10. という前提で お話させていただきます
  11. 11. 紹介するライブラリ
  12. 12. fabric と Click
  13. 13. ライブラリとしての fabric
  14. 14. ライブラリとしてのfabric > fabric とは > python製デプロイツールでお馴染み > pythonでデプロイに必要なSSH越しのジョ ブを定義できる
  15. 15. ライブラリとしてのfabric > こんな感じで fabfile.py を用意して from fabric.api import run def ping(): run('uname -n')
  16. 16. ライブラリとしてのfabric > fabコマンド経由でジョブを実行できる $ fab -f fabfile.py ping -H hoge1.example.com,hoge2.example.com [hoge1.example.com] Executing task 'ping' [hoge1.example.com] run: uname -n [hoge1.example.com] Login password for 'vagrant': [hoge1.example.com] out: hoge1.example.com [hoge1.example.com] out: [hoge2.example.com] Executing task 'ping' [hoge2.example.com] run: uname -n [hoge2.example.com] out: hoge2.example.com [hoge2.example.com] out: Done. Disconnecting from hoge1.example.com... done. Disconnecting from hoge2.example.com... done.
  17. 17. ライブラリとしてのfabric > 便利なAPI > run ... シェルコマンド実行 > sudo ... sudo 付きでシェルコマンド実行 > put ... リモートホストにファイルを置く > get ... リモートホストからファイルを取ってくる > put, get には use_sudo オプションあり > などなど
  18. 18. 便利ですね!
  19. 19. ライブラリとして利用すると 作り込む時にすごく ります
  20. 20. ライブラリ としての利用で使うもの
  21. 21. fabric.api.execute
  22. 22. ライブラリとしてのfabric > executeを使うと何ができるか? > ざっくり言うと > python のコードから > と同じことができるよ! $ fab -f fabfile.py <jobname> -H <hostname>
  23. 23. ライブラリとしてのfabric > こんな感じ > sample.py from fabric.api import run, execute def ping(): run('uname -n’) if __name__ == ‘__main__': execute(ping, hosts=[ 'hoge1.example.com', 'hoeg2.example.com' ])
  24. 24. ライブラリとしてのfabric > 実行 $ python sample.py [hoge1.example.com] Executing task 'ping' [hoge1.example.com] run: uname -n [hoge1.example.com] Login password for 'vagrant': [hoge1.example.com] out: hoge1.example.com [hoge1.example.com] out: [hoge2.example.com] Executing task 'ping' [hoge2.example.com] run: uname -n [hoge2.example.com] out: hoge2.example.com [hoge2.example.com] out:
  25. 25. python スクリプトとして 完結させられる
  26. 26. ということは
  27. 27. fabコマンドを意識しない 自分の業務に特化した スクリプトも作れる
  28. 28. ライブラリとしてのfabric > 例えばこんな fabfile.py from fabric.api import sudo def show_httpd_log(): sudo('tail -10000 /var/log/httpd/access_log') def show_db_slowlog_count(): sudo('tail -100000 /var/lib/mysql/slow.log > /tmp/fab-slow.log') sudo('mysqldumpslow -c /tmp/fab-slow.log') sudo('rm -fv /tmp/fab-slow.log')
  29. 29. ライブラリとしてのfabric > 例えばこんな感じでスクリプト化 import argparse from fabric.api import run, sudo, execute def show_httpd_log(): sudo('tail -10000 /var/log/httpd/access_log’) def show_db_slowlog_count(): sudo('tail -100000 /var/lib/mysql/slow.log > /tmp/fab-slow.log') sudo('mysqldumpslow -c /tmp/fab-slow.log') sudo('rm /tmp/fab-slow.log') if __name__ == '__main__': parser = argparse.ArgumentParser() ...
  30. 30. pythonで コマンドラインツールを作るなら
  31. 31. argparse の出番!
  32. 32. ではあるけれど なかなか扱いが大変
  33. 33. つらい
  34. 34. オプションが増えたり サブコマンドを生やすと コードの可読性を保つのがしんどい
  35. 35. Python mini hack-a-thon にて
  36. 36. “–Thanks!! @shimizukawa 「ClickっていうCLIのフレームワークがあるよ」
  37. 37. Click
  38. 38. Click > CLIツールを作るためのフレームワーク > デコレータでオプションやパラメータと実際に処理を行う 関数をいい感じに紐付けられる > いい感じにhelpメッセージを出してくれる > bash-completion の自動生成が可能 > オプションやサブコマンドと関数の関係がわかりやすい > などなど
  39. 39. Click > 例. サブコマンド import click @click.group() def main(): pass @click.command() @click.argument('name') def sub1(name): click.echo('sub1: Hello {0}'.format(name)) @click.command() @click.option('-N','--name') def sub2(name): click.echo('sub2: Hello {0}'.format(name)) main.add_command(sub1) main.add_command(sub2) if __name__ == '__main__': main()
  40. 40. Click > 例. サブコマンド 実行結果 $ python cli.py sub1 laughk sub1: Hello laughk $ python cli.py sub2 -N laughk sub2: Hello laughk
  41. 41. Click > 例. サブコマンド 実行結果 $ python cli.py Usage: cli.py [OPTIONS] COMMAND [ARGS]... Options: --help Show this message and exit. Commands: sub1 sub2 $ python cli.py sub1 --help Usage: cli.py sub1 [OPTIONS] NAME Options: --help Show this message and exit. $ python cli.py sub2 --help Usage: cli.py sub2 [OPTIONS] Options: -N, --name TEXT --help Show this message and exit.
  42. 42. 便利ですね!!
  43. 43. fabric と Click を 組み合わせてみる
  44. 44. fabricとClick > コードはこんな感じ (nginx.py として作成 ) import click from fabric.api import sudo, execute, env def _show_access_log(): sudo('tail -10 /var/log/nginx/munin-access.log') @click.group() def main(): pass @click.command('access_log') def show_access_log(): execute(_show_access_log) main.add_command(show_access_log) if __name__ == '__main__': env.hosts = [ 'hoge1.example.com', 'hoge2.example.com' ] main()
  45. 45. fabricとClick > 結果 $ python nginx.py access_log [hoge1.example.com] Executing task '_show_access_log' [hoge1.example.com] sudo: tail -10 /var/log/nginx/munin-access.log [hoge1.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET / HTTP/1.1" 200 2006 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge1.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/style-new.css HTTP/1.1" 200 4049 "http://10.0.12.23/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge1.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/logo-h.png HTTP/1.1" 200 1399 "http://10.0.12.23/static/style- new.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/ 32.0.1948.69" [hoge1.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/favicon.ico HTTP/1.1" 200 2046 "http://10.0.12.23/" "Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge1.example.com] out: [hoge2.example.com] Executing task '_show_access_log' [hoge2.example.com] sudo: tail -10 /var/log/nginx/munin-access.log [hoge2.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET / HTTP/1.1" 200 2006 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge2.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/style-new.css HTTP/1.1" 200 4049 "http://10.0.12.23/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge2.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/logo-h.png HTTP/1.1" 200 1399 "http://10.0.12.23/static/style- new.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/ 32.0.1948.69" [hoge2.example.com] out: 10.0.12.40 - - [10/Oct/2015:01:53:45 +0900] "GET /static/favicon.ico HTTP/1.1" 200 2046 "http://10.0.12.23/" "Mozilla/ 5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36 OPR/32.0.1948.69" [hoge2.example.com] out:
  46. 46. 便利ですね!!1
  47. 47. 補足
  48. 48. fabricとClick > 補足 > click は先に setup.py を書いておくと開発しやすいし 各種環境への配布も楽 > 業務に便利なコマンドは踏み台サーバにインストールし ておくと布教しやすいのでオススメ > 詳細な使い方はそれぞれの公式ドキュメントが情報豊富 > fabric http://docs.fabfile.org/ > Click http://click.pocoo.org
  49. 49. まとめ
  50. 50. まとめ > SSH 経由のオペレーションは fabric > コマンドラインツールとしての機能は Click > fabric Click の組み合わせはお手軽で非常にオススメ
  51. 51. Let's Try! pip install fabric pip install Click

×