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

Beispiel für die Verwendung des Automatisierungswerkzeugs Fabric für die Verwaltung und Bereitstellung von Python-Projekten

Fabric ist ein hervorragendes Werkzeug für die automatisierte Verwaltung und Deployment-Entwicklung mit Python, das über SSH mit Remote-Servern interagieren kann, z.B. lokale Dateien auf den Server zu übertragen oder Shell-Befehle auf dem Server auszuführen.

下面给出一个自动化部署 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 = '"/Zuhause/python/django_app'
  # Wenn das Verzeichnis nicht existiert, wird es erstellt
  run('mkdir -p '%s' % remote_dist_dir)
 # Der Befehl cd wechselt den Arbeitsverzeichnis des Remote-Rechners zu einem bestimmten Verzeichnis 
  with cd(remote_dist_dir):
    print('Datei auspacken in das Verzeichnis: %s' % remote_dist_dir)
    run('tar -xzvf '%s' % remote_tmp_tar)
    print('Abhängigkeitspakete aus requirements.txt installieren')
    # Ich verwende python3 um zu entwickeln
    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-Datei %s hochladen' % 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-Konfigurationsdatei %s hochladen' % nginx_file)
    put(nginx_file, remote_nginx_file)
 # Hochladen der supervisor-Konfigurationsdatei aus dem Unterverzeichnis deploy im aktuellen Verzeichnis auf den Server
  supervisor_file = 'deploy/django_app.ini'
  remote_supervisor_file = '/etc/supervisord.d/django_app.ini'
  print('Supervisor-Konfigurationsdatei %s hochladen' % supervisor_file)
  put(supervisor_file, remote_supervisor_file)
 # Laden der nginx-Konfigurationsdatei neu
  run('nginx -s reload')
  run('nginx -t')
  # Entfernen der lokalen gepackten Datei
  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 to the server to perform the following operations)
  with cd("/var/www/××××××):
    #print run("pwd")
    print green("****Code will be downloaded from the remote repository)
    run("git checkout dev")
    get_git_status()
    run("git pull origin dev")
    print green("****Unit tests will be run on the server)
    server_unit_test()
    run("service apache2 restart", pty=False)
    print green("****Restart apache2Success)
    print green("********Code deployment successful********)
def deploy():
  get_git_status()
  local("git checkout dev", capture=False)
  print green("****Switch to dev branch)
  get_git_status()
  print green("****Unit tests will begin to run
  local_unit_test()
  print green("****Unit tests completed, start uploading code)
  upload_code()
  deploy_at_server()

fabric can固化automated deployment or multi-machine operation commands into a script, thereby reducing manual operations. This is the first time I have written something after contacting this thing today, and it is indeed very practical. Run fab deploy.

The main logic is to run unit tests on the local dev branch, then submit to the server, log in to the server via ssh, then pull down, and then run unit tests, and then restart apache2. This may be relatively simple on the first try, and will be continuously improved.

Declaration: The content of this article is from the network, the copyright belongs to the original author, the content is contributed and uploaded by Internet users spontaneously, this website does not own the copyright, does not undergo artificial editing, and does not assume relevant legal responsibility. If you find content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (Please replace # with @ when sending an email to report, and provide relevant evidence. Once verified, this site will immediately delete the content suspected of infringement.)

Gefällt mir