自动化运维工具之fabric

时间:2023-01-02 21:49:23

fabric

Fabric是一个基于Python(2.5-2.7)的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率。稍微了解Python的人都知道,实际上它只节省了数行 if name == “main” 这样的惯例代码而已。Fabric 的设计目的更是为了使用它自己的 API,包括执行 Shell 命令、传送文件等函数(或操作)接口。

命令使用
fab [options] [:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…],常用的参数有:
-l,显示定义好的任务函数名;
-f,指定fab入口文件,默认入口文件名为fabfile.py;
-g,指定网关设备,比如堡垒机环境,填写堡垒机IP即可;
-H,指定目标主机,多台主机用’,’号分隔;
-P,以异步并行方式运行多个主机任务,默认为串行运行;
-R,指定role(角色),以角色名区分不同业务组设备;
-t,设置设备连接超时时间;
-T,设置远程主机命令执行超时时间;
-w,当命令执行失败,发出警告,而非默认终止任务

全局属性的设定
env.hosts:定义多个目标主机,用IP或者主机名的列表,env.hosts=[“192.168.0.1”,”192.168.0.2”]
env.user:定义用户名,env.user = “root”
env.port:定义端口,env.port=22
env.password:定义密码,env.password = ‘1111’
env.passwords:定义多台主机的用户名、IP地址、端口、密码。
env.passwords={
“root@192.168.0.1:22” : “1111”,
“root@192.168.0.2:22” : “1111”,
}
env.gateway:定义网关,env.gateway=”192.168.0.1”
env.roledefs:定义角色分组
env.roledefs={
“webserver”:[“192.168.0.1”],
“dbserver”:[“192.168.0.2”]
}

fabfile编写
from fabric.api import *

env.user = "root"
env.hosts=["192.168.0.1","192.168.0.2"]
env.passwords={
"root@192.168.0.1:22" : "1111",
"root@192.168.0.2:22" : "1111",
}
nv.roledefs={
"webserver":["192.168.0.1"],
"dbserver":["192.168.0.2"]
}

@task
def show():
run("hostname")

@task
@roles("webserver")
def show_web_port():
run("netstate -tnulp | grep 80")

@task
@roles("wdbserver")
def show_db_port():
run("netstate -tnulp | grep 3306")

fab -f fabfile.py -l //查看有多少个任务
fab -f fabfiel.py show // 运行show这个任务(所有主机)
fab -f fabfiel.py show_web_port // 运行show_web_port这个任务(按角色分配的主机运行)
fab -f fabfiel.py show_db_port // 运行show_db_port这个任务(按角色分配的主机运行)

常用API
Fabric提供了一组简单但功能强大的fabric.api命令集,简单地调用这样API就能完成大部分应用场景需求,Fabric支持常用的方法及说明如下:
local,执行本地命令,如local:(‘uname -s’);
lcd,切换本地目录,如lcd:(‘/home’);
cd,切换远程目录,如cd:(‘/data/logs/’);
run,执行远程命令,如:run(‘free -m’)
sudo,sudo方式执行远程命令,如:sudo(‘/etc/init.d/httpd start’);
put,上传本地文件到远程主机,如:put(‘/home/user.info’,’/data/user.info’);
get,从远程主机下载文件到本地,如:get(‘/home/user.info’,’/data/user.info’);
prompt,获得用户输入信息,如:prompt(‘please input user password:’);
confirm,获得提示信息确认,如:confirm(‘Test failed,Continue[Y/N]’);
reboot,重启远程主机,如reboot();
@task,函数修饰符,标识符的函数为fab可调用,非标记对fab不可见,纯业务逻辑;
@runs_once,函数修饰符,标识符的函数只会执行一次,不受多台主机影响;
@roles(角色)
@hosts(主机1,主机2)
@paralles 并行装饰器

实战:
1.文件打包、上次、校验、下载
from fabric.api import *
from fabric.contrib.console import confirm

env.user = "root"
env.hosts=["192.168.0.1","192.168.0.2"]
env.passwords={
"root@192.168.0.1:22" : "1111",
"root@192.168.0.2:22" : "1111",
}

@task
def upload_file():
with settings(warn_only=True):
local("tar -czf test.tgz test.txt")
result = put("./test.tgz", "/root /test.tgz")
if result.failed and not confirm("continue[Y/N]?"):
abort("put file fail")

with settings(warn_only=True):
local_file = local("md5sum test.tgz", capture=True).split(" ")[0]
remote_file = run("md5sum /root/test.tgz").split(" ")[0]

if local_file == remote_file:
print("upload file success")
else:
print("upload file fail")

run("tar zxf /root/test.tgz")


@task
def download_file():
with settings(warn_only=True):
get("/root/test.tgz", "./test.tgz")
local("tar zxf ./test.tgz")

2.多主机批量并行运行
from fabric.api import *
from fabric.contrib.console import confirm

env.user = "root"
host1 = "192.168.0.1"
host2 = "192.168.0.2"
env.hosts=[host1, host2]
env.passwords={
"root@192.168.0.1:22" : "1111",
"root@192.168.0.2:22" : "1111",
}

@task
@parallel
@hosts(host1, host2)
def install_ftp():
run("yum install -y vsftpd")

这只是我的实验,fabric做的事情特别多,比如lnmp等等的自动化安装都可以实现。