Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python Fabric使用详解及示例

python Fabric使用详解及示例

作者头像
py3study
发布于 2020-01-06 10:33:50
发布于 2020-01-06 10:33:50
2.3K01
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:1
代码可运行

abric是基于Python实现的SSH命令行工具,简化了SSH的应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括:命令执行、文件上传、下载及完整执行日志输出等功能。Fabric在Paramiko的基础上做了更高一层的封装,操作起来会更加简单

安装时候需要安装一些依赖包   setuptools-18.5  paramiko-2.4.1  pycrypto-2.6.1  Fabric-1.8.2

wget https://files.pythonhosted.org/packages/ec/6d/b433a14c77ad17b917a9646d5ac96275309170a88fcffc967def7a1ba8ce/setuptools-18.5.tar.gz

wget https://files.pythonhosted.org/packages/ab/82/4cd6cbb2001431aece679c5c496bb49d2094f10e9cc98b9f94fa7261a935/Fabric-1.8.2.tar.gz

wget https://files.pythonhosted.org/packages/60/db/645aa9af249f059cc3a368b118de33889219e0362141e75d4eaf6f80f163/pycrypto-2.6.1.tar.gz

wget https://files.pythonhosted.org/packages/29/65/83181630befb17cd1370a6abb9a87957947a43c2332216e5975353f61d64/paramiko-2.4.1.tar.gz

全部解压安装  python setup.py install

