一、代码持续集成jenkins之fabric模块更多功能
1、关于fabric
fabric是一个Python的库,同时它也是一个命令行工具。使用fabric提供的命令行工具,可以很方便地执行应用部署和系统管理等操作。fabric依赖于paramiko进行ssh交互,fabric的设计思路是通过几个API接口来完成所有的部署,因此fabric对系统管理操作进行了简单的封装,比如执行命令,上传文件,并行操作和异常处理等。
2、fabric执行任务步骤
fabric执行任务的步骤如下:
1.创建任务列表,这些任务就是fab命令行参数指定的任务,fab会保持这些任务的顺序
2.对于每个任务,构造需要执行该任务的服务器列表,服务器列表可以通过命令行参数指定,或者env.hosts指定,或者通过hosts和roles装饰器指定
3.遍历任务列表,对于每一台服务器分别执行任务,可以将任务列表和服务器列表看作是两个for循环,任务列表是外层循环,服务器列表是内存循环,fabric默认是串行执行的可以通过装饰器或者命令行参数确定任务执行的方式
4.对于没有指定服务器的任务默认为本地任务,仅执行一次
3、关于fabric的task及装饰器
task是fabric需要在远程服务器上执行的函数,在fabric中有3中用方法定义一个task,默认情况下,fabfile中的所有函数对象都是一个task,但是如果我们使用了task装饰器,显示的定义了一个task,那么其他没有通过task装饰器装饰的函数将不会被认为是一个task。
有两种方式实现task类,一是fabfile中的task继承自fabric的task类,比较难用,不推荐。另一个方法是使用fabric的task装饰器,这是使用fabric最快速的方式,也是推荐的用法。
from fabric.api import *
@task
def task1():
run('do task1')
装饰器除了task还有一个可能有用的就是runs_once:意思是这个任务只能执行一次,防止task被多次调用。例如对目录打包上传的动作对不同的服务器上传可能会执行多次,但是打包的动作只需要执行一次即可。
4、fabric常用方法列表:
run():在远程服务器上执行Linux命令,还有一个重要的参数pty,如果我们执行命令以后需要有一个常驻的服务进程,那么就需要设置pty=False,避免因为Fabric退出导致进程的退出
local():用以执行本地命令,返回要执行的命令,local是对Python的Subprocess模块的封装,更负载的功能可以直接使用Subprocess模块,包含capture参数,默认为False,表示subprocess输出的信息进行显示,如果不想显示,那么指定capture=True即可
sudo():与run类似,使用管理员权限在远程服务器上执行shell命令,还有一个重要的参数pty,同run方法。
get():从远程服务器上获取文件,通过remote_path参数声明从何处下载,通过local_path表示下载到何处。remote_path支持通配符。
示例:get(remote_path='/tmp/test.pid',local_path='/tmp/test_local.pid')
put():将本地的文件上传到远程服务器,还可以通过mode参数执行远程文件的权限配置。
示例:put(remote_path='/tmp/test.pid',local_path='/tmp/test_local.pid')
path():配置远程服务器PATH环境变量,只对当前会话有效,不会影响远程服务器的其他操作,path支持模式append、prepend、replace。
with path('/tmp','prepend'):
run("echo $PATH")
cd():切换远程目录,使用中发现cd()也能切换本地目录。
lcd():切换本地目录
with cd(dir):
settings():通用配置,用于临时覆盖env变量
with settings(hide('everything'), warn_only=True): #关闭warning显示
reboot():重启远程服务器,可以通过wait参数设置等待几秒钟重启
reboot(wait=30)
quiet():隐藏全部输出,仅在执行错误的时候发出告警信息,功能等同于 with settings(hide('everything'),warn_only=True)
propmt():用以在Fabric执行任务的过程中与管理员进行交互,类似于python的input
shell_env():设置shell脚本的环境变量,等同于shell中的export
with shell_env(HTTP_PROXY='127.0.0.1'):
run('echo $HTTP_PROXY')
5、其它utils函数
utils函数包含一些辅助行的功能函数,这些函数位于fabric.utils下,常用的函数如下:
abort:终止函数执行,打印错误信息到stderr,并且以退出码1退出。
warn:输出警告信息,但是不会终止函数的执行
puts:打印输出,类似于Python中的print函数
#utils函数的使用
def test():
abort('abort') #直接退出
warn('warn') #发出提示信息但不会退出
puts('message') #会打印括号中的信息,和print一样。
6、带颜色的输出
fabric为了让输出日志更具有可读性,对命令行中断的颜色输出进行了封装,使用print打印带有不同颜色的文本,这些颜色包含在fabric.colors中。像warn,puts打印输出的,也可以直接渲染颜色,bold加粗,常用颜色如下:
blue(text,bold=False) 蓝色
green(text,bold=False) 绿色
red(text,bold=False) 红色
yellow(text,bold=False) 黄色
def test():
warn(yellow('----->warn')) #会发出提示信息,不会退出
puts(green('----->puts')) #会打印括号中的信息
print(green('the text is green')) # 单纯的渲染文字:
最后:关于fabric的并行模式:
通过命令行参数-P(--parallel)通知Fabric并行执行task
通过env.parallel设置设否需要并行执行
通过parallel装饰器通知Fabric并行执行task,它接受一个pool_size作为参数(默认为0),表示可以有几个任务并行执行
二、Jenkins发布脚本及逻辑的优化-隐藏发布脚本保护服务器的账号数据
之前使用做项目自动部署,我的发布脚本是放在代码里面的,但因为代码里包含了服务器的登录账号以及所有操作过程,一下子就全部暴露出来了,觉得很不好,于是在想进行怎样的优化,后来想想完全可以在jenkins服务器上做这些事情,而和代码可以完全解耦开来。
我的Jenkins是使用docker部署在服务器容器中,经过自己的思考测试,我最后将发布脚本存放在jenkins容器里某个路径下,然后写一些简单的shell脚本命令放在容器的/usr/bin/命令中,在jenkins执行发布构建的shell命令中直接执行/usr/bin/命令将jenkins发布脚本从容器中复制到当前项目目录,然后执行deploy构建。整个jenkins的发布命令只需要两行:
#初始化项目构建:只是执行一些shell命令
init_project_deploy
#执行测试发布-执行fabfile.py脚本
fab -f fabfile.py development deploy
这样就完全不会让web服务器的账号目录数据暴露出来,极大的减少了风险。