Python自動化配置ツールFabricの簡単なマニュアル


FabricはSSHプロトコルに基づくPythonツールであり、従来のssh/scp方式に比べてPythonの構文で管理コマンドを書くと読みやすくなり、拡張しやすくなります。
公式サイトのアドレス:http://fabfile.org
インストール
python、pip管理ツールのインストールプロセスを省略します。

pip install fabric
インストールが成功したか確認します。
python編集モードに入り、コードを入力し、間違いなくインストール成功を表します。

from fabric.api import local
fabric版ハローワールド
fabricのデフォルトファイルfabfile.pyはもちろん、この名前を使いたくないなら、−fパラメータを追加する必要があります。
fabfile.pyファイルを作成します。

vim fabrile.py
コードを編集

#coding:utf-8
from fabric.api import local#
def hello():
   # local          
   local('echo "hello wolrd!"')
実行コード

fab hello
実行できるジョブはfab-lで確認できます。現在はハロー関数です。
実行結果

[localhost] local: echo "hello world!"
hello world!
Done.
伝統的なメンテナンス方法:

$ ssh x.x.x.x 'uname -a' --    
Fabricの例:

$ cat fabfile.py

from fabric.api import run
def uname():
  run('uname -a')

$ fab -H x.x.x.x uname --    
肉眼で直接見ると、コードはssh方式より多く書かれているようですが、ssh方式に基づいて中間制御可能な部分が少ないです。例えば、あるサービスが起動したかどうかを判断したいです。起動していない場合は起動するなどの操作が行われます。ssh命令式のやり方はやや面倒です。もちろん汚いです。操作された機械にスクリプトを書いて、このスクリプトを使います。
いくつかのファブリックの長所を話しましょう。
  • キャラクター定義
  • コードは読みやすいです。
  • はローカル、遠隔操作をカプセル化しました。
  • パラメータが柔軟である(Host/roleを動的に指定するなど、multiprocessingに基づく同時実行を行う)
  • 完全ログ出力
  • これらを羅列して、実は日常の仕事の中で大体似たような包装があって、しかし既成の1つの熟しているツールがあって、何をして使いますか?でしょう。
    よく使う設定:
  • env.host           -- ホストip、もちろん-Hパラメータ指定
  • も可能です。
  • env.password       -- パスワード、通路を作ったら無視してください。
  • env.roledefs       -- キャラクターグループは、例えば:''web':''x'、''y'、'db':''''z''s
  • fab-l             -- 利用可能なtask(コマンド)を表示します。
  • fab-H             -- ホストを指定して、マルチホストカンマをサポートして
  • に別れます。
  • fab-R             -- roleを指定して、複数の
  • をサポートします。
  • fab-P             -- 併発数は、デフォルトはシリアル
  • です。
  • fab-w             -- warn_オンリー、デフォルトは異常に直接abortから
  • を終了します。
  • fab-f             -- エントランスファイルを指定します。fabのデフォルトのエントランスファイルはfabfile/fabfile.py
  • です。
    もっと参考してください。fab--help
    一般的な関数:
  • local('pwd')                     -- ローカルコマンドを実行する
  • lcd('/tmp')                      -- ローカルディレクトリ
  • を切り替えます。
  • cd('/tmp')                       -- リモートディレクトリ
  • を切り替えます。
  • run('uname-a')                  -- リモートコマンドを実行する
  • sudo('/etc/init.d/inx start')  -- リモートsudoを実行します。ptyオプション
  • に注意してください。
     例1:リモートnginxサービスの管理
    
    $ cat fabfile.py
    
    
    from fabric.api import *
    @task
    def nginx_start():
      ''' nginx start '''
    sudo('/etc/init.d/nginx start')
    
    @task
    def nginx_stop():
      ''' nginx stop '''
      sudo('/etc/init.d/nginx stop')
    
    
       
    
    $ fab --list   --       
    Available commands:
    
      nginx_start nginx start 
      nginx_stop  nginx stop
    
    $ fab -H x.x.x.x nginx_start --    nginx
    
    
    例2:キャラクターベース
    
    $ cat fabfile.py
    
    
    from fabric.api import *
    env.roledefs = {'nginx': ['x.x.x.x', 'y.y.y.y'], 'mysql': 'z.z.z.z'}
    @task
    def mysql_start()
      ''' mysql start '''
      sudo('/etc/init.d/mysql start')
    
       
    
    $ fab --list   --       
    Available commands:
    
      nginx_start nginx start 
      nginx_stop  nginx stop
      mysql_start mysql start
    
    $ fab -R nginx nginx_start --    nginx
    $ fab -R mysql mysql_start --    mysql
    
    
    例3:ローカルとリモートの混在動作
    
    $ cat fabfile
    
    
    def hello():
      ''' test hello '''
      with lcd('/tmp'): #     /tmp    
        local('svn co http://xxx xxx') # check      
        local('tar czf xxx.tar.gz xxx/') #      
        put('xxx.tar.gz', '/tmp') #          /tmp    
      with cd('/tmp'):  #       /tmp   
        run('tar zxf xxx.tar.gz') #     
    
    全部地元のように見えますか?でしょう。
    例4:複数のターゲットサーバ
    同じパスワードまたは手動入力:
    
    env.hosts = ['root@ip1:22',root@ip2:22]
    
    パスワードが違います。あるいは手動で入力したくないです。
    
    #coding:utf-8
    from fabric.api import local,cd,put,lcd,env,run,execute,roles
    env.roledefs = {
     'role1':['root@ip1:22',],
     'role2':['root@ip2:22',]
    }
    env.passwords={
     'root@ip1:22':'pwd1',
     'root@ip2:22':'pwd2'
    }
    @roles('role1')
    def role1():
     with cd('/tmp'):
       run('ls -l')
    @roles('role2')
    def role2():
     with cd('/tmp'):
       run('ls')
    def task():
     execute(role1)
     execute(role2)