Python 远程部署利器 Fabric2 模块

fabric 官网英文文档:http://www.fabfile.org/

《Python自动化运维技术与最佳实践》

如何用 Fabric 实现无密码输入提示的远程自动部署:

fabric实现远程操作和部署:

简介

Fabric 是一个 Python 的库,同时它也是一个命令行工具。它提供了丰富的同 SSH 交互的接口,可以用来在本地或远程机器上自动化、流水化地执行 Shell 命令。使用 fabric 提供的命令行工具,可以很方便地执行应用部署和系统管理等操作。因此它非常适合用来做应用的远程部署及系统维护。其上手也极其简单,你需要的只是懂得基本的 Shell 命令。

fabric 依赖于 paramiko 进行 ssh 交互,fabric 的设计思路是通过几个 API 接口来完成所有的部署,因此 fabric 对系统管理操作进行了简单的封装,比如执行命令,上传文件,并行操作和异常处理等。

paramiko 是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric ansible 内部的远程管理就是使用的 paramiko 来现实。

fabric 简介 和 各个版本差异比较:http://www.mamicode.com/info-detail-2337088.html

1、Python 官网发布的地址

  • Fabric1:https://pypi.org/project/Fabric/
  • Fabric2:https://pypi.org/project/fabric2/
  • Fabric3:https://pypi.org/project/Fabric3/

2、区别

  • 1)Fabric1、Fabric和fabric2:Fabric 和 Fabric2 在 Pypi 中就是同一个东西,fabric2 只是 Fabric 的替代名称,为了便于使用备用名称进行安装。Fabric2 和之前的 Fabric1 相比,完全重写了,接口和功能都有很大改动,官网也不建议继续用 Fabric1,建议升级到 Fabric2。‘而最新版也早就支持 Python 3.4+、Python2.7 了。
  • 2)Fabric3:Fabric3 是非官网的,是之前使用 Fabric 时,没有支持 Python3 的版本,有人fork 出来,加了 Python3 的支持,但现在应该已经不维护了。

3、总结

尽量使用最新的 Fabric2。

Fabric 在升级 2.x 之后,几乎就是重写了。很多以前的用法都变了,然后在 1.x 时代,本地和远程都是用一套代码处理,但是 2.x 的时候将 local 处理部分和远程处理部分分别拆分为 fab 和 invoke了,拆分的理由可以参考 这里。

忘记 1.x 的一切,然后从头开始

  • http://docs.fabfile.org/en/2.3/getting-started.html

一、fabric2 模块使用

fabric2 是 python 的一个库,同时也是命令行工具,使用 fabric2 模块,可以方便的执行应用部署和系统管理等操作
fabric2 依赖于paramiko 进行 ssh 交互,fabric2 的设计思路是通过几个 API 接口来完成所有的部署

安装:pip install fabric2  -i "https://pypi.doubanio.com/simple/"

fabric2  的简单使用

from fabric2 import Connectiondef deploy():# 如果服务器配置了ssh免密码登录,就不需要 connect_kwargs 来指定密码conn = Connection("root@192.168.44.13", connect_kwargs={"password": "123456"})conn.run("ls")with conn.cd('/home'):conn.run("mkdir testdir")with conn.cd('/home/testdir'):conn.run('mkdir aaa')conn.put('test', '/home/testdir')  # 上传文件if __name__ == '__main__':deploy()

Connection 参数详解

