Python运维自动化开发之Fabric模块

  2017-11-22  李振良  DevOps大咖

本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便。主要用于多台服务器批量执行任务。

非内置Python模块,需要手动安装:pip install fabric
如果安装失败,可以尝试yum安装:yum install fabric
Fabric常用API:

API

描述

示例

local

执行本地命令

local('uname -s')

lcd

切换本地目录

lcd('/opt')

run

执行远程命令

run('uname -s')

cd

切换远程目录

cd('/opt')

sudo

sudo方式执行远程命令

sudo('/etc/init.d/httpd start')

put

上传本地文件或目录到远程主机

put(remote_path, local_path)

get

从远程主机下载文件或目录到本地

put(local_path, remote_path)

open_shell

打开一个shell,类似于SSH连接到了远程主机

open_shell("ifconfig  eth0")

prompt

获得用户输入信息

prompt('Please input user  password: ')

confirm

获得提示信息确认

confirm('Continue[Y/N]?')

reboot

重启远程主机

reboot()

@task

函数装饰器,引用说明函数可调用,否则不可见


@runs_once

函数装饰器,函数只会执行一次


当我们写好fabric脚本后,需要用fab命令调用执行任务。
命令格式:fab [options][:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…] …
fab命令有以下常用选项:

选项

描述

-l

打印可用的命令(函数)

--set=KEY=VALUE,...

逗号分隔,设置环境变量

--shortlist

简短打印可用命令

-c PATH

指定本地配置文件

-D

不加载用户known_hosts文件

-f PATH

指定fabfile文件

-g HOST

逗号分隔要操作的主机

-i PATH

指定私钥文件

-k

不加载来自~/.ssh下的私钥文件

-p PASSWORD

使用密码认证and/or  sudo

-P

默认为并行执行方法

--port=PORT

指定SSH连接端口

-R ROLES

根据角色操作,逗号分隔

-s SHELL

指定新shell,默认是'/bin/bash -l -c'

--show=LEVELS

以逗号分隔的输出

--ssh-config-path=PATH

SSH配置文件路径

-t N

设置连接超时时间,单位秒

-T N

设置远程命令超时时间,单位秒

-u USER

连接远程主机用户名

-x HOSTS

以逗号分隔排除主机

-z INT

并发进程数

示例:

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全局设定,类似于变量。还有一些常用的属性:

env属性

描述

示例

env.hosts

定义目标主机

env.hosts = ['192.168.1.120:22']

env.exclude_hosts

排除指定主机

env.exclude_hosts =  '[192.168.1.1]'

env.user

定义用户名

env.user='root'

env.port

定义端口

env.port='22'

env.password

定义密码

env.password='123'

env.passwords

定义多个密码,不同主机对应不同密码

env.passwords =  {'root@192.168.1.120:22': '123'}

env.gateway

定义网关

env.gateway='192.168.1.2'

env.roledefs

定义角色分组

env.roledef =  {'web':['192.168.1.11'], 'db':['192.168.1.12']}

env.deploy_release_dir

自定义全局变量,格式:env.+  '变量名'

env.var

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模块,更擅长远程执行命令,文件传输,可灵活的嵌入到运维系统中。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