遠隔配置ツールFabric詳細(Python 3対応)


前言
もしあなたが「Fabric」のキーワードを検索したら、90%の資料は全部時代遅れです。今はFabricはPython 3を支持していますが、旧版Fabricに対応していません。ですから、それらの教程に従って操作したら全然だめです。
もしファブリックを使ったことがないなら、この文章はすぐにファブリックを上手にしてくれます。今使ってもいいですか?先に調べても大丈夫です。
普段の開発プロセスはこのようにして、数ヶ月の奮闘を経て、プロジェクトはついに開発されました。テストも大丈夫です。コードをGitHubのような委託管理プラットフォームに提出して、正式な環境に配置するつもりです。慎重に正式サーバにログインして、プロジェクトディレクトリに入り、コードをリモート倉庫からおろして、プログラムを起動します。後には毎回新しい機能が発行されます。或いは、小さなBugを修正した時に、繰り返しの操作を実行して、サーバーに登録して、指定されたディレクトリに切り替えて、コードを引き出して、サービスを再開します。
実はこのような操作はとても複雑で、技術的な内容もあまりなくて、問題も出やすくて、ファブリックが登場しました。Fabricはリモートに神器を配置し、リモートサーバのコマンドをローカルに実行することができます。
どうしますか?簡単です。いくつかのステップだけです。
ファブリックの取り付け

$ pip install fabric --upgrade
なお、もしインストールされているのが旧版のFabricであれば、新版のFabricは旧版に対応していません。現在はFabricには3つのバージョンがあります。Fabric 1は以前のFabricです。Python 2だけサポートしています。Fabric 2は現在のFabricです。Python 2とPython 3をサポートしています。旧版のFabric 1からクローンされた非公式バージョンですが、Fabric 1に対応し、Python 2とPython 3もサポートされています。
最新のFabfile.pyファイルは必要ないです。fab命令も必要ないです。今はほとんどの教程、資料はfabric 1に基づいて書いています。これらの教程を見ている時、選別に注意してください。新版のFabricが提供するAPIはとても簡単です。
コマンドを実行
まず例を見てください。次は配置台本です。

# deploy.py
# 1.         
# 2.       
# 3.              

from fabric import Connection

def main():
  # ip       
  #         ssh     ,     connect_kwargs       。
  c = Connection("[email protected]", connect_kwargs={"password": "youpassword"})

  with c.cd('/var/www/youproject'):
    c.run("git pull origin master")
    c.run("/usr/bin/supervisorctl -c ../supervisor/supervisord.conf restart youproject")

if __name__ == '__main__':
  main()
実行

python deploy.py
実行が完了したら、最新コードは正式な環境に配置されてサービスを再開しました。とても便利ですか?お母さんはもう心配しないでください。
FabricはLinuxだけではなく、Windowsプラットフォームでもよく実行されています。中小プロジェクトでは、非常に良好なオペレーティングツールです。
接続を構築する

class Connection(Context):
  host = None
  user = None
  port = None
  ssh_config = None
  connect_timeout = None
  connect_kwargs = None
  ...
Connectionオブジェクトを構築する方法は違っています。例えば、hostを「host」と書いてもいいです。[email protected]:22「3つのパラメータとして書き分けてもいいです。connect_.kwargsは辞書の対象で、サーバーの登録パスワードや鍵は通常記入します。
ファイルをアップロード
runメソッドはコマンドを実行するために使用され、cdは指定されたディレクトリに入り、putメソッドはファイルをアップロードするために使用されます。

from fabric import Connection
c = Connection('web1')
c.put('myfiles.tgz', '/opt/mydata')
c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')
複数のサーバ
複数のサーバでコマンドを実行する場合、簡単な方法は反復を使用して、サーバごとにコマンドを実行することです。

# web1,web2,mac1         ,     ip  
>>> from fabric import Connection
>>> for host in ('web1', 'web2', 'mac1'):
>>>   result = Connection(host).run('uname -s')
...   print("{}: {}".format(host, result.stdout.strip()))
...
web1: Linux
web2: Linux
mac1: Darwin
またはSerialGroupを使用します。

from fabric import SerialGroup as Group
pool = Group('web1', 'web2', 'web3', connect_kwargs={"password": "youpassword"} )
pool.put('myfiles.tgz', '/opt/mydata')
pool.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')
Group(*hosts、**kwargs)パラメータの説明:
  • *hosts:複数のホスト名またはIP
  • に入ることができます。
  • **kwargs受信したパラメータはConnectionと同じようにパスワード
  • を指定できます。
    この文章は終わりました。ゲットしましたか?
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。