fab中的env
    env对象的作用是定义fabfile的全局设定,支持多个属性,包含目标主机、用户名、密码、等角色,各种属性说明如下:

    1. * env.hosts:定义目标服务器列表
    2. * env.exclude_hosts:排除特定的服务器
    3. * env.user SSH:到远程服务器的用户名
    4. * env.port:远程服务器的端口号
    5. * env.key_filename:私钥文件的位置
    6. * env.password SSH:到远程服务器的密码
    7. * env.roledefs:定义服务器角色,以便服务器使用不同角色执行

    ps1:定义不同的角色的服务器

    1. env.roledefs = {
    2. 'webservers':['192.168.56.131','192.168.56.132','192.168.56.133'],
    3. 'dbserver':['192.168.56.134','192.168.56.135']
    4. }

    引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,下面来看一个示例:

    1. @roles('webservers')
    2. def webtask():
    3. run('hostname')
    4. @roles('dbservers')
    5. def dbtask():
    6. run('date')
    7. @roles('webservers','dbservers')
    8. def pubclitasj():
    9. run('uptime')
    10. def deploy():
    11. execute(webtask)
    12. execute(dbtask)
    13. execute(pubclitask)

    fabric提供的命令

    1. run():在远程服务器上执行Linux命令,还有一个重要的参数pty,如果我们执行命令以后需要有一个常驻的服务进程,那么就需要设置pty=False,避免因为Fabric退出导致进程的退出
    2. psrun('service mysql start',pty=False)
    3. sudo():与run类似,使用管理员权限在远程服务器上执行shell命令,还有一个重要的参数pty,如果我们执行命令以后需要有一个常驻的服务进程,那么就需要设置pty=False,避免因为Fabric退出导致进程的退出。
    4. local():用以执行本地命令,返回要执行的命令,local是对PythonSubprocess模块的封装,更负载的功能可以直接使用Subprocess模块,包含capture参数,默认为False,表示subprocess输出的信息进行显示,如果不想显示,那么指定capture=True即可
    5. get():从远程服务器上获取文件,通过remote_path参数声明从何处下载,通过local_path表示下载到何处。remote_path支持通配符。
    6. put():将本地的文件上传到远程服务器,参数与get相似,此外,还可以通过mode参数执行远程文件的权限配置。
    7. reboot():重启远程服务器,可以通过wait参数设置等待几秒钟重启
    8. propmt():用以在Fabric执行任务的过程中与管理员进行交互,类似于pythoninput
    9. pskey = prompt('Please specify process nice level:',key='nice',validate=int)

    fabric的上下文管理器

    1. cd():切换远程目录
    2. lcd():切换本地目录
    3. path():配置远程服务器PATH环境变量,只对当前会话有效,不会影响远程服务器的其他操作,path的修改支持多种模式
    4. * append:默认行为,将给定的路径添加到PATH后面。
    5. * prepend:将给定的路径添加到PATH的前面。
    6. * replace:替换当前环境的PATH变量。
    7. prefix():前缀,它接受一个命令作为参数,表示在其内部执行的代码块,都要先执行prefix的命令参数。
    8. shell_env():设置shell脚本的环境变量
    9. settings():通用配置,用于临时覆盖env变量
    10. remote_tunnel():通过SSH的端口转发建立的链接
    11. hide():用于隐藏指定类型的输出信息,hide定义的可选类型有7
    12. * status:状态信息,如服务器断开链接,用户使用ctrl+C等,如果Fabric顺利执行,不会有状态信息
    13. * aborts:终止信息,一般将fabric当作库使用的时候需要关闭
    14. * warnings:警告信息,如grep的字符串不在文件中
    15. * runningfabric运行过程中的数据
    16. * stdout:执行shell命令的标准输出
    17. * stderr:执行shell命令的错误输出
    18. * user:用户输出,类似于Python中的print函数
    19. 为了方便使用,fabric对以上其中类型做了进一步的封装
    20. * output:包含stdoutstderr
    21. * everything:包含stdoutstderrwarningsrunninguser
    22. * commands:包含stdoutrunning
    23. quiet():隐藏全部输出,仅在执行错误的时候发出告警信息,功能等同于 with settings(hide('everything'),warn_only=True)

    装饰器
    Fabric提供的命令一般都是执行某一个具体的操作,提供的上下文管理器一般都是用于临时修改配置参数,而fabric提供的装饰器,既不是执行具体的操作,也不是修改参数,而是控制如何执行这些操作,在那些服务器上执行这些操作,fabric的装饰器与人物执行紧密相关。下面从几个方面来进行说明

    • hosts:定制执行task的服务器列表
    • roles:定义执行task的role列表
    • parallel:并行执行task
      PS:关于并行模式:
      通过命令行参数-P(—parallel)通知Fabric并行执行task
      通过env.parallel设置设否需要并行执行
      通过parallel装饰器通知Fabric并行执行task,它接受一个pool_size作为参数(默认为0),表示可以有几个任务并行执行
    • serial:串行执行task
    • task:定义一个task
    • runs_once:该task只执行一次

    ps:不同任务使用不同角色执行

    1. from fabric.api import *
    2. env.roledefs = {
    3. 'web':['root@192.168.10.201:22','root@192.168.10.202:22',],
    4. 'db':['root@192.168.10.203:22',]
    5. }
    6. env.passwords = {
    7. 'root@192.168.10.201:22':'123456201',
    8. 'root@192.168.10.202:22':'123456202',
    9. 'root@192.168.10.203:22':'123456203'
    10. }
    11. @roles('db')
    12. def hello():
    13. run('echo hello')
    14. @roles('web')
    15. def world():
    16. run('echo world')
    17. @task
    18. def helloworld():
    19. execute(hello)
    20. execute(world)

    颜色输入
    fabric为了让输出日志更具有可读性,对命令行中断的颜色输出进行了封装,使用print打印带有不同颜色的文本,这些颜色包含在fabric.colors中。像warn,puts打印输出的,也可以直接渲染颜色

    • blue(text,blod=False) 蓝色
    • cyan(text,blod=False) 淡蓝色
    • green(text,blod=False) 绿色
    • magenta(text,blod=False) 紫色
    • red(text,blod=False) 红色
    • white(text,blod=False) 白色
    • yellow(text,blod=False) 黄色 ```python def ls(path=’.’): run(‘ls {0}’.format(path))

    def hello():

    1. execute(hell) # task任务hell
    2. warn(yellow('----->warn')) # 会发出提示信息,不会退出
    3. puts(green('----->puts')) # 会打印括号中的信息
    4. execute(ls) # task任务ls
    5. print(green('the text is green')) # 单纯的渲染文字:

    def hell(name=’world’): print(‘hello %s’ % name) ```