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

Esempio di utilizzo dello strumento di automazione e distribuzione dei progetti di运维 Python Fabric

Fabric è un ottimo strumento di automazione e distribuzione sviluppato in Python, che può interagire automaticamente con server remoti tramite SSH, ad esempio trasferire file locali sui server, eseguire comandi shell sui server.

Di seguito è riportato un esempio di部署 Django progetto automatizzato

# -*- coding: utf-8 -*-
# Il nome del file deve essere salvato come fabfile.py
from __future__ import unicode_literals
from fabric.api import *
# Utente di login e nome dell'host:
env.user = 'root'
# Se non è impostato, fabric richiede l'input durante il login
env.password = 'youpassword'
# Se ci sono più host, fabric si installa automaticamente in sequenza
env.hosts = ['www.example.com']
TAR_FILE_NAME = 'deploy.tar.gz'
def pack():
  """
  Definisci un compito di pacchetto, crea un pacchetto 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('Crea un file di pacchetto nella directory corrente: %s' % TAR_FILE_NAME)
def deploy():
  """
  Definisci un compito di distribuzione
  :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 中的依赖包')
    # Sto sviluppando utilizzando 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('Carica il file 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('Carica il file di configurazione nginx %s' % nginx_file)
    put(nginx_file, remote_nginx_file)
 # Carica il file di configurazione supervisor nella sottocartella 'deploy' del directory corrente
  supervisor_file = 'deploy/django_app.ini'
  remote_supervisor_file = '/etc/supervisord.d/django_app.ini'
  print('Carica il file di configurazione supervisor %s' % supervisor_file)
  put(supervisor_file, remote_supervisor_file)
 # Ricarica il file di configurazione di nginx
  run('nginx -s reload')
  run('nginx -t')
  # Elimina il file di pacchetto locale
  local('rm -f %s' % TAR_FILE_NAME)
  # Carica il file di configurazione più recente, ferma i processi esistenti e avvia tutti i processi secondo la nuova configurazione
  run('supervisorctl reload')
  # Eseguire 'restart all', 'start' o 'stop fabric' genererà un errore e interromperà l'esecuzione
  # Ma controllando i log del server, supervisor si è riavviato
  # riavvia tutti i servizi di supervisione

Eseguire l'operazione pack

fab pack

Eseguire l'operazione deploy

fab deploy

Condivido con voi un altro esempio di distribuzione automatizzata del codice utilizzando 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 "Nessun file da depositare, area di lavoro pulita" not in git_status_result:
    print red("****Ci sono file non depositati nella branch corrente")
    print git_status_result
    abort("****Operazione interrotta")
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("****Test unitari falliti, continuare?")):
        abort("****Operazione interrotta")
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("****Test unitari falliti, continuare?")):
        abort("****Operazione interrotta")
def upload_code():
  local("git push origin dev")
  print green("****Il caricamento del codice è stato completato con successo")
def deploy_at_server():
  print green("****ssh al server per eseguire le seguenti operazioni")
  with cd("/var/www/××××××"):
    #print run("pwd")
    print green("****Il codice verrà scaricato dal repository remoto")
    run("git checkout dev")
    get_git_status()
    run("git pull origin dev")
    stampa verde("****I test unitari verranno eseguiti sul server")
    server_unit_test()
    run("service apache2 restart", pty=False)
    stampa verde("****Riavvio di apache2 riuscito")
    stampa verde("********Codice distribuito con successo********")
def deploy():
  get_git_status()
  local("git checkout dev", capture=False)
  stampa verde("****Passaggio alla branch dev")
  get_git_status()
  stampa verde("****Inizieranno i test unitari")
  local_unit_test()
  stampa verde("****Test unitari completati, inizio upload del codice")
  upload_code()
  deploy_at_server()

Fabric può consolidare i comandi di distribuzione automatizzata o di operazioni multi-macchina in uno script, riducendo le operazioni manuali. Questo è quello che ho scritto dopo il mio primo contatto con questa cosa oggi, è davvero utile. Esegui semplicemente 'fab deploy'.

La logica principale è eseguire i test unitari locali sulla branch dev locale, quindi inviarli al server, accedere al server tramite ssh, quindi scaricare e eseguire di nuovo i test unitari, quindi riavviare apache2. La prima volta potrebbe sembrare semplice, ma continueremo a migliorare.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il copyright è di proprietà del rispettivo autore, il contenuto è stato contribuito autonomamente dagli utenti di Internet e caricato autonomamente, il sito web non detiene il diritto di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale correlata. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, il sito web eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare