English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Pythonの自動化運用とデプロイプロジェクトツールFabricの使用例

FabricはPythonで開発された自動化運用とデプロイプロジェクトの優れたツールであり、SSHを使用してリモートサーバーと自動的に交互を行うことができます。例えば、ローカルファイルをサーバーに転送したり、サーバー上でshellコマンドを実行します。

以下は Django プロジェクトの自動化デプロイの例を示します

# -*- coding: utf-8 -*-
# ファイル名は fabfile.py として保存する必要があります
from __future__ import unicode_literals
from fabric.api import *
# ログインユーザーとホスト名:
env.user = 'root'
# 設定されていない場合、fabricはログインが必要なときにパスワードを入力を促します
env.password = 'youpassword'
# 複数のホストがある場合、fabricは自動的に順次デプロイを行います
env.hosts = ['www.example.com']
TAR_FILE_NAME = 'deploy.tar.gz'
def pack():
  ""
  packタスクを定義し、tarパックを作成します
  :return:
  ""
  tar_files = ['*.py', 'static/*', 'templates/*', 'vue_app/",*/*.py', 'requirements.txt']
  exclude_files = ['fabfile.py', 'deploy/*",*.tar.gz', '.DS_Store', '"*/.DS_Store',
           '*/.*.py', '__pycache__/*']
  exclude_files = ['--exclude=\'%s\'' % t for t in exclude_files]
  local('rm -f %s' % TAR_FILE_NAME)
  local('tar -czvf %s %s %s' % (TAR_FILE_NAME, ' '.join(exclude_files), ' '.join(tar_files)))
  print('現在のディレクトリにパックファイルを作成します: %s' % TAR_FILE_NAME)
def deploy():
  ""
  デプロイタスクを定義します
  :return:
  ""
  # まずパックを行います
  pack()
  # リモートサーバーの一時ファイル
  remote_tmp_tar = '"/tmp/%s' % TAR_FILE_NAME
  run('rm -f %s' % remote_tmp_tar)
  # tarファイルをリモートサーバーにアップロード, local_path, remote_path
  put(TAR_FILE_NAME, remote_tmp_tar)
  # 解凍
  remote_dist_base_dir = '"/ホーム/python/django_app'
  # 存在しない場合、フォルダーを作成
  run('mkdir -p %s' % remote_dist_dir)
 # cdコマンドでリモートホストの作業ディレクトリを指定ディレクトリに切り替え 
  with cd(remote_dist_dir):
    print('ファイルを以下のディレクトリに展開: %s' % remote_dist_dir)
    run('tar -xzvf %s' % remote_tmp_tar)
    print('requirements.txtに記載された依存パッケージをインストール')
    # 使用しているのはpython3 開発に使用
    run('pip3 install -r requirements.txt')
    remote_settings_file = '%s/django_app/settings.py' % remote_dist_dir
    settings_file = 'deploy/settings.py' % name
    print('settings.pyファイル%sをアップロード' % settings_file)
    put(settings_file, remote_settings_file)
    nginx_file = 'deploy/django_app.conf'
    remote_nginx_file = '/etc/nginx/conf.d/django_app.conf'
    print('nginxの設定ファイル%sをアップロード' % nginx_file)
    put(nginx_file, remote_nginx_file)
 # 現在のディレクトリのサブディレクトリdeploy内のsupervisorの設定ファイルをサーバーにアップロード
  supervisor_file = 'deploy/django_app.ini'
  remote_supervisor_file = '/etc/supervisord.d/django_app.ini'
  print('supervisorの設定ファイル%sをアップロード' % supervisor_file)
  put(supervisor_file, remote_supervisor_file)
 # nginxの設定ファイルを再読み込み
  run('nginx -s reload')
  run('nginx -t')
  # 削除ローカルのパッケージファイル
  local('rm -f %s' % TAR_FILE_NAME)
  # 最新の設定ファイルを読み込み、既存のプロセスを停止し、新しい設定に基づいてすべてのプロセスを再起動します
  run('supervisorctl reload')
  # restart all、startまたはstop fabricを実行すると、エラーメッセージが表示され、実行が中止されます
  # しかし、サーバー上でログを確認すると、supervisorが再起動しています
  # run('supervisorctl restart all')

packタスクを実行します

fab pack

deployタスクを実行します

fab deploy

また、Fabricを使用したコードの自動デプロイについてご紹介します

#coding=utf-8
from fabric.api import local, abort, settings, env, cd, run
from fabric.colors import *
from fabric.contrib.console import confirm
env.hosts = ["[email protected].×××××"]
env.password = "×××××"
def get_git_status():
  git_status_result = local("git status", capture=True)
  if "無文件要提交,干净的工作区" not in git_status_result:
    print red("****現在のブランチには未コミットのファイルがあります)
    print git_status_result
    abort("****既に終了しました)
def local_unit_test():
  with settings(warn_only=True):
    test_result = local("python manage.py test")
    if test_result.failed:
      print test_result
      if not confirm(red("****ユニットテストに失敗しました。続行しますか?")):
        abort("****既に終了しました)
def server_unit_test():
  with settings(warn_only=True):
    test_result = run("python manage.py test")
    if test_result.failed:
      print test_result
      if not confirm(red("****ユニットテストに失敗しました。続行しますか?")):
        abort("****既に終了しました)
def upload_code():
  local("git push origin dev")
  print green("****コードアップロード成功()
def deploy_at_server():
  print green("****sshでサーバーにログインし、以下の操作を行います。
  with cd("/var/www/××××××):
    #print run("pwd")
    print green("****リモートリポジトリからコードをダウンロードします。
    run("git checkout dev")
    get_git_status()
    run("git pull origin dev")
    print green("****サーバー上でユニットテストを実行します。
    server_unit_test()
    run("service apache2 restart", pty=False)
    print green("****apacheを再起動します。2成功しました。
    print green("********コードデプロイメントが成功しました。********)
def deploy():
  get_git_status()
  local("git checkout dev", capture=False)
  print green("****devブランチに切り替えます。
  get_git_status()
  print green("****ユニットテストを開始します。
  local_unit_test()
  print green("****ユニットテストが完了したら、コードをアップロード開始します。
  upload_code()
  deploy_at_server()

fabricを使えば、自動化デプロイメントやマルチマシンの操作のコマンドをスクリプトにまとめることができ、手動の操作を減らすことができます。これは今日初めて触れたときに書いたもので、実際に非常に実用的です。fab deployを実行すれば良いです。

主なロジックは、ローカルのdevブランチでユニットテストを実行し、それをサーバーにアップロードして、sshでサーバーにログインし、それをプルしてユニットテストを実行し、apacheを再起動するというものです。2。初めて書いたものなので、簡単かもしれませんが、今後も改善を続けます。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人間による編集は行われていません。著作権侵害を疑う内容がある場合は、メールを送信して:notice#oldtoolbag.com(メールを送信する際には、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れた場合、このサイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