命令格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fab [options] <command>[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...

常用参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-l     #显示定义好的任务函数名
-f     #指定fab入口文件,默认入口文件名为fabfile.py
-f     #指定网关(中转)设备,比如堡垒机环境,填写堡垒机IP即可
-H     #指定目标主机,多台主机用‘,’号分隔
-p     #远程账号的密码,fab执行时默认使用root账户
-P     #以异步并行方式运行多主机任务,默认为串行运行
-R     #指定role(角色),以角色名区分不同业务组设备
-t     #设置设备连接超时时间(秒)
-T     #设置远程主机命令执行超时时间(秒)
-w     #当命令执行失败,发出警告,而非默认中止任务。

示例:test.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from fabric.api import run

#定义一个任务函数,通过run方法实现远程执行‘uname -s’命令
def host_type():   
        run('uname -s')

fab操作命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fab -H localhost host_type 
fab -p 123456 -H localhost  --  'uname -s'

fabfile文件编写

env对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env.hosts   #定义目标主机,可以用IP或主机名表示,以python的列表形式定义。如env.hosts=['192.168.1.21','192.168.1.22']
env.exclude_hosts   #排除指定主机,如env.exclude_hosts=['192.168.1.21']
env.user   #定义用户名,如env.user='root'
env.port   #定义端口,默认为22,如env.port='22'
env.password   #定义密码,如env.password='123456'
env.passwords  #定义多个密码,不同主机对应不同密码,如:env.passwords = {'root@192.168.1.21:22':'123456','root@192.168.1.22:22':'654321'}
env.gateway   #定义网关(中转、堡垒机)IP,如env.gateway='192.168.1.23
env.roledefs   #定义角色分组,比如web组合db组主机区分开来:env.roledefs = {'webserver':['192.168.1.21','192.168.1.22'],'dbserver':['192.168.1.25','192.168.1.26']}
env.deploy_release_dir   #自定义全局变量,格式:env. + '变量名称',如env.age,env.sex等

env.roledefs的使用方法实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env.roledefs = {'webserver':['192.168.1.21','192.168.1.22'],'dbserver':['192.168.1.25','192.168.1.26']}
#引用分组时使用python装饰器方式来进行,如:
@roles('webserver')
def webtask():
    run('/usr/local/nginx/sbin/nginx')
@roles('webserver','dbserver')
def publictask():
    run('uptime')

fabric常用api

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local    #执行本地命令,如local('uname -s')
lcd      #切换本地目录,如lcd('/home')
cd       #切换远程目录
run     #执行远程命令
sudo   #sudo方式执行远程命令,如sudo('/etc/init.d/httpd start')
put     #上次本地文件导远程主机,如put('/home/user.info','/data/user.info')
get     #从远程主机下载文件到本地,如:get('/data/user.info','/home/user.info')
prompt  #获得用户输入信息,如:prompt('please input user password:')
confirm  #获得提示信息确认,如:confirm('Test failed,Continue[Y/N]?')
reboot   #重启远程主机,如:reboot()
@task   #函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑
@runs_once   #函数修饰符,标识的函数只会执行一次,不受多台主机影响

fabric应用示例:

 示例1:查看本地与远程主机信息   fab -f test.py local_task     fab -f test.py remote_task

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from fabric.api import *
env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'

@runs_once   #查看本地系统信息,当有多台主机时只运行一次
def local_task():   #本地任务函数
    local('uname -a')
    
def remote_task():
    with cd('/var/logs'):   #with的作用是让后面的表达式语句继承当前状态,实现:cd /var/logs  && ls -l的效果
        run('ls -l')

示例2:动态获取远程目录列表      fab -f test.py go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.api import *

env.user = 'root'
env.hosts = ['192.168.1.22']
env.password = '123456'

@runs_once   #主机遍历过程中,只有第一台触发此函数
def input_raw():
    return prompt('please input directoryname:',default='/root')

def worktask(dirname):
    run('ls -l'+dirname)

@task    #限定只有go函数对fab命令可见,其他没有使用@task标记的函数fab命令不可用
def go():
    getdirname = input_raw()
    worktask(getdirname)

示例3:网关模式文件上传与执行(中转,堡垒机)  fab -f test.py go

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.user = 'root'
env.gateway = '192.168.1.23'   #定义堡垒机IP,作为文件上传、执行的中转设置
env.hosts = ['192.168.1.21','192.168.1.22']
env.passwords = {
    'root@192.168.1.21:22':'123456',
    'root@192.168.1.22:22':'abcdef',
    'root@192.168.1.23:22':'123abc',  #堡垒机账号信息
}

lpackpath = '/home/install/lnmp.tar.gz'   #本地安装包路径
rpackpath = '/tmp/install'    #远程安装包路径

@task
def put_task():  #上传文件
    run('mkdir -p /tmp/install')
    #默认情况下,当命令执行失败时,Fabric会停止执行后续命令。有时,我们允许忽略失败的命令继续执行,比如run(‘rm /tmp/abc')在文件不存在的时候有可能失败,这时可以用with settings(warn_only=True):执行命令,这样Fabric只会打出警告信息而不会中断执行。
    with settings(warn_only=True):
        result = put(lpackpath,rpackpath)   #上传
    if result.failed and not confirm('put file failed,Continue[Y/N]?'):
        abort('Aborting file put task!')

@task
def run_task():   #安装
    with cd('/tmp/install'):
        run('tar -zxvf lnmp.tar.gz')
        with cd('lnmp/'):    #使用with继承/tmp/install目录位置状态
            run('./centos.sh')

@task
def go():   #上传、安装组合命令
    put_task()
    run_task()

示例4:文件的打包上传和校验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
env.user = 'root'
env.hosts = ['192.168.1.23','192.168.1.24']
env.password = '123456'

@task
@runs_once
def tar_task():
	with lcd("/data/logs"):
		local("tar zcf logs.tar.gz test.log")

@task
def put_task():
	run('mkdir -p /data/logs')
	with cd("/data/logs"):
		with settings(warn_only=True):
			result=put("/data/logs/logs.tar.gz","/data/logs/logs.tar.gz")
		if result.failed and not confirm("put file failed,Continue[Y/N]?"):
			abort('Aborting file put task')

@task
def check_task():
	with settings(warn_only=True):
		lmd5=local("md5sum /data/logs/logs.tar.gz",capture=True).split(' ')[0]
		rmd5=run("md5sum /data/logs/logs.tar.gz").split(' ')[0]
	if lmd5==rmd5:
		print "OK"
	else:
		print "ERROR"
		
def go():
	tar_task()
	put_task()
	check_task()
		
fab -f test.py go

示例5:部署lnmp环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from fabric.colors import *
from fabric.api import *
env.user='root'

env.roledefs={
	'webservers': ['192.168.1.21','192.168.1.22'],
	'dbservers': ['192.168.1.23']
}

env.passwords={
	'root@192.168.1.21:22':'123456',
	'root@192.168.1.22:22':'asdfgh',
	'root@192.168.1.23:22':'654321'
}

@roles('webservers')
def web_task():
	print yellow("install nginx php php-fpm....")
	with settings(warn_only=True):
		run("yum install -y nginx")
		run("yum install -y php-fpm php-mysql php-mbstring php-xml php-mcrypt php-gd")
		run("systemctl enable php-fpm")
		run("systemctl enable nginx")
		
@roles(dbservers)
def db_task():
	print yellow("install mysql...")
	with settings(warn_only=True):
		run("yum install -y mariadb mariadb-server")
		run("systemctl enable mariadb")
		
@roles('webservers','dbservers')
def pub_task():
	print yellow("install ntp....")
	with settings(warn_only=True):
		run("yum install epel-release -y")
		run("yum install ntp -y ")

def deploy():
	execute(pub_task)
	execute(web_task)
	execute(db_task)
	
fab -f test.py deploy

示例:6:生产环境代码发布管理  (打包 发布 回滚)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from fabric.api import *
from fabric.colors import *
from fabric.context_managers import *
from fabric.contrib.console import confirm
import time

env.hosts=['192.168.1.21','192.168.1.22']
env.user='root'
env.password='124530'

env.project_dev_source='/data/dev/webadmin/'
env.project_tar_source='/data/dev/releases/'
env.project_pack_name='release'

env.deploy_project_root='/data/www/webadmin/'
env.deploy_release_dir='releases'
env.deploy_current_dir='current'
env.deploy_version=time.strftime("%Y-%m-%d")+"v2"

@runs_once
def input_version():
	return prompt("please input your roolback version ID ",default="")

@task
@runs_once
def tar_source():
	print yellow("creating source package....")
	with lcd(env.project_dev_source):
		local("tar -zcf %s.tar.gz ." % (env.project_tar_source + env.project_pack_name))
	print green("creating source package success!")
	
@task
def put_package():
	print yellow("start put package....")
	with settings(warn_only=True):
		with cd(env.deploy_project_root+env.deploy_release_dir):
			run("mkdir %s" % (env.deploy_version))
	env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/" +env.deploy_version
	with settings(warn_only=True):
		result=put(env.project_tar_source+env.project_pack_name+".tar.gz",env.deploy_full_path)
	if result.failed and not ("put file failed,Continue[Y/N]?"):
		abort('Aborting file put task')
	with cd(env.deploy_full_path):
		run("tar -zxf %s.tar.gz" % (env.project_pack_name))
		run("rm -rf %s.tar.gz" % (env.project_pack_name))
	print green("put & untar package success!")
	
@task
def make_symlink():
	print yellow("update current symlink")
	env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/" +env.deploy_version
	with settings(warn_only=True):
		run("rm -rf %s" % (env.deploy_project_root+env.deploy_current_dir))
		run("ln -s %s %s" % (env.deploy_full_path,env.deploy_project_root+env.deploy_current_dir))
	print green("make symlink success!")
	
@task
def roolback():
	print yellow("roolback project version")
	versionid=input_version()
	if versionid=='':
		abort("project version Id error,abort!")
	env.deploy_full_path=env.deploy_project_root + env.deploy_release_dir + "/" +versionid
	run("rm -f %s" % (env.deploy_project_root+env.deploy_current_dir))
	run("ln -s %s %s" % (env.deploy_full_path,env.deploy_project_root+env.deploy_current_dir))
	print green("roolback success!")
	
@task
def go():
	tar_source()
	put_package()
	make_symlink()


生产nginx目录配置
root /data/www/webadmin/current;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Fabric自动化运维工具实现远程SSH部署及系统管理
Fabric是基于Python(2.5-2.7)库和命令行来实现SSH远程应用部署及系统管理的工具,使用它,在批量管理远程主机时,不需要一台一台的输入密码登陆,可以把所以主机的用户名和密码写在一个文件里面来操作,下文中有具体实例。
星哥玩云
2022/07/04
4640
自动化运维之Fabric
心情不太好,搞搞代码,提高心境! --程序猿 ---- ****fabric简介**** 一句话:fabric是python语言实现的一个利用ssh高效部署和管理系统的工具。 ---- ****fabric安装**** pip sudo pip install fabric apt-get sudo apt-get install fabric 源码安装 git clone https://github.com/fabric/fabric.git sudo python setup.py install
AlicFeng
2018/06/08
1.9K0
Python远程部署利器Fabric详解-转载
Fabric是一个Python的库,它提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化、流水化地执行Shell命令。因此它非常适合用来做应用的远程部署及系统维护。其上手也极其简单,你需要的只是懂得基本的Shell命令。本文将为大家详细介绍Fabric的使用。
十四君
2019/11/24
1.3K0
SSH连接与自动化部署工具parami
paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方法。可以实现远程命令执行,文件传输,中间SSH代理等功能,相对于Pexpect,封装层次更高。
py3study
2020/01/06
1.4K0
python学习之认识fabric
Fabric is a Python (2.5-2.7) library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks.
py3study
2020/01/07
4160
fabric 初步实践
fabric作为一种强大的运维工具,可以让部署运维轻松很多,最简单的fabric使用,首先设置env.user, env.port, env.hosts, env.password,如:
机械视角
2019/10/23
5670
Python 模块之fabric
Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。
py3study
2020/01/07
1.2K0
Python自动化神奇Fabric
Fabric 是一款可以实现远程执行命令和完成操作的库,相比 Pramiko,Fabric 更加简洁,高效和易用。它提供了很多开箱即用的功能,可以帮助开发者快速实现自动化任务。
Python研究所
2022/06/17
3450
Python自动化神奇Fabric
Python fabric远程自动部署简介
上面只是对Python+fabric自动部署脚本编写方法的简单介绍,在实际应用过程中根据具体需求编写相应的脚本时可以参考如下文章:
叉叉敌
2022/03/11
4810
Fabric:Python远程部署工具
Fabric是一个Python库和命令行工具,旨在为应用部署和系统管理任务的SSH的流水线式操作,使之更加高效和方便。Fabric提供了一套基本的执行本地和远程shell命令、上传和下载文件的操作,包括一些辅助函数,例如驱动正在运行的用户输入或者放弃执行。
py3study
2020/01/15
1.2K0
Fabric远程自动化
运行结果: Hello world! Done. fab -f test.py hello (非默认fabfile.py需要指定)
以谁为师
2019/05/28
7070
python 自动化部署工具-fabri
fabric 默认引用fafile.py,指定执行文件加参数-f,如:fab -H 127.0.0.1 -f fabtest.py test
py3study
2020/01/10
7100
大规模服务器管理利器 Fabric
Fabric 是什么 Fabric 是对服务器进行系统管理、应用部署的自动化脚本工具,特点是可以便捷的支持多台服务器 在一个脚本文件中就可以对多台服务器执行相同或不同的任务 Fabric基于Python,提供了一套简洁的命令集,可以执行常规任务,例如:在本机或者远程服务器执行shell命令、上传/下载文件、提示用户输入进行交互操作等 还有很多高级功能,例如:对服务器进行分组、并行执行任务、对执行错误进行处理等 应用案例 Instagram 是 Facebook 旗下的一个大型图片社交应用,有上千台服务器
dys
2018/04/03
1.5K0
大规模服务器管理利器 Fabric
自动化运维工具Fabric – 智能的执行任务(roles、execute)
该篇文章来源于 Fabric 的官方文档,原文为Intelligently executing tasks with execute 注:该功能只在 Fabric 1.3 版本中有效,主要是使用 execute 功能
星哥玩云
2022/07/03
3390
python之fabric模块
Fabric 是一个用 Python 开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行 Python 脚本就可以轻松部署。
Cyylog
2020/08/19
1.1K0
使用Fabric进行代码的自动化部署
#coding=utf-8 from fabric.api import local, abort, settings, env, cd, run from fabric.colors import * from fabric.contrib.console import confirm
星哥玩云
2022/07/03
4990
使用Fabric一键批量部署上线/线上环境监控
本文讲述如何使用fabric进行批量部署上线的功能 这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码。 前提条件: 1、运行fabric脚本的机器和其他机器tcp_port=22端口通 2、ssh可以登录,你有账号密码 一、先说批量部署上线 先上代码,再仔细讲解,脚本如下 # -*- coding:utf-8 -*- from fabric.colors import * from fabric.api import * from contextlib imp
用户1225216
2018/03/05
1K0
自动化运维工具Fabric – 密码管理(env.password and ssh key)
在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式
星哥玩云
2022/07/03
7330
fabric自动发布django博客系统
sed替换settings.py里面 ALLOWED_HOSTS允许地址、DEBUG模式、static_root静态文件路径
以谁为师
2019/05/31
5100
使用Fabric部署网站应用
以前一直用rsync同步代码到服务器,这种山寨方法用一次两次还可,每天部署10次就麻烦了,最近抽空研究了一下Fabric,发现这个东西部署起来简直太爽了。 Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署。 花10分钟写了一个部署脚本fabfile.py(名字不能变),放到工程目录下: #!/usr/bin/env python # -*- coding: utf-8 -*- from datetime import da
小小科
2018/05/02
1.2K0
相关推荐
Fabric自动化运维工具实现远程SSH部署及系统管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验