轻量级自动化运维工具Fabric的安装与实践
一、背景环境
在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具。
这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事的最爱。
为了方便自动化运维,经常会将Fabric部署在跳板机上。之所以部署跳板机是基于几点考虑的:
1.1基于安全的考虑,只有跳板机上开放了公网IP和SSH Key登录,其他内部的业务机默认只允许内网登录,公网IP地址不对外开放。
1.2为了方便自动化运维部署,跳板机上做了免密码登录,可以直接通过SSH命令操作其他业务机器。
1.3设置了权限控制权限,跳板机上部署了几套key,分别对应于不同的权限分配,可以给公司的同事不同的私钥登录跳板机
Fabric是基于Python实现的ssh命令行工具,简化了ssh的应用程序部署及系统管理任务,它为系统提供了基础的操作组件,可以实现本地或远程Shell命令,包括文件上传、下载、脚本执行及完整执行日志输出等功能。
二、Fabric的安装
安装Fabric时,可以选择采用Python的pip、easy_install及源码安装方式,这些方式能够很方便的解决包依赖关系。
大家可以根据系统环境自行选择最优的安装方法,如果选择pip或easy_install安装方式,若是使用系统最小化安装,注意提前安装gcc、gcc+、make这些基础开发包和python-pip):
yum -y install make gcc gcc++ python-devel python-pip
pip是安装python包的工具,提供了安装包、列出已经安装的包、升级包及卸载包的功能,可以通过pip工具直接安装Fabric。
使用pip 安装 Fabric的命令:
pip install fabric
这是推荐使用源码安装的方式:
yum -y install python-setuptools
cd /usr/local/src
wget https://pypi.python.org/packages/source/F/Fabric/Fabric-1.3.0.tar.gz --no-check-certificate
tar -xvf Fabric-1.3.0.tar.gz
cd Fabric-1.3.0
python setup.py install
下载完成后,安装相关的软件包。
然后解压源码包,使用Python命令运行安装脚本,进行安装。
等待安装命令运行完毕后,就可以去验证了。
这里使用IPython进行验证,在交互解释器下,输入import fabric 查看是否导入模块成功,若无报错则表示fabric当前已经安装成功。

