运维管理工具fabric详解
2018 年 8 月 29 日
运维管理工具fabric详解
前言
运维管理工具有fabric,ansible等等。
本节讲下fabric,最开始接触是在廖雪峰的文章里。他用fabric做的运程部署。
这里打算详细了解下。
官网点击这里。
安装
这个真没啥讲的。我都是pip install fabric
.
不过现在还不支持3.x, 所以还是请用virtualenv吧。
文件
执行fab命令时,默认会使用fabfile.py, 如果你的文件名不是这个,请使用-f参数。
fab -f yourfile.py
fab的常用参数
可以通过fab -help
查看
- -l 显示定义好的任务函数名。
- -f 指定fab入口文件
- -g 指定网关(中转)设备,比如堡垒林环境,填写堡垒机IP即可。之前在新浪和腾讯工作时,他们都有跳板机/堡垒机。 阿里云的金融云模式也提供堡垒机。
- -H 指定目标主机,多台主机用”,”分隔;
- -P, 以异步并行方式运行多主机任务,默认为串行运行。
- -R, 指定role, 以角色名区分不同业务组设备。
- -t, 设置设备连接超时时间(秒).
- -T, 设置远程主机命令执行超时时间(秒);
- -w, 当命令执行失败,发出告警,而非默认中止任务。
可以不写一行python代码也可以完成简单的远程操作,直接使用命令行的形式,例如。
fab -u 用户 -p 密码 -H 主机IP -- 'uname -s'
结果
[123.57.145.149] Executing task ”
[123.57.145.149] run: uname -s
[123.57.145.149] out: Linux
[123.57.145.149] out:
Done.
Disconnecting from 123.57.145.149… done.
fabfile的编写
全局属性设定
在命令行中的参数如 -u -p 等可以通过env对象来设定。
env对象的作用是定义fabfile的全局设定,支持多个属性,包括目标主机、用户、密码、角色等,各属性说明如下:
- env.hosts, 定义目标主机,可以用IP或主机名表示,以Python的列表形式定义,如env.hosts = [‘192.168.1.21’, ‘192.168.1.22’]
- env.exclude_hosts, 排除指定主机,如env.exclude_hosts=[‘192.168.1.22’]
- env.user, 定义用户名, 如env.host=”work”
- env.port, 定义目标主机端口,默认为22, 如env.port=”22″.
- env.password, 定义密码,是对应user的密码.如env.password=”password123″,这里密码太弱,只是说明一下用法.
- env.passwords, 与password功能一样,区别在于不同的主机不同密码的应用场景,需要注意的是,配置passwords时需配置用户、主机、端口等信息,如
env.passwords = {
'root@192.168.1.21:22':'fdsfsf',
'root@192.168.1.22:22':'dfsfsfsafsafas',
'root@192.168.1.23:22':'ppopojpoj[p'
}
- env.key_filename 可以通过pem文件登录。而不用暴露密码。
- env.gateway,定义网关IP, 同命令参数 -g
-
env.roledefs, 定义角色分组,比如web组与db组主机区分开来,定义如下:
env.roledefs = { 'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23', '192.168.1.24'], 'dbservers':['192.168.1.25', '192.168.1.26'] }
引用时使用Python修饰符的形式进行,角色修饰下面的任务函数为其作用域,下面来看一个示例:
@roles('webservers')
def webtask():
run('/etc/init.d/nginx start')
@roles('dbservers')
def dbtask():
run('/etc/init.d/mysql start')
@roles('webservers', 'dbservers')
def pubclitask():
run('uptime')
def deploy():
execute(webtask)
execute(dbtask)
execute(pubclitask)
在命令行执行fab deploy
就可以实现不同角色执行不同的任务函数了。
常用API
这些API封装了执行本地命令,执行远程主机命令等功能。
说明如下:
- local ,执行本地命令。 如:local(‘uname -s’);
- run, 执行远程命令
- lcd, 切换本地目录,
- cd ,切换远程目录。
- sudo ,sudo 方式执行远程命令
- put 上传本地文件到远程主机
- get 从远程主机下载文件到本地
- prompt,获取用户输入信息,用于交互
- confirm, 获得提示信息确认,用于交互
- reboot, 重启远程主机
- @task, 函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;
- @runs_once, 函数修饰符,标识的函数只会执行一次,不受多台主机影响。
后记
更细节的可以考虑官网
示例可以看刘天斯写的<Python自动化运维>或廖雪峰的Python教程。