python fabric使用

5521 ワード

さぎょう
強力なツール
導入やマルチマシン操作を自動化するコマンドを1つのスクリプトに固化できます.
いくつかのメンテナンスツールに似ています.主にPythonのためです.
簡単で使いやすい
もちろん、shellは各種命令を組み合わせてもいいですが、上古神器と現代兵器の違いは
環境設定
本機と対象機器に対応パッケージを取り付ける(注意、いずれもあります)
sudo easy_install fabric

現在は1.6バージョン(またはpip install、同じ)
インストールが完了したら、インストールに成功したかどうかを確認できます.
[ken@~$] which fab
/usr/local/bin/fab

インストールが完了したら、公式ドキュメントを参照できます.
それから、手を出してもいいです.
hello world
先進的な行本機は簡単に操作して、1つの初歩的な認識があって、例の出所と公式サイト
新しいpyスクリプト:fabfile.py
def hello():
    print("Hello world!")

コマンドラインの実行:
[ken@~/tmp/fab$] fab hello
Hello world!

Done.

ここではfabfileをファイル名として使用する必要はありませんが、実行時にファイルを指定する必要があります.
[ken@~/tmp/fab$] mv fabfile.py test.py
fabfile.py -> test.py
[ken@~/tmp/fab$] fab hello

Fatal error: Couldn't find any fabfiles!

Remember that -f can be used to specify fabfile path, and use -h for help.

Aborting.
[ken@~/tmp/fab$] fab -f test.py hello
Hello world!

Done.

パラメータ付き:
fabfile.を修正するpyスクリプト:
def hello(name, value):
    print("%s = %s!" % (name, value))

実行
[ken@~/tmp/fab$] fab hello:name=age,value=20
age = 20!

Done.
[ken@~/tmp/fab$] fab hello:age,20
age = 20!

Done.

ネイティブ操作の実行
簡単なローカル操作:
from fabric.api import local

def lsfab():
    local('cd ~/tmp/fab')
    local('ls')

結果:
[ken@~/tmp/fab$] pwd;ls
/Users/ken/tmp/fab
fabfile.py   fabfile.pyc  test.py      test.pyc
[ken@~/tmp/fab$] fab -f test.py lsfab
[localhost] local: cd ~/tmp/fab
[localhost] local: ls
fabfile.py  fabfile.pyc test.py     test.pyc

Done.

実戦開始:
毎日プロファイルを提出するとします.pyからバージョンライブラリへ(競合は考慮されていません)
手動操作の場合:
cd /home/project/test/conf/
git add settings.py
git commit -m 'daily update settings.py'
git pull origin
git push origin

つまり、これらの命令は毎日手動で叩かなければなりません.daily jobとは、毎日繰り返される機械的な仕事です.fabricでどのようにワンタッチで解決するかを見てみましょう:(実際にはshellスクリプトで直接解決できますが、fabの優位性はここではありません.ここではメインビットの後ろにローカル+リモート操作を準備しています.結局、2つの場所の操作はスクリプトを書くのがメンテナンスしやすいです)
from fabric.api import local

def setting_ci():
    local("cd /home/project/test/conf/")
    local("git add settings.py")
    #     ,    …..

混在統合リモート・オペレーション
このとき、マシンAの/home/ken/project対応プロジェクトディレクトリにプロファイルを更新するとします.
#!/usr/bin/env python
# encoding: utf-8

from fabric.api import local,cd,run

env.hosts=['user@ip:port',] #ssh      
env.password = 'pwd'


def setting_ci():
    local('echo "add and commit settings in local"')
    #         ,   

def update_setting_remote():
    print "remote update"
    with cd('~/temp'):   #cd        
        run('ls -l | wc -l')  #     run

def update():
    setting_ci()
    update_setting_remote()

次に、以下を実行します.
[ken@~/tmp/fab$] fab -f deploy.py update
[user@ip:port] Executing task 'update'
[localhost] local: echo "add and commit settings in local"
add and commit settings in local
remote update
[user@ip:port] run: ls -l | wc -l
[user@ip:port] out: 12
[user@ip:port] out:


Done.

envを宣言しない場合は注意してください.passwordは、対応するマシンに実行するとパスワードの入力を要求するインタラクションから飛び出します
マルチサーバ混在
複数のサーバを操作するには、複数のhostを構成する必要があります.
#!/usr/bin/env python
# encoding: utf-8

from fabric.api import *

#              ,           
env.roledefs = {
            'testserver': ['user1@host1:port1',],  
            'realserver': ['user2@host2:port2', ]
            }

#env.password = '          ,           ,        。    ssh   '

@roles('testserver')
def task1():
    run('ls -l | wc -l')

@roles('realserver')
def task2():
    run('ls ~/temp/ | wc -l')

def dotask():
    execute(task1)
    execute(task2)

結果:
[ken@~/tmp/fab$] fab -f mult.py dotask
[user1@host1:port1] Executing task 'task1'
[user1@host1:port1] run: ls -l | wc -l
[user1@host1:port1] out: 9
[user1@host1:port1] out:

[user2@host2:port2] Executing task 'task2'
[user2@host2:port2] run: ls ~/temp/ | wc -l
[user2@host2:port2] out: 11
[user2@host2:port2] out:


Done.

拡張
1.色
色を印刷することができ、操作結果情報を表示する際により目立つし便利です.
from fabric.colors import *

def show():
    print green('success')
    print red('fail')
    print yellow('yellow')
#fab -f color.py show

2.エラーと例外
エラー処理について
デフォルトでは、前のコマンドの実行に失敗した後、次のコマンドのセットは実行されません.
失敗した後も、異なる処理、ドキュメントを行うことができます.
今のところ使っていないので,後で使ってみた.
3.パスワード管理
文書を読む
より良いパスワード管理方式、兄は比較的に土で、通じていないで、主にサーバーのリストの変化が頻繁で、私の処理方式は:
1.host,user,port,password構成リスト、すべて1つのファイルに書きます
あるいは直接シナリオの中に入って、もちろんこれは更に......
env.hosts = [
'host1',
'host2']env.passwords = { 'host1': "pwdofhost1",'host2': "pwdofhost2",}
または
 
env.roledefs = {'testserver': ['host1', 'host2'],'realserver': ['host3', ]}env.passwords = {'host1': "pwdofhost1",'host2': "pwdofhost2",'host3': "pwdofhost3", } 
2.keyからmapネストに解析し、deployに入れる
またコマンドは実はcmdsリストに固化することもできます.....
初略でこれらを使って、后でもっと需要がある时にまたドキュメントをすくい取りに行って、ドキュメントの中で良いものが本当に多くて、多すぎて、见てめまいがします.の
The end!