三、Fabric核心API
3.1 Fabric的核心API主要有7类:
带颜色的输出类(color output)、上下文管理类(context managers)、装饰器类(decorators)、网络类(network)、操作类(operations)、任务类(tasks)、工具类(utils)。
Fabric提供了一组操作简单但功能强大的fabric.api命令集,简单地调用这些API就能完成大部分应用场景的需求,Fabric支持的常用命令及说明如下。
local:执行本地命令,如local ('uname -s')。
lcd:切换本地目录,如lcd ('/home')。
cd:切换远程目录,如cd ('/data/logs/')。
run:执行远程命令,如run ('free -m')。
sudo:以sudo方式执行远程命令,如sudo ('/etc/init.d/httpd start')。
put:上传本地文件到远程主机,如put ('/home/user.info','/data/user.info')。
get:从远程主机下载文件到本地,如get ('/home/user.info','/data/user.info')。
prompt:获得用户输入信息,如prompt ('please input user password:')。
confirm:获得提示信息确认,如confirm ('Test failed,Continue[Y/N]')。
reboot:重启远程主机,如reboot ()。
@task:函数修饰符。新版本的Fabric对面向对象的特性和命名空间有很好的支持。面向对象的继承和多态特性,对代码的复用极其重要。新版本的Fabric定义了常规的模块级别的函数,并带有装饰器@task,这会直接将该函数转化为task子类。该函数名会被作为任务名,后面会举例说明@task的用法。
@runs_once:函数修饰符。标识此修饰符的函数只会执行一次,不受多台主机影响。
3.2 下面来看看@task的用法,它可以为任务添加别名,命令如下:
from fabric.api import task
@task(alias='dwm')
def deploy_with_migrations():
pass
用fab命令打印指定文件中存在的命令,如下:
fab -f /home/yhc/test.py --list
命令显示结果如下所示:
Available commands:
deploy_with_migrations
dwm
还可以通过@task来设置默认的任务,比如deploy(部署)一个子模块,命令如下:
from fabric.api import task
@task
def migrate():
pass
@task
def push()
pass
@task
def provision():
pass
@task(default=True)
def full_deploy():
provision()
push()
migrate()
fab -f /home/yhc/test.py --list
结果如下所示:
Available commands:
deploy
deploy.full_deploy
deploy.migrate
deploy.provision
deploy.push
也可以通过@task以类的形式定义任务,例如:
from fabric.api import task
from fabric.tasks import Task
class MyTask(Task):
name = "deploy"
def run(self, environment, domain="whatever.com"):
run("git clone foo")
sudo("service apache2 restart")
instance = MyTask()
下面采用@task方式的代码跟上面的代码效果是一样的:
from fabric.api import task
from fabric.tasks import Task
@task
def deploy(environment, domain="whatever.com"):
run("git clone foo")
sudo("service apache2 restart")
大家可以对比看看,是不是采用@task函数修饰器的方式更为简洁和直观呢?
关于@task修饰器的用法和其他fabric.api命令,请参考Fabric官方文档http://fabric-chs.readthedocs.org/zh_CN/chs/tutorial.html。
3.3这里举个例子说明一下@runs_once用法,源码文件/home/yhc/test.py文件内容如下所示:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from fabric.api import *
from fabric.colors import *
env.user = "root" #定义用户名,env对象的作用是定义Fabric指定文件的全局设定
env.password = "redhat" #定义密码
env.hosts = ['192.168.1.204','192.168.1.205']
#定义目标主机
@runs_once
#当有多台主机时只执行一次
def local_task(): #本地任务函数
local("hostname")
print red("hello,world")
#打印红色字体的结果
def remote_task(): #远程任务函数
with cd("/usr/local/src"):
run("ls -lF | grep /$")
#with是Python中更优雅的语法,可以很好地处理上下文环境产生的异常,这里用了with以后相当于实现了"cd /var/www/html && ls -lsart"的效果。
通过fab命令调用local_task本地任务函数,命令如下:
fab -f test.py local_task
结果如下所示:
[192.168.1.204] Executing task 'local_task'
[localhost] local: hostname
client.cn7788.com
My hostname is client.cn7788.com
Hello,world!
Done.
上述命令显示的虽然不是本机的IP地址,但实际上并没有在主机192.168.1.204上面执行命令,而是在本地主机client.cn7788.com(IP为192.168.1.206的机器)上执行了命令,并以红色字体显示了 “hello,world”和“My hostname is client.cn7788.com”。
调用remote_task远程函数显示结果,分别在204和205的机器上打印/usr/local/src/下面存在的目录,结果如下:
[192.168.1.204] Executing task 'remote_task'
[192.168.1.204] run: ls -lF | grep /$
[192.168.1.204] out: drwxr-xr-x. 2 root root 4096 Nov 22 00:01 download/
[192.168.1.204] out: drwxr-xr-x. 9 501 games 4096 Nov 19 04:44 Fabric-1.3.0/
[192.168.1.204] out: drwxr-xr-x. 2 root root 4096 Nov 22 00:01 object/
[192.168.1.205] Executing task 'remote_task'
[192.168.1.205] run: ls -lF | grep /$
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 mysql/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 puppet/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 22 04:58 soft/
[192.168.1.205] out: drwxr-xr-x. 2 root root 4096 Nov 3 07:56 test/
Done.
Disconnecting from 192.168.1.204... done.
Disconnecting from 192.168.1.205... done.
轻量级自动化运维工具Fabric的安装与实践的更多相关文章
- Python自动化运维工具fabric的安装
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机
使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...
- Python自动化运维工具-Fabric部署及使用总结
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- Linux轻量级自动化运维工具— Ansible
Ansible 是什么 ? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配 ...
- 自动化运维工具fabric使用教程
摘要:当需要同时管理许多服务器时,如果我们一台一台登陆上去操作会显得费时又费力.此时我们可以用fabric这个包提供的API来编写python脚本完成服务器集群的统一管理. 核心原理:fabric为主 ...
- 自动化运维工具Fabric - 密码管理(env.password and ssh key)
在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式 注:本文主要参考官方文档 P ...
- Ansible自动化运维工具使用
概述本文描述自动化运维工具 Ansible 的安装及基础使用方法,包含: Centos 下的安装主机配置Ad-Hoc command(命令行执行)Playbook (任务剧本)Ansible 和 Sa ...
- 自动化运维工具之 Ansible 介绍及安装使用
一.初识Ansible 介绍: Absible 使用 模块(Modules)来定义配置任务.模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好的做法,使每个模块幂等.A ...
- 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操
前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...
随机推荐
- 获取IP相关信息和文件上传
获取IP相关信息 要获取用户访问者的IP地址相关信息,可以利用依赖注入,获取IHttpConnectionFeature的实例,从该实例上可以获取IP地址的相关信息,实例如下: var connect ...
- fabu dao fenleizhong
IsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregatedIsAggregated IsAggregated ...
- CSS3——transform2D的应用
前言: 关于CSS3,我想最让人感到有意思的就是2D和3D的技术,这让我们的网页立马丰富起来,可以让我们完成一些很酷很炫的效果,比如旋转木马.经过一段时间的学习,让我对CSS3有了更近一步的了解,在此 ...
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变 ...
- 关于async和await的一些误区
微软的MSDN说async和await是“异步”,但是不少人(包括笔者自己)有一些误区需要澄清:为什么await语句之后没有执行?不是异步吗? [示例代码] public partial class ...
- Java基础(十二)IO输入输出
一.IO 概述 1.IO 概念 IO:I 代表 Input 输入:O 代表 Output 输出. Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入. ...
- Java--详解WebService技术
Java--详解WebService技术 一.什么是 webservice WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓跨编程语言和跨操作平台,就是说服务端程序采用jav ...
- mysql load data infile auto increment id
1. 问题描述 当使用load data infile 向表中插入数据 而主键id是 auto_increment 时 ,执行 load data 不会报错 但插入也不成功 2. 问题解决 2.1 方 ...
- html+css 布局篇
float 做了float后有一些不好的影响. 1.背景不能显示 由于浮动产生,如果对父级设置了(CSS background背景)CSS背景颜色或CSS背景图片,而父级不能被撑开,所以导致CSS背景 ...
- Python入门-深浅拷贝
首先我们在这里先补充一下基础数据类型的一些知识: 一.循环删除 1.前面我们学了列表,字典和集合的一些操作方法:增删改查,现在我们来看一下这个问题: 有这样一个列表: lst = ['周杰伦','周润 ...