def __init__(self,host,           # 主机 ipuser=None,      # 用户名port=None,      # ssh 端口,默认 22config=None,    # 登录配置文件gateway=None,   # 连接网关forward_agent=None,     # 是否开启 agent forwardingconnect_timeout=None,   # 设置超时connect_kwargs=None,    # 设置密码登录 connect_kwargs={"password": "123456"}# 还是密钥登录 connect_kwargs={"key_filename": "/home/myuser/.ssh/id_rsa"}inline_ssh_env=None,)

conn 对象属性

run        # 执行远程命令,如:run('uname -a')
cd         # 切换远程目录,如:cd('/root'); with conn.cd('/root'),继承这个状态
put        # 上传本地文件到远程主机,如:put('/root/test.py','/root/test.py')
get        # 获取服务器上文件,如:get('/root/test.py')
sudo       # sudo方式执行远程命令,如: sudo('service docker start')
local      # 执行本地命令,如:conn.local('ls')

二、 fabric2 对多台机器使用

对多台机器使用时,Connection 

from fabric2 import Connectionfor host in ('root@192.168.44.20','root@192.168.44.21','root@192.168.44.22'):result = Connection(host,connect_kwargs={'password':'123456'}).run('uname -s')print("{}: {}".format(host,result.stdout.strip()))

输出结果

Linux
root@192.168.44.20: Linux
Linux
root@192.168.44.21: Linux
Linux
root@192.168.44.22: Linux

对多台机器使用时,SerialGroup

from fabric2 import SerialGrouppool = SerialGroup('root@192.168.44.20','root@192.168.44.21','root@192.168.44.22',connect_kwargs={'password':'123456'})
print(pool)
pool.run('uname -s')
for conn in pool:conn.run('mkdir testfiles')

扩展,运行本地命令

import invokeinvoke.run('ls')

三、使用示例:

From:https://www.walkerfree.com/article/183

import getpass
from fabric import Connection, task@task
def pack(c):# 这里的c参数我理解为是Connection连接的本地 然后根据setup.py进行项目打包c.run('python setup.py release sdist --format=gztar')@task
def deploy(c):# 输入服务器的登录用户名user = raw_input('Input login user name: ')# 输入服务器的登录地址host = raw_input('Input login host: ')# 输入服务器的项目目录地址root = raw_input('Input project root path:')# 输入服务器的登录密码user_pass = getpass.getpass('Input login user pass:')# 获取包的全名称result = c.run('python setup.py --fullname', hide=True)dist = result.stdout.strip()filename = '%s.tar.gz' % dist# 获取包的名称 - 这个名称可以根据自己的需求来自定义,这里主要是为了下面supervisor启动时使用result = c.run('python setup.py --name', hide=True)name = result.stdout.strip()# 远端服务器连接创建remote = Connection('%s@%s' % (user, host),connect_kwargs={"password": user_pass})# 上传文件到远端服务器remote.put('./dist/%s' %filename, remote='%s' % root)# 在远端服务器上执行下面命令 - 这个会默认输出你在远端服务器展示的信息result = remote.run('cd %s &&\source .env/bin/activate &&\ls -al && type python &&\pip install %s &&\supervisorctl restart walkerfree' % (root, filename))

使用方式如下:fab pack deploy

这个命令其实也可以分布执行:
fab pack 
fab deploy

Fabric 自升级至2.x后,API大变,fab工具也逐渐边缘化,其编程方式也与普通的python脚本逐渐趋同。以下是Fabric1.x与2.x大致的差异与变化,用 python 脚本展示:

#!/bin/python
# coding:utf-8
from fabric import ThreadingGroup as Group
import ConfigParser#fabric2.x不再支持1.x中的from fabric.colors import *方式在终端上输出有颜色的执行结果
#可以通过导入blessings包的方式来完成相关操作
from blessings import Terminal
t = Terminal()def run_command(command_section, connection):for option in cf.options(command_section):#在shell中执行grep命令后,如果没有相关信息输出,grep的返回值为0,需要添加warn=True来#避免UnexpectedExit异常的触发result = connection.run(cf.get(command_section, option), warn=True)if option.find('grep', 0) != -1 and result.stdout == '':print(option + " exec complete!")if __name__ == '__main__':#可以通过额外定义配置文件的方式,实现执行命名与脚本代码的分离cf = ConfigParser.ConfigParser()cf.read('command.conf')#以Group执行的方式也发生了变化,具体可参考api文档for aims_connection in Group('aims@10.99.1.24'):#通过红色加粗下划线的方式显示print t.red_underline_bold(str(aims_connection))run_command("common_command", aims_connection)run_command("aims_command", aims_connection)for ib_connection in Group('ibuser@10.99.1.27'):print t.red_underline_bold(str(ib_connection))run_command("common_command", ib_connection)run_command("ib_command", ib_connection)

配置文件:

[common_command]
df_command = df -h | awk 'NR > 1 && $5+0 > maxspace {maxspace = $5+0;name = $6} END { print name " has " maxspace"%"} '[aims_command]
grep_syserror_command = grep -i error /var/log/syslog
grep_syswarn_command = grep -i warning /var/log/syslog[ib_command]
jboss_warn = grep -i warn /opt/logs/services/jboss.log | grep -v 'null'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】近期Coolite控件的技术点总结

1。Coolite下如何自定义控件样式表Code1<style type"text/css"> 2 .x-grid3-td-fullName .x-grid3-cell-inner {}{ 3 font-family:tahoma, verdana; 4 display:block; 5 font-weight:normal; 6 font-style…

Anaconda 完全入门指南

From&#xff1a;https://www.jianshu.com/p/eaee1fadc1e9 Anaconda官网&#xff1a;https://www.anaconda.com/ Anaconda 官网 文档&#xff1a;http://docs.anaconda.com/anaconda/user-guide Anaconda介绍、安装及使用教程&#xff1a;https://zhuanlan.zhihu.com/p/32925…

Effective Java~43. 方法引用优于Lambda

Java 提供了一种生成函数对象的方法&#xff0c;比 lambda 还要简洁&#xff0c;那就是&#xff1a;方法引用&#xff08; method references&#xff09;。下面是一段程序代码片段&#xff0c;它维护一个从任意键到整数值的映射。如果将该值解释为键的实例个数&#xff0c;则该…

linux资源使用统计指南,指南:工作量分析文档

指南&#xff1a;工作量分析文档工作量分析文档工作量分析文档用于在不同的性能测试中确定要使用的变量并定义变量值&#xff0c;利用这些性能测试可以模拟主角特征、最终用户业务功能(用例)、负载和容量。主题软件质量要从不同的维度来进行评估&#xff0c;其中包括可靠性、功…

linux 下修改日期和时间

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2009年11月13日的命令如下。 #date -s 11/13/09 将系统时间设定成下午1点12分0秒的命令如下。#date -s 13:12:00 ---- 注意&#xff0c;这里说的是系统时间&#xff0c;是linux由操作系统维护的。 ---- 在系统…

Linux 输入输出重定向 2>/dev/null和>/dev/null 2>1和2>1>/dev/nul

From&#xff1a;https://www.cnblogs.com/520playboy/p/6275022.html 2>/dev/null 和 >/dev/null 2>&1 和 2>&1>/dev/null &#xff1a;https://blog.csdn.net/zhongqi2513/article/details/78613768 连接远程机器执行 shell 命令的一个使用示例&…

c语言向指定文件写入程序,C语言同时向不同的文件写入不同的数据

C语言同时向不同的文件写入不同的数据这个我写了好久才写出来的&#xff0c;之前不知道是什么原因总是不能同时一起写&#xff0c;而且写完一个程序就死了&#xff0c;后来在网上查到一篇文章 http://blog.csdn.net/feixiaoxing/article/details/7237649通过修改变成以下代码。…

Effective Java~44. 坚持使用标准的函数接口

在 java.util.Function 中有 43 个接口。不能指望全部记住它们&#xff0c;但是如果记住了六个基本接口&#xff0c;就可以在需要它们时派生出其余的接口。基本接口操作于对象引用类型。 Operator 接口表示方法的结果和参数类型相同。 Predicate 接口表示其方法接受一个参数并…

SQL Server 执行 字符串

EXEC (字符串或变量) 例&#xff1a; EXEC (SELECT * FROM Orders) 或 DECLARE sql nvarchar(50)SET sqlSELECT * FROM OrdersEXEC (sql)转载于:https://www.cnblogs.com/duwx/archive/2009/11/19/1606152.html

Python爬取大量数据时防止被封IP

From&#xff1a;http://blog.51cto.com/7200087/2070320 基于scrapy框架的爬虫代理IP设置&#xff1a;https://www.jianshu.com/p/074c36a7948c Scrapy: 针对特定响应状态码&#xff0c;使用代理重新请求&#xff1a;http://www.cnblogs.com/my8100/p/scrapy_middleware_aut…

c语言错误c4430,声明*C某类::Getdocument();(已声明,不兼容)

创建了一个CRightWindow类&#xff0c;基类为CScrollView&#xff0c;在.h文件中如下&#xff1a;public:CMy2015Doc* GetDocument(); // error C2143: 语法错误 : 缺少“;”(在“*”的前面)// error C4430: 缺少类型说明符 – 假定为 int。注意: C 不支持默认 int在…

CollapsiblePanel控件

CollapsiblePanel 控件属性将被初始化如下面的示例代码所示&#xff0c;斜体属性为可选属性。 <ajaxToolkit:CollapsiblePanelExtender ID"cpe" runat"Server"TargetControlID"Panel1"CollapsedSize"0"ExpandedSize"300"…

Effective Java~45. 谨慎使用Stream

在 Java 8 中添加了 Stream API&#xff0c;以简化顺序或并行执行批量操作的任务。 该 API 提供了两个关键的抽象&#xff1a;流(Stream)&#xff0c;表示有限或无限的数据元素序列&#xff0c;以及流管道 (stream pipeline)&#xff0c;表示对这些元素的多级计算。 Stream 中的…

shell 中 $(( )) 与 $( ) 还有 ${ } 的区别

From&#xff1a;http://blog.chinaunix.net/uid-14351756-id-2820651.html $( ) 与 (反引号) 在 bash shell 中&#xff0c;$( ) 与 (反引号) 都是用来做命令替换用(command substitution)的。 所谓的命令替换与我们第五章学过的变量替换差不多&#xff0c;都是用来重组命…

最近发包给朋友,搞定软件小活儿、解决小功能模块的感受

有时候也想&#xff0c;所有的事情都靠自己解决&#xff0c;太辛苦了太累了&#xff0c;在不差钱的这个年代&#xff0c;有些能让别人做的事情&#xff0c;就让别人做吧&#xff0c;但是一直找不到合适的人&#xff0c;什么叫合适的人&#xff1f;我简单的说几下&#xff0c;不…

c语言数列偶数在奇数前面,奇数

奇偶校验2021-05-19 15:03:06奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验&#xff0c;反之&#xff0c;称为偶校验。奇偶校验需要一位校验位&#xff0c;即使用串口通…

利用自定义web-font实现数据防采集

From&#xff1a;https://blog.csdn.net/fdipzone/article/details/68166388 完整源码&#xff1a;https://download.csdn.net/download/fdipzone/9798142 web-font介绍 web-font 是 CSS3 中的一种标记 font-face&#xff0c;在 font-face 声明里&#xff0c;你可以声明一种字…

数字证书~证书链

来源&#xff1a;客户端认证https服务端证书过程详解——证书链_huzhenv5的博客-CSDN博客_证书链认证过程 基本概念 证书 首先&#xff0c;我们看看在wikipedia上对证书的定义&#xff0c;In cryptography, a public key certificate (also known as a digital certificate o…

修改Netbeas的注释结构

Eclipse修改注释的方法&#xff1a;  窗口-》首选项-》java-》代码样式-》代码模板-》注释-》方法-》确定&#xff0c;下面就可以修改了  Netbeans修改注释的方法&#xff1a;  工具->模板 打开 看见那一排列表没有 展开Java 选择Java类 点击 在编辑器中打开 …

c语言assign用法,object-c语言的nonatomic,assign,copy,retain的区别

nonatomic&#xff1a;非原子性访问&#xff0c;不加同步&#xff0c;多线程并发访问会提高性能。如果不加此属性&#xff0c;则默认是两个访问方法都为原子型事务访问。(atomic是Objc使用的一种线程保护技术&#xff0c;基本上来讲&#xff0c;是防止在写未完成的时候被另外一…