Rumah pembangunan bahagian belakang Tutorial Python Python自动化运维和部署项目工具Fabric使用实例

Python自动化运维和部署项目工具Fabric使用实例

Feb 22, 2017 pm 04:56 PM

Fabric是一个Python库,只要目标机器支持ssh访问,就可以借助fabric来进行远程操作(如在host1上对host2远程运行shell命令),显然,由于fabric是个Python package,故其它Python package都可以被import到fabric特有的fabfile.py脚本中

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 = '/home/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')
Salin selepas log masuk

执行 pack 任务

fab pack<br/>

执行 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 = ["root@115.28.×××××"]
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("****重启apache2成功")
    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()
Salin selepas log masuk

fabric可以将自动化部署或者多机操作的命令固化到一个脚本里,从而减少手动的操作。上面是今天第一次接触这东西后写的,确实很实用。运行fab deploy就行了。

主要逻辑就是将本地的dev分支跑单元测试,然后提交到服务器,ssh登陆到服务器,然后pull下来,再跑单元测试,然后重启apache2。第一次写,可能比较简单,将持续改进。


更多Python自动化运维和部署项目工具Fabric使用实例相关文章请关注PHP中文网!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Bagaimana untuk menyelesaikan masalah kebenaran yang dihadapi semasa melihat versi Python di Terminal Linux? Apr 01, 2025 pm 05:09 PM

Penyelesaian kepada Isu Kebenaran Semasa Melihat Versi Python di Terminal Linux Apabila anda cuba melihat versi Python di Terminal Linux, masukkan Python ...

Bagaimana saya menggunakan sup yang indah untuk menghuraikan html? Bagaimana saya menggunakan sup yang indah untuk menghuraikan html? Mar 10, 2025 pm 06:54 PM

Artikel ini menerangkan cara menggunakan sup yang indah, perpustakaan python, untuk menghuraikan html. Ia memperincikan kaedah biasa seperti mencari (), find_all (), pilih (), dan get_text () untuk pengekstrakan data, pengendalian struktur dan kesilapan HTML yang pelbagai, dan alternatif (sel

Bagaimana untuk melakukan pembelajaran mendalam dengan Tensorflow atau Pytorch? Bagaimana untuk melakukan pembelajaran mendalam dengan Tensorflow atau Pytorch? Mar 10, 2025 pm 06:52 PM

Artikel ini membandingkan tensorflow dan pytorch untuk pembelajaran mendalam. Ia memperincikan langkah -langkah yang terlibat: penyediaan data, bangunan model, latihan, penilaian, dan penempatan. Perbezaan utama antara rangka kerja, terutamanya mengenai grap pengiraan

Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Bagaimana cara menyalin seluruh lajur satu data ke dalam data data lain dengan struktur yang berbeza di Python? Apr 01, 2025 pm 11:15 PM

Apabila menggunakan Perpustakaan Pandas Python, bagaimana untuk menyalin seluruh lajur antara dua data data dengan struktur yang berbeza adalah masalah biasa. Katakan kita mempunyai dua DAT ...

Bagaimana untuk membuat antara muka baris arahan (CLI) dengan python? Bagaimana untuk membuat antara muka baris arahan (CLI) dengan python? Mar 10, 2025 pm 06:48 PM

Artikel ini membimbing pemaju Python mengenai bangunan baris baris komando (CLI). Butirannya menggunakan perpustakaan seperti Typer, Klik, dan ArgParse, menekankan pengendalian input/output, dan mempromosikan corak reka bentuk mesra pengguna untuk kebolehgunaan CLI yang lebih baik.

Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Apakah beberapa perpustakaan Python yang popular dan kegunaan mereka? Mar 21, 2025 pm 06:46 PM

Artikel ini membincangkan perpustakaan Python yang popular seperti Numpy, Pandas, Matplotlib, Scikit-Learn, Tensorflow, Django, Flask, dan Permintaan, memperincikan kegunaan mereka dalam pengkomputeran saintifik, analisis data, visualisasi, pembelajaran mesin, pembangunan web, dan h

Terangkan tujuan persekitaran maya di Python. Terangkan tujuan persekitaran maya di Python. Mar 19, 2025 pm 02:27 PM

Artikel ini membincangkan peranan persekitaran maya di Python, memberi tumpuan kepada menguruskan kebergantungan projek dan mengelakkan konflik. Ia memperincikan penciptaan, pengaktifan, dan faedah mereka dalam meningkatkan pengurusan projek dan mengurangkan isu pergantungan.

Apakah ungkapan biasa? Apakah ungkapan biasa? Mar 20, 2025 pm 06:25 PM

Ekspresi biasa adalah alat yang berkuasa untuk memadankan corak dan manipulasi teks dalam pengaturcaraan, meningkatkan kecekapan dalam pemprosesan teks merentasi pelbagai aplikasi.

See all articles