返回Python自......登陆

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

巴扎黑2017-01-16 09:39:30482

Fabric 是使用 Python 开发的一个自动化运维和部署项目的一个好工具,可以通过 SSH 的方式与远程服务器进行自动化交互,例如将本地文件传到服务器,在服务器上执行shell 命令。

下面给出一个自动化部署 Django 项目的例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

# -*- 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\'' % for 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')

执行 pack 任务

fab pack

执行 deploy 任务

fab deploy

再给大家分享一个使用Fabric进行代码的自动化部署

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

#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()

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

 更多关于Python自动化运维和部署项目工具Fabric使用实例请关注PHP中文网(www.php.cn)其他文章!

最新手记推荐

• 用composer安装thinkphp框架的步骤• 省市区接口说明• 用thinkphp,后台新增栏目• 管理员添加编辑删除• 管理员添加编辑删除

全部回复(0)我要回复

暂无评论~
  • 取消回复发送