fab中的env
env对象的作用是定义fabfile的全局设定,支持多个属性,包含目标主机、用户名、密码、等角色,各种属性说明如下:
* env.hosts:定义目标服务器列表
* env.exclude_hosts:排除特定的服务器
* env.user SSH:到远程服务器的用户名
* env.port:远程服务器的端口号
* env.key_filename:私钥文件的位置
* env.password SSH:到远程服务器的密码
* env.roledefs:定义服务器角色,以便服务器使用不同角色执行
ps1:定义不同的角色的服务器
env.roledefs = {
'webservers':['192.168.56.131','192.168.56.132','192.168.56.133'],
'dbserver':['192.168.56.134','192.168.56.135']
}
引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,下面来看一个示例:
@roles('webservers')
def webtask():
run('hostname')
@roles('dbservers')
def dbtask():
run('date')
@roles('webservers','dbservers')
def pubclitasj():
run('uptime')
def deploy():
execute(webtask)
execute(dbtask)
execute(pubclitask)
fabric提供的命令
run():在远程服务器上执行Linux命令,还有一个重要的参数pty,如果我们执行命令以后需要有一个常驻的服务进程,那么就需要设置pty=False,避免因为Fabric退出导致进程的退出
ps:run('service mysql start',pty=False)
sudo():与run类似,使用管理员权限在远程服务器上执行shell命令,还有一个重要的参数pty,如果我们执行命令以后需要有一个常驻的服务进程,那么就需要设置pty=False,避免因为Fabric退出导致进程的退出。
local():用以执行本地命令,返回要执行的命令,local是对Python的Subprocess模块的封装,更负载的功能可以直接使用Subprocess模块,包含capture参数,默认为False,表示subprocess输出的信息进行显示,如果不想显示,那么指定capture=True即可
get():从远程服务器上获取文件,通过remote_path参数声明从何处下载,通过local_path表示下载到何处。remote_path支持通配符。
put():将本地的文件上传到远程服务器,参数与get相似,此外,还可以通过mode参数执行远程文件的权限配置。
reboot():重启远程服务器,可以通过wait参数设置等待几秒钟重启
propmt():用以在Fabric执行任务的过程中与管理员进行交互,类似于python的input
ps:key = prompt('Please specify process nice level:',key='nice',validate=int)
fabric的上下文管理器
cd():切换远程目录
lcd():切换本地目录
path():配置远程服务器PATH环境变量,只对当前会话有效,不会影响远程服务器的其他操作,path的修改支持多种模式
* append:默认行为,将给定的路径添加到PATH后面。
* prepend:将给定的路径添加到PATH的前面。
* replace:替换当前环境的PATH变量。
prefix():前缀,它接受一个命令作为参数,表示在其内部执行的代码块,都要先执行prefix的命令参数。
shell_env():设置shell脚本的环境变量
settings():通用配置,用于临时覆盖env变量
remote_tunnel():通过SSH的端口转发建立的链接
hide():用于隐藏指定类型的输出信息,hide定义的可选类型有7种
* status:状态信息,如服务器断开链接,用户使用ctrl+C等,如果Fabric顺利执行,不会有状态信息
* aborts:终止信息,一般将fabric当作库使用的时候需要关闭
* warnings:警告信息,如grep的字符串不在文件中
* running:fabric运行过程中的数据
* stdout:执行shell命令的标准输出
* stderr:执行shell命令的错误输出
* user:用户输出,类似于Python中的print函数
为了方便使用,fabric对以上其中类型做了进一步的封装
* output:包含stdout,stderr
* everything:包含stdout,stderr,warnings,running,user
* commands:包含stdout,running
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:不同任务使用不同角色执行
from fabric.api import *
env.roledefs = {
'web':['root@192.168.10.201:22','root@192.168.10.202:22',],
'db':['root@192.168.10.203:22',]
}
env.passwords = {
'root@192.168.10.201:22':'123456201',
'root@192.168.10.202:22':'123456202',
'root@192.168.10.203:22':'123456203'
}
@roles('db')
def hello():
run('echo hello')
@roles('web')
def world():
run('echo world')
@task
def helloworld():
execute(hello)
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():
execute(hell) # task任务hell
warn(yellow('----->warn')) # 会发出提示信息,不会退出
puts(green('----->puts')) # 会打印括号中的信息
execute(ls) # task任务ls
print(green('the text is green')) # 单纯的渲染文字:
def hell(name=’world’): print(‘hello %s’ % name) ```