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

مثال على استخدام أداة Fabric لتحويل وتوزيع مشاريع Python

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 package
  :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)
 # تحميل ملف تكوين supervisor في مجلد subdirectory deploy في الدليل الحالي
  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

تنفيذ مهمة 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("****إعادة تشغيل 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()

يمكن لـ fabric تضمين أوامر التكوين التلقائي أو العمليات المتعددة الأجهزة في سكربت واحد، مما يقلل من العمليات اليدوية. هذا هو ما كتبته لأول مرة اليوم بعد ملامسة هذا الشيء، وهو في الواقع مفيد جدًا. يمكنك تشغيل fab deploy فقط.

المنطق الرئيسي هو تشغيل فرع dev المحلي لاختبار الوحدات، ثم إرسالها إلى الخادم، تسجيل الدخول إلى الخادم باستخدام ssh، ثم سحبها، ثم تشغيل اختبار الوحدات مرة أخرى، ثم إعادة تشغيل apache2. في المرة الأولى، قد يكون الأمر بسيطًا، وسنستمر في تحسينه.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الملكية، ويتم توفير المحتوى من قبل المستخدمين عبر الإنترنت الذين يقدمون المساهمات بشكل تلقائي ويتم تحميلها، ولا يملك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية مرتبطة بذلك. إذا اكتشفتم محتوى يشتبه في انتهاك حقوق النسخ، فلا تترددوا في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وتقديم الدليل المتعلق، وسيتم حذف المحتوى المزعوم بشكل فوري إذا تم التحقق من صحة الشكوى.

مفضل لك