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 *
# Пользователь для входа и hôст
env.user = 'root'
# Если не установлено, fabric запросит ввод при необходимости входа
env.password = 'youpassword'
# Если есть несколько hôстей, 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)
 # Загрузка supervisor конфигурационного файла из подкаталога 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)
 # Переładка конфигурационных файлов 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("****Успешно перезапущен 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, затем pull下来, затем выполнить тестовые тесты и затем перезапустить apache2. В первый раз может быть проще, но будет продолжено улучшение.

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Контент предоставлен пользователями Интернета, автоматически загружен, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите спорное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если будет установлено, что содержимое нарушило права на интеллектуальную собственность, сайт немедленно удаляет спорное содержимое.

Основной учебник
Рекомендуем к просмотру