python 利用 fabric 运行脚本, 简化远程及本地操作

参考:出处

原创内容:

  1. 常用命令讲解:
    1) run(), 远程执行命令,
    run('mkdir test')
    以上为,在远程主机执行mkdir test, 与本地终端输入mkdir test一样.同为在当前目录创建一个名字为test的文件夹.

    2) cd(), 操作远程主机, 配合with使用, 
    with cd('/home/username/work'):
        run('ls')
    相当于切换至目录 /home/username/work下, 执行ls命令.

    3) local(), 本地执行命令, 运行结果同run().

    4) lcd(), 本地执行命令, 效果同cd(), 未测试!!

    5) prefix(), 远程,本地均可配合with使用,
    with prefix('cd /home/work'):
        run('mkdir test')
    常用于进入远程虚拟环境:
    with prefix('. venv/bin/activate'):
        run('python manage.py runsever')
    with prefix('...'): ... 相当于with run/local('...'): ... 但是后者是无效的.
    6) 以上方法都可以用';'来拼接指令, 例: 
    local('cd /home/work; mkdir test; cd test')
    效果为本地目录切换到 /home/work, 然后创建名为test文件夹, 再进入test, 指令结束.


  2. 20170418例子: source命令等于(.)命令,替换后成功进入虚拟环境.
    入门操作, 如下:
    第一种使用方法, 文件名默认为fabfile.py时:
    from fabric.api import *
    
    def st(p='1'):
        if p == '1':
            addr = 'projects/kaoq/kaoq'
            local('. venv01/bin/activate'+'; cd '+addr+';python manage.py makemigrations; python manage.py migrate; python manage.py runserver')
        elif p == '2':
            addr = 'projects/bbank'
            local('. venv01/bin/activate'+'; cd '+addr+';python manage.py makemigrations; python manage.py migrate; python manage.py runserver')
    
    def hello():
        print 'hi'
    讲解, fabfile.py在当前目录的前提下, 终端输入 fab st:1 运行函数st()并且传入字符串'1'. 输入fab hello,则运行函数hello().
  3. 在远程主机进行批量操作. 参考: 文章
    第二种, 名字为自定义时, test_fabfile.py:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    from fabric.api import cd, env, prefix, run, task , sudo, hosts
    # 配置远程主机, "中"括号格式为: '你的主机名@你的域名: 端口号'
    env.hosts = [
        '[email protected]: 22',
    ]
    # 配置远程主机密码, "花"括号格式为: '你的主机名@你的域名: 端口号': '你的密码'
    env.passwords = {
        '[email protected]: 22': 'yourpassword',
    }
    #此装饰器不清楚, 暂时猜测是输出任务日志用
    @task(default=True)
    def test(): 
        with cd('/home/username/work'): 
            with prefix('. vrxiio/bin/activate'): 
                with prefix('cd projects/rxiiodev'): 
                    run('python manage.py migrate') 
                    run('python manage.py makemigrations') 
                    run('python manage.py collectstatic --noinput') 
                    sudo('service nginx restart')
    
    讲解: test_fabfile.py在当前目录下, 终端输入fab -f test_fabfile.py test即运行test().
  4. 操作混合远程主机批量执行任务. 参考: 文章
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    # 配置角色信息
    env.user = 'username'
    env.roledefs = {
        'role01': ['192.168.1.1'],
        'role02': ['192.168.1.2'],
        }
    env.passwords = {
        '[email protected]: 22': 'yourpassword',
        '[email protected]: 22': 'yourpassword',
    }
    
    @roles('role01')
    def test01():
        run('mkdir file01')
    
    @roles('role02')
    def test02():
        run('mkdir file02')
    
    def allexecute():
        execute(test01)
        execute(test01)

暂时写这么多, 有机会再补充

你可能感兴趣的:(python)