1.简介
Fabric 是一个 Python (2.5-2.7) 的库和命令行工具,用来提高基于 SSH 的应用部署和系统管理效率。
更具体地说,Fabric 是:
- 一个让你通过命令行执行Python函数的工具;
- 一个让你通过SSH执行Shell命令更加容易、 更符合Python风格的命令库。
自然而然地,大部分用户把这两件事结合着用,使用Fabric来写和执行Python函数或task,以实现与远程服务器的自动化交互。让我们一睹为快吧。
2.安装
创建.pip目录和配置文件:
cd ~
mkdir .pip
cd .pip
touch pip.conf
编辑文件pip.conf如下
[global]
index-url=http://mirrors.zte.com.cn/pypi/simple
[install]
trusted-host=mirrors.zte.com.cn
安装依赖包(如果是centos的,需要使用yum安装)
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-dev
sudo apt-get install libffi-dev
用pip安装fabric
sudo pip install fabric
3、使用
3.1 执行无参python函数
编写fabfile.py如下:
def hello():
print("hello world!")
def helloEx(name):
print("hello ", name, "!")
在fabfile文件所在目录执行如下命令:
wld@trusty:~/fabric$ fab hello
hello world!
Done.
3.2 执行有参python函数
编写fabfile.py如下:
def hello(name):
print("hello "+name+" !")
在fabfile文件所在目录执行如下命令:
wld@trusty:~/fabric$ fab hello:name=wld
hello wld!
Done.
3.3 在本地机器执行命令
fabric.api包里的local()方法可以用来执行本地Shell命令:
from fabric.api import local
def hello():
local('ls -l ~')
local()方法有一个”capture”参数用来捕获标准输出,比如:
def hello():
output = local('ls -l ~', capture=True)
这样,Hello字样不会输出到屏幕上,而是保存在变量output里。
3.4 在远程机器执行命令
Fabric真正强大之处不是在执行本地命令,而是可以方便的执行远程机器上的Shell命令。它通过SSH实现,你需要的是在脚本中配置远程机器地址及登录信息:
from fabric.api import *
env.passwords = {
"[email protected]:22":"password"
}
@hosts("[email protected]:22")
def hello():
run("ls -l ~")
我们可以通过设置env.passwords来避免在运行过程中输密码,注意ip后面需要加端口号,示例中的22是ssh的端口号。
3.5 在内网机器执行命令
有时候我们需要通过一台中转机器才能登录内网机器,这种情况需要设置env.gateway
from fabric.api import *
env.gateway = "[email protected]:22"
env.passwords = {
"[email protected]:22":"password1"
"[email protected]:22":"password2"
}
@hosts("[email protected]:22")
def hello():
run("ls -l ~")
3.6 在windows服务器执行命令
首先windows机器需要安装ssh服务,注意ssh服务所用的账户需要设置能够运行exec的权限,否则无法启动windwos程序。
其次由于fabric默认使用bash,因此需要设置变量env.shell="cmd /c",否则会报错。
3.7 定义角色让不同机器执行不同命令
如果对于不同的服务器,我们想执行不同的任务,我们要对服务器定义角色:
from fabric.api import env, roles, run, execute, cd
env.roledefs = {
'staging': ['[email protected]','[email protected]'],
'build': ['[email protected]']
}
env.passwords = {
'staging': '11111',
'build': '123456'
}
@roles('build')
def build():
with cd('/home/build/myapp/'):
run('git pull')
run('python setup.py')
@roles('staging')
def deploy():
run('tar xfz /tmp/myapp.tar.gz')
run('cp /tmp/myapp /home/bjhee/www/')
def task():
execute(build)
execute(deploy)
现在让我们执行fab task,这时Fabric会先在一台build服务器上执行build任务,然后在两台staging服务器上分别执行deploy任务。”@roles”装饰器指定了它所装饰的任务会被哪个角色的服务器执行。
3.8 SSH功能函数
- sudo(cmd): 以超级用户权限执行远程命令。 sudo("mkdir /root/xx")
- get(remote, local): 从远程机器上下载文件到本地
- put(local, remote): 从本地上传文件到远程机器上
- prompt(提示字符串, default, validate): 提示输入并返回用户输入值
- reboot: 重启服务器
- cd(path): 设置远程机器的当前工作目录
- lcd(path): 设置本地工作目录
- path: 添加远程机的PATH路径
- settings: 设置Fabric环境变量参数
- shell_env: 设置Shell环境变量
- prefix: 设置命令执行前缀