Más contenido relacionado
La actualidad más candente (20)
Similar a 3分でサーバオペレーションコマンドを作る技術 (20)
3分でサーバオペレーションコマンドを作る技術
- 3. お前誰?
> Kei IWASAKI
> twitter: @laugh_k
> Github: laughk
> GMO Pepabo, Inc.
> 技術部インフラグループ
> System Administrator
> PyConJP 初参加!
- 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. ライブラリとしてのfabric
> 便利なAPI
> run ... シェルコマンド実行
> sudo ... sudo 付きでシェルコマンド実行
> put ... リモートホストにファイルを置く
> get ... リモートホストからファイルを取ってくる
> put, get には use_sudo オプションあり
> などなど
- 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:
- 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. ライブラリとしての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()
...
- 40. 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()
- 41. Click
> 例. サブコマンド 実行結果
$ python cli.py sub1 laughk
sub1: Hello laughk
$ python cli.py sub2 -N laughk
sub2: Hello laughk
- 42. 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.
- 45. 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()
- 46. 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:
- 49. fabricとClick
> 補足
> click は先に setup.py を書いておくと開発しやすいし
各種環境への配布も楽
> 業務に便利なコマンドは踏み台サーバにインストールし
ておくと布教しやすいのでオススメ
> 詳細な使い方はそれぞれの公式ドキュメントが情報豊富
> fabric http://docs.fabfile.org/
> Click http://click.pocoo.org