Fabric 可以通过 SSH 在多台客户端主机上批量执行任务,是基于 paramiko 封装开发的,paramiko 更底层一些,安装方法如下:

[root@localhost ~]$ yum install -y gcc python-pip python-devel     # 安装基础软件包
[root@localhost ~]$ pip install pycrypto==2.3 # 安装 paramiko 的依赖包,paramiko 使用 ssh 登录需要用到 pycrypto 来提供加密算法,保证 ssh 安全性
[root@localhost ~]$ pip install paramiko==1.12.4 # 安装 Fabric 的依赖包,Fabric 是基于 paramiko 封装的
[root@localhost ~]$ pip install fabric==1.8.3 # 最后安装 Fabric,安装之后会提供 fab 命令,也会提供很多 Fabric 的 API

Fabric 简单用法:

[root@localhost ~]$ cat fabfile.py     # 需要定义一个fabfile.py文件,文件名是固定的

from fabric.api import run # 使用Fabric提供的API,run用来远程执行命令 def getHostname(): # 定义一个函数,用来获取主机名
run('hostname')
[root@localhost ~]$ fab -H 192.168.216.130 getHostname    # 通过 fab 命令来调用 fabfile.py 文件
[192.168.216.130] Executing task 'getHostname' # -H 192.168.216.130 用于指定对哪个远程主机进行操作
[192.168.216.130] run: hostname # getHostname 表示执行 fabfile.py 文件里的哪个函数
[192.168.216.130] out: localhost.localdomain # 注意:使用 Fabric 的前提是保证 ssh 可以通过密钥登录
[192.168.216.130] out: Done.
Disconnecting from 192.168.216.130... done.

Fabric 使用环境变量:

[root@localhost ~]$ cat fabfile.py    # 可以在 fabfile.py 里通过 env 自定义环境变量
# 这些环境变量的变量名是固定的,使用 fab 命令去执行的时候会自动读取这些环境变量
from fabric.api import run, env env.hosts = ['192.168.216.130', '192.168.216.131'] # 定义要操作的远程主机
env.user = 'root' # 定义使用哪个用户登录远程主机 def getHostname():
run('hostname')
[root@localhost ~]$ fab getHostname
[192.168.216.130] Executing task 'getHostname'
[192.168.216.130] run: hostname
[192.168.216.130] out: localhost.localdomain
[192.168.216.130] out: [192.168.216.131] Executing task 'getHostname'
[192.168.216.131] run: hostname
[192.168.216.131] out: localhost.localdomain
[192.168.216.131] out: Done.
Disconnecting from 192.168.216.131... done.
Disconnecting from 192.168.216.130... done.

Fabric 常用环境变量:

env.hosts            # 定义目标主机
env.exclude_hosts # 排除指定主机
env.user # 定义用户名
env.port # 定义端口,默认为 22
env.password # 定义密码
env.roledefs # 定义角色

Fabric 常用 API:

run      # 远程执行命令,如 run('hostname')
env # 用于定义内置属性,如 env.hosts = ['ip1', 'ip2', 'ip3', ...]
put # 上传本地文件到远程主机,如 put('/etc/passwd', '/tmp/passwd')
get # 从远程主机下载文件到本地,如 get('/etc/passwd', '/tmp/passwd')
prompt # 获得用户输入信息,如 prompt('please input user password: ')
confirm # 获得提示信息确认,如 confirm('Test failed, Continue[Y/N]: ')

fab 命令:

-H    # 指定对哪台远程主机进行操作,如果有多台用逗号隔开
-R # 指定对哪种角色的主机进行操作,角色需要在fabfile.py文件中自定义
-f # 指定fab入口文件,默认入口文件名为fabfile.py
-t # 指定连接到远程主机的超时时间
-T # 指定连接到远程主机后命令执行的超时时间

扩展:Fabric 打印颜色

#!/usr/bin/env python
#-*- coding:utf-8 -*- from fabric.colors import * print red('Hello World')
print blue('Hello World')
print cyan('Hello World')
print white('Hello World')
print green('Hello World')
print yellow('Hello World')
print magenta('Hello World')
print magenta('Hello World', bold=True)

