本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便。主要用于多台服务器批量执行任务。
非内置Python模块,需要手动安装:pip install fabric
如果安装失败,可以尝试yum安装:yum install fabric
Fabric常用API:
当我们写好fabric脚本后,需要用fab命令调用执行任务。
命令格式:fab [options][:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…] …
fab命令有以下常用选项:
示例:
1、本地执行命令
from fabric.api import local
def command():
local('ls')
# fab command
[localhost] local: ls
fabfile.py fabfile.pyc tab.py tab.pyc
Done.
使用fab命令调用,默认寻找当前目录的fabfile.py文件。
2、远程执行命令
from fabric.api import run
def command():
run('ls')
# fab -H 192.168.1.120 -u user command
[192.168.1.120] Executing task 'command'[192.168.1.120] run: ls
[192.168.1.120] Login password for 'user':
[192.168.1.120] out: access.log a.py
[192.168.1.120] out:
Done.
Disconnecting from 192.168.1.120... done.
如果在多台主机执行,只需要-H后面的IP以逗号分隔即可。
3、给脚本函数传入位置参数
from fabric.api import run
def hello(name="world"):
print("Hello %s!" % name)
# fab -H localhost hello
[localhost] Executing task 'hello'Hello world!
Done.
# fab -H localhost hello:name=Python
[localhost] Executing task 'hello'Hello Python!
Done.
4、主机列表组
from fabric.api import run, env
env.hosts = ['root@192.168.1.120:22', 'root@192.168.1.130:22']
env.password = '123.com'env.exclude_hosts = ['root@192.168.1.120:22'] # 排除主机
def command():
run('ls')
env作用是定义fabfile全局设定,类似于变量。还有一些常用的属性:
5、定义角色分组
# vi install.py
from fabric.api import run, env
env.roledefs = { 'web': ['192.168.1.10', '192.168.1.20'], 'db': ['192.168.1.30', '192.168.1.40']
}
env.password = '123'@roles('web')
def task1():
run('yum install httpd -y')
@roles('db')
def task2():
run('yum install mysql-server -y')
def deploy():
execute(task1)
execute(task2)
# fab -f install.py deploy
6、上传目录到远程主机
from fabric.api import *
env.hosts = ['192.168.1.120']
env.user = 'user'env.password = '123.com'def task():
put('/root/abc', '/home/user')
run('ls -l /home/user')
# fab task
7、从远程主机下载目录
from fabric.api import *
env.hosts = ['192.168.1.120']
env.user = 'user'env.password = '123.com'def task():
get('/home/user/b', '/opt')
local('ls -l /opt')
# fab task
8、打印颜色,有助于关键地方醒目
from fabric.colors import *
def show():
print green('Successful.')
print red('Failure!')
print yellow('Warning.')
# fab show
经过上面示例,有没有觉得fabric模块很适合批量自动部署呢!没错,通过编写简单的脚本,即可完成复杂的部署操作。
而paramiko模块,更擅长远程执行命令,文件传输,可灵活的嵌入到运维系统中。