自动化运维工具Fabric的简单使用

Posted zzuseme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动化运维工具Fabric的简单使用相关的知识,希望对你有一定的参考价值。

最近由于工作中某些例行操作极大增加了开发的工作量,因此写了一个python脚本来处理大量重复性操作
先来卖个关子:曾经有句名言----凡是要重复两遍的工作都值得写一个脚本来实现.
再来卖个关子:最近有句名言----人生苦短,我用python


主要讲下fabric包的优势吧:

  1. 可以先定义一连串的封装主机命令细粒度的函数,然后执行一个大函数来一口气把这些操作都做完;

  2. 也可以只执行细粒度的函数,来做特定的几个操作。这是不是极大的方便了我们灵活的对主机的控制操作,也方便调试

  3. 而且一些允许失败的操作还可以控制是否忽略其错误。同时上述提到的操作,可以同时作用在一堆机器上;也就是说循环主机ip列表来执行相同命令。


fabric貌似不支持python3的版本,如果是python2.5-2.7才可以使用(看起来这货已经有点老了)

安装

在线安装

#安装命令
pip install fabric
#或者
easy_install fabric
注:如果是python2.7.9以上版本,自带pip包管理工具,否则需要先联网安装pip,如果是内网主机并且无pip工具,则需要从能联网的linux机器上安装好,再移植pip以及fabric包


离线安装

#1. 联网主机安装pip命令(如果报错,可能还需要apt-get或yum安装依赖)
wget 'https://bootstrap.pypa.io/get-pip.py'
python get-pip.py
pip install fabric
#2. 这样在我ubuntu上会有包存在,
#通过freeze生成requirements.txt文件
#通过命令导出到wheel目录
pip freeze >requirements.txt
pip download -d wheel -r requirements.txt
注:我这截图包括了wheel目录,get-pip.py,和freeze生成的requirements.txt统统打包上传到离线主机

#3.上传完后执行,此处针对python低版本要先安装pip
python get-pip.py --no-index --find-links=./wheel
#4. 针对最后一行命令,可能不会那么一帆风顺,因为wheel的编译依赖于openssl-devel python-devel等库,
#离线主机的话,还可能去http://rpm.pbone.net手动下载rpm包并上传
#在我安装时还通过yum localinstall安装openssl-devel库
pip install --no-index --find-links=./wheel -r requirements.txt


使用解释

我来根据我创建的脚本的写法来解释下吧

1. 最开始是引用,包括sys,os等内部库,照猫画虎即可
from __future__ import with_statement
from fabric.api import env, run, get, put, runs_once, local,settings, abort
from fabric.colors import red, green, yellow
from fabric.contrib.console import confirm
from glob import glob
import sys
import os
2. 脚本设置好env.hosts全局数组后,将循环该主机列表执行执行操作,除非指定了@run_once
env.hosts = ['135.64.20.131', '135.64.20.133','135.64.20.142','135.64.20.143','135.64.20.144','135.64.20.145','135.64.20.146']
env.user = 'uni此处隐去'
env.password = '此处隐去'
3. 函数就是功能,通过fab func函数名来执行该功能,比如此处定义了一个hello。来执行打印Hello Host!
def hello(): 
print("Hello Host!")
4. 比如我要经常使用的小功能包括上传,下载,远程解压等等,那么通过把不同的小功能编写,再组合就可以实现复杂的部署脚本。 func可以包含其他的子func,这样一个大的功能可以包含若干小的子功能。方便把一些常用的动作组合成多种,来实现复杂功能。
def putfile(localfilenames=''):
print("put files")
put('%s' % localfilenames,'./')
def getfile():
print("get files")
'''hard coding, just for example'''
get('~/*.sum','./')
def extractfile():
print("extracting files")
'''hard coding, just for example'''
run('tar -xvf soft64_patch.201707131800.tar')
5. api是很容易使用的,访问其官网查询[http://www.fabfile.org],比如远程执行命令用run,本地执行命令用local,上传用put,下载用get
6. 我写的python fabric脚本功能主要为了是实现7台主机soft包中所有文件MD5差异的比对.因此增加了md5sum功能,同时使用with上下文变量可以忽略diff错误,继续比对
def findmd5():
run('find soft64 -type f |sort -k2| xargs md5sum > `hostname`.sum')
def difftwo(base = '',input = ''):
diffstr = "diff " + base + ' ' + input
print(yellow(diffstr,True))
with settings(warn_only=True):
result = local(diffstr, capture=True)
print result
if result.failed and not confirm("diff found. Continue anyway?"):
abort("Aborting at user request.")
7. @run_once 是为了无论多少台主机,只执行一次该函数,本地选择一个基准进行摘要比较
@runs_once
def localDiffs():
local('ls ./*sum')
print(yellow("please choose one local file as basesum:", True))
basefile=sys.stdin.readline().strip()
if basefile == '':
pass
print("basefile is %s" % basefile)
filelist = glob('./*.sum')
print("filelist are %s" % filelist)
for s in filelist:
if s==basefile:
continue
print("processing is %s" % s)
difftwo(basefile,s)
8. 最后组合起来成一个大命令
def deploy():
hello()
findmd5()
getfile()
9. 把这个文件保存为默认的fabfile.py(注意:如果保存为其他名称执行方式为fab -f somename.py func)


操作有两条命令:

简单解释下:

  1. deploy命令作用是用ssh登陆主机,执行find和MD5摘要保存成文件,并拉到本地目录,他是多个子命令的组合

  2. localDiffs命令的作用是,在本地目录中选择一个摘要文件作基准,然后和其他摘要文件比对,只执行一次。

fab deploy
fab localDiffs


Output

图1图2

可以看到两条命令搞定soft包的差异比对,目前在测试redhat7上面就有环境

欢迎提问。


以上是关于自动化运维工具Fabric的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维工具fabric的简明使用手册

自动化运维工具Ansible的简单使用

Python3自动化运维之Fabric模版详解

自动化运维工具之ansible的简单应用

python自动化运维七:fabric

python 自动化部署工具Fabric简介