批量执行命令:fabric的更多相关文章

  1. linux集群批量执行命令

    因为工作需要,需要修改集群中机器的配置,一台一台的修改太浪费时间,就想能不能通过自动化脚本批量执行命令,尝试写一个,自己shell不熟悉,写的有点渣渣 if [ "$#" -ne ...

  2. linux下远程服务器批量执行命令及SFTP上传文件 -- python实现

    之前写过一个python远程执行命令的脚本,但在一个性能测试中,要将程序批量分发到不同服务器,程序无法使用,再将之前的脚本更新,加入批量上传的功能.之前脚本地址:http://www.cnblogs. ...

  3. shell脚本批量执行命令----必需判断上一步执行结果--没有捷径

    # 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...

  4. [转] ansible批量执行命令展示

    [From] https://blog.csdn.net/zhydream77/article/details/81223805 ansible命令基础 • ansible <host-patt ...

  5. Perl脚本通过Expect登陆多台设备批量执行命令并Log

    本例子尝试使用Perl脚本借助Expect模块实现如下目的: 登陆多台设备 设备登陆信息按如下格式存放于文件中. $ cat hosts.txt 192.168.30.7:node1:telnet:b ...

  6. Python 实现远程服务器批量执行命令

    paramiko 远程控制介绍 Python paramiko是一个相当好用的远程登录模块,采用ssh协议,可以实现linux服务器的ssh远程登录.首先来看一个简单的例子 import parami ...

  7. windows 批量执行命令的脚本

    因为老板一个电话,我的国庆节就没了....,老板要我写个东西,能批量执行500台windows的命令并返回结果,虽然完成以后是非常的简单,但是因为我走了很多弯路,一开始想用powershell来写,后 ...

  8. ansible安装和批量执行命令

    yum install -y ansible 编辑 /etc/ansible/hosts 文件 # This is the default ansible 'hosts' file.## It sho ...

  9. ssh模仿ansible批量执行命令的功能

    #!/bin/bash ssh_hosts=("IP" "IP1".......) user=root remote_cmd="df -h" ...

随机推荐

  1. Eclipse中设置文件编码

    如果你在使用某个editor进行开发的话,文件编码就由改editor解决即可 Eclipse中也有这个功能,帮你设置文件的编码,选择Edit->Set Encoding即可 注意,这个选项针对不 ...

  2. LeetCode: Reverse Words in a String 解题报告

    Reverse Words in a String Given an input string, reverse the string word by word. For example,Given ...

  3. eclipse ant 的自动部署(autobulid)

    在写项目中,经常需要在 ctrl+s的时候自动编译并且把这个改动的文件copy至某个目录,除了eclipse自带 java脚本的web自动部署到项目中配置的目录下,但是不能随心所欲copy,比如其他文 ...

  4. DataTable 字段值为空的时候报错的解决

    在使用Datatable的时候,后台返回给前台的值会有空的时候,而这个时候,前台会报错,这里讲防治方法: $('#datatable1').DataTable( { ajax: { "url ...

  5. 编译器内置宏__LINE__&__FUNCTION__

    编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...

  6. win10系统中UserManager 总是被禁用怎么解决?

    RT,也就是提示win10开始菜单和cortana无法工作.升级win10后一直被这个问题困扰,论坛也见有人发帖求助这类问题,百度了方法打开任务管理器进入服务更改User Manager启动类型为自动 ...

  7. 微信小程序----map组件实现检索【定位位置】周边的POI

    效果图 实现方法 地图采用微信小程序提供的map组件: 周边的数据坐标点通过高德地图提供的API接口,获取定位位置的周边或者指定位置周边的数据. WXML <view class="m ...

  8. 关于ajax get方式请求 url地址参数怎么变成空了的问题

    如URL地址:http://i.cnblogs.com/EditPosts.aspx?opt=1&value=#sgsgs; 今天在做项目中发现value明明是有值,怎么出在的后台往往取不到 ...

  9. R语言中字符串的拼接操作

    在R语言中 paste 是一个很有用的字符串处理函数,可以连接不同类型的变量及常量. 函数paste的一般使用格式为: paste(..., sep = " ", collapse ...

  10. SEO之基于thinkphp的URL伪静态

    最近基于thinkphp开发了个导购网站,现在有时间,将遇到的伪静态问题整理下,与大家分享.1.设置URL伪静态在config.ini.php中设置,如果只想前台URL伪静态,那么只在前台的confi ...