运维管理工具fabric详解

运维管理工具fabric详解

前言

运维管理工具有fabric,ansible等等。
本节讲下fabric,最开始接触是在廖雪峰的文章里。他用fabric做的运程部署。
这里打算详细了解下。
官网点击这里。

安装

这个真没啥讲的。我都是pip install fabric.
不过现在还不支持3.x, 所以还是请用virtualenv吧。

文件

执行fab命令时,默认会使用fabfile.py, 如果你的文件名不是这个,请使用-f参数。
fab -f yourfile.py

fab的常用参数

可以通过fab -help查看

  1. -l 显示定义好的任务函数名。
  2. -f 指定fab入口文件
  3. -g 指定网关(中转)设备,比如堡垒林环境,填写堡垒机IP即可。之前在新浪和腾讯工作时,他们都有跳板机/堡垒机。 阿里云的金融云模式也提供堡垒机。
  4. -H 指定目标主机,多台主机用”,”分隔;
  5. -P, 以异步并行方式运行多主机任务,默认为串行运行。
  6. -R, 指定role, 以角色名区分不同业务组设备。
  7. -t, 设置设备连接超时时间(秒).
  8. -T, 设置远程主机命令执行超时时间(秒);
  9. -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教程。

Tags: