关于Fabric
Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。
Fabric通过把大量频繁使用的SSH操作写入到一个脚本中(fabric.py),来远程执行一些应用部署或者系统维护的任务。Fabric是类似paramiko的一个库,是对paramiko的再次封装,所以比使用paramiko更简单。
Fabric的优点:
1. 角色定义
2. 代码易读
3. 封装了本地、远程操作
4. 参数灵活,能偶动态指定host/role等,还有并发执行(基于multiprocessing)
5. 完整的日志输出
安装Fabric
Fabric的安装很简单,可以直接使用pip或者easy_install安装到当前Python环境中,或者下载最新的源码使用"python setup.py xxx"的方式来安装:
#pip install fabric
使用Fabric
1 Fabric通过命令行工具fab来执行定义在fabfile.py中的任务,常用的配置和函数如下
1. 常用的fab命令选项和参数:
-l 显示可用的task
-H 指定host,多个host用逗号分开
-R 指定role,多个role用逗号分开
-P 并分数,默认是串行
-w warn_only,默认为遇到异常直接放弃执行并退出
-f 指定入口文件,fab默认入口文件是:fabfile/fabfile.py
2. fabfile.py文件中常用配置和函数:
env.host 主机ip,也可以使用fab选项-H参数来指定
env.password SSH密码,若已经设置好无密码登录,则可以忽略
env.roledefs 角色分组,如:{'web': ['x', 'y'], 'db': ['z']}
local('pwd') 执行本地命令
lcd('/tmp') 切换本地目录
cd('/tmp') 切换远程目录
run('uname -s') 执行远程命令
sudo('service httpd restart') 执行远程sudo,注意pty选项
2 任务函数
Fabric中的任务就是一个个Python函数,通过将上述的函数封装到某一个函数中来执行相应的任务
示例:
#cat fabfile.py
from fabric.api import run
def host_type():
run('uname -s')
def hello(name="jayzhou"):
print("Hello %s!" % name)
def combine(name="jayzhou"):
hello(name)
host_type()
在执行任务的时候,可以通过fab的命令行参数为任务函数传递参数:
#fab hello:name=Rango
3. 管理远程服务
1. 获取远程服务器版本信息
#cat fabfile.py
from fabric.api import env
from fabric.api import cd
from fabric.api import run
from fabric.api import local
from fabric.api import get
from fabric.api import put
env.hosts = ['192.168.56.101', '192.168.56.102']
env.user = 'root'
env.password = "password"
def get_version():
local('cat /etc/issue')
run('cat /etc/issue')
with cd('/root/'):
put('/home/rango/test.txt', 'test.txt', mode=0755)
get('hello_world.txt')
run('ls')
def get_host_name():
run('hostname')
运行:
#fab -f fabfile.py get_version
2. 管理远程httpd服务:
#cat fabfile.py
from fabric.api import *
env.hosts = ['192.168.56.101', '192.168.56.102']
env.user = 'root'
env.password = "password"
@task
def httpd_start():
''' httpd start '''
sudo('service httpd start')
@task
def httpd_stop():
''' httpd stop '''
sudo('service httpd stop')
查看可用命令:
#fab -f fabfile.py --list
Available commands:
httpd_start httpd start
httpd_stop httpd stop
执行:
#fab -f fabfile.py httpd_start
3. 基于角色
#cat fabfile.py
#!/usr/bin/env python
#coding:utf-8
from fabric.api import *
env.roledefs = {'httpd': ['192.168.56.101', '192.168.56.102'], 'mysql': '192.168.56.103'}
@task
def mysql_start():
'''mysql start'''
sudo('/etc/init.d/mysql start')
@task
def httpd_start():
'''httpd start'''
sudo('/etc/init.d/httpd start')
@task
def httpd_stop():
'''httpd stop'''
sudo('/etc/init.d/httpd stop')
查看可用命令:
#fab -f fabfile.py --list
Available commands:
httpd_start httpd start
httpd_stop httpd stop
mysql_start mysql start
执行:
#fab -f fabfile.py -R httpd httpd_start
#fab -f fabfile.py -R mysql mysql_start
4. 直接使用Fabric库
#cat fabfile.py
#!/usr/bin/env python
#coding:utf-8
from fabric.state import env, connections
from fabric.tasks import execute
from fabric.api import run
env.user = 'root'
env.password = 'password'
hosts = ['192.168.56.101', '192.168.56.102']
def myls(path):
run('ls %s' % path)
execute(myls, path='/root/', hosts=hosts)
for key in connections.keys():
connections[key].close()
del connections[key]
在这一段代码中使用env来获取和设置环境参数,使用execute执行自定义的函数,然后使用connections来管理连接。其中execute通过传递参数可以在fab命令中指定目录。
执行:
#fab -f fabfile.py myls:path=/root
——游响云停