美文网首页
python fabric 服务器管理实践

python fabric 服务器管理实践

作者: RuiWang14 | 来源:发表于2018-08-17 18:22 被阅读0次

    依赖

     python2.7
     fabric==1.1
    

    2.1 以上的的fabric感觉不是很好用,而且在安装的时候一堆问题,资料也比较少,所以我们在生产环境采用的是 1.1 版本。

    安装

    $pip install fabric==1.1
    

    一个最简单的例子

    直接使用 fab 命令:
    当前目录新建 fabfile.py 文件,写入以下内容:

    from fabric.api import *
    def hello():
      print 'hello! %s' % local('echo "$USER"')
    

    保存,在当前目录执行

    $fab hello
    

    可以看到如下输出


    '$fab hello' output

    fabric 做了以下:

    1. 加载 fabfile.py,并执行 hello() 函数
    2. 本地执行 ** echo "$USER" **,并返回执行结果

    除了 local() 函数以外,fabric 还有以下常用函数:

    # Run a shell command on a remote host
    # 在服务器上执行命令
    run(*args, **kwargs)
    
    # Context manager that keeps directory state when calling remote operations.
    # 上下文管理器,用于切换目录
    cd(path)
    

    一个略复杂的例子

    本例节选自数据组 nginx 自动重启脚本,主要行为:

    1. 链接服务器
    2. cd 到指定目录,并从 gitlab 拉取最新 repo
    3. 将 repo 中的 conf 文件复制到指定目录
    4. reload nginx
    from __future__ import with_statement
    from fabric.api import *
    import json
    
    env.hosts = ['xx.xx.xx.xx']
    env.user = 'test_user'
    
    
    def copy_config():
        source_path = '/home/data/projects/focus-data-nginx-config/%s'
    
        with open('./map.json') as f:
            jo = json.load(f)
    
        for j in jo:
            target_path = j['target_path']
            s_path = source_path % j['source_path']
            run('cp %s %s' % (s_path, target_path))
    
    
    def remote():
        project_path = '/home/data'
        with cd(project_path):
            result = run('ls')
            if 'projects' not in result:
                run('mkdir projects')
            pull_from_git_lab()
            run('ls projects/focus-data-nginx-config')
    
        copy_config()
        nginx_reload()
    
    
    def pull_from_git_lab():
        with cd('projects'):
            if 'focus-data-nginx-config' in run('ls'):
                with cd('focus-data-nginx-config'):
                    run('git pull origin master ')
            else:
                run('git clone git@xxx.git')
    
    
    def nginx_reload():
        run('sudo nginx -s reload')
    

    启动命令:

    $fab remote
    

    特别提醒

    利用 fabric 起后台应用时会有问题,比如:

     # 不能正常运行,是 fabric 本身的问题
     run('nohup java /azkaban-flow-new-0.0.1-SNAPSHOT.jar &')
    

    这时就需要加一个小 trick

    # sleep 5 秒就 OK 了
    run('nohup java /azkaban-flow-new-0.0.1-SNAPSHOT.jar & sleep 5; exit 0')
    

    相关文章

      网友评论

          本文标题:python fabric 服务器管理实践

          本文链接:https://www.haomeiwen.com/subject/vzqtiftx.html