English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 (во время отправки письма замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если будет установлено, что содержимое нарушило права на интеллектуальную собственность, сайт немедленно удаляет спорное содержимое.