系统批量运维管理器Fabric详解

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

Fabric安装

Fabric支持pip,easy_install 或源码安装方式。

pip install fabric
easy_install fabric
Fabric 简单使用示例

定义一个任务函数,通过run方法实现远程执行"uname -s"命令

#!/usr/bin/env python
# -*- ending: utf-8 -*-from fabric.api import rundef host_type():run("unmae -s")[root@cinder01 project]# fab -f fab_run_01.py -H 192.168.165.45 host_type
[192.168.165.45] Executing task 'host_type'
[192.168.165.45] run: uname -s
[192.168.165.45] Login password for 'root':
[192.168.165.45] out: Linux
[192.168.165.45] out:

解释: -f 用于指定执行文件,-H 指定执行主机,host_type为 fab_run_01.py 中的函数名

fab的常用参数介绍

fab 为Fabric程序的命令行入口,提供丰富的参数调用,命令格式如下:

fab [options] <command>[:arg1,arg2=var1,host=foo,host2='h1;h2'...] ...

几个常用参数解释,更多参数说明可以使用fab -help命令查看

-l, 显示定义好的任务函数名
-f, 指定fab入口文件,默认入口文件名为fabfile.py
-g, 指定网关设备,比如堡垒机环境,指定填写IP地址即可
-H, 指定目标主机,多台主机使用“,”号分割
-P, 以异步并行的方式运行多台主机任务,默认为串行运行
-R, 指定role(角色),以角色名区分不同业务组设备
-t, 设置设置连接超时时间(秒)
-T, 设置远程主机命令执行超时时间(秒)
-w, 当命令执行失败,发出警告,而非默认终止任务
fabfile.py文件的编写

全局属性设定:
env对象的作用是定义fabfile的全局设定,支持多个属性,包括目标主机、用户、密码、角色等

env.host, 定义目标主机,可以用IP或主机名表示,以python列表形式定义,例:env.hosts = ["192.168.1.1","192.168.1.2"]
env.exclude_hosts, 排除指定主机,示例:env.exclude_hosts=["192.168.1.2"]
env.user, 定义主机名,如:env.user="root"
env.port, 定义目标主机端口,默认为22,如:env.port="22"
env.password, 定义密码,如:env.password="123456"
env.passwords, 与password功能一样,区别在于不同主机不同密码的应用场景,示例:env.passwords = {"root@192.168.1.1:22": "123456","root@192.168.1.2:22": "1234567"}
env.gateway, 定义网关(堡垒机)IP,如:env.gateway="192.168.1.254"
env.deploy_release_dir, 自定义全局变量,格式:env.+"变量名",如:env.age,env.name
env.roledefs, 定义角色分组,示例:将web和db主机组区分,定义如下:env.roledefs = {"webservers":["192.168.1.1","192.168.1.2"]"dbservers":["192.168.2.1"]}
Fabric 常用API

Fabric 提供了一组简单强大的fabric.api命令集,常用的方法和说明如下:

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/abc.txt','/tmp/abc1.txt');
get, 从远程主机下载文件到本地,如:get('/tmp/abc1.txt','/home/abc.txt');
prompt, 获得用户输入信息,如:prompt('input password:');
confirm, 获得提示信息确认,如:confirm("Tests failed. Continue[Y/N]?");
reboot, 重启远程主机,如:reboot();
@task, 函数修饰符,标识函数为fab调用,非标识fab不可见,纯业务逻辑;
@runs_once, 函数修饰符,标识函数只会执行一次,不受多台主机影响;
Fabric使用简单示例

示例1:查看本地与远程主机信息

# cat fab_simple1.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-from fabric.api import *env.user = "root"
env.hosts = ["192.168.165.45", "192.168.165.38"]
env.password = "NFjd1234"@runs_once      #查看本地系统信息,当有多台主机时只运行一次
def local_task():  # 本地任务函数local("uname -a")local("df -h")def remote_task():with cd("/home"):  # with的作用是让后面的表达式语句集成当前状态,效果相对于"cd /home && ls -l"run("ls -l")通过fab命令调用local_task任务函数运行结果:
# fab -f fab_simple1.py local_task
[192.168.165.45] Executing task 'local_task'
[localhost] local: uname -a
Linux cinder01 3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6 23:06:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[localhost] local: df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   96G  3.6G   92G   4% /
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   33M  1.9G   2% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1                497M  172M  326M  35% /boot
tmpfs                    380M     0  380M   0% /run/user/0Done.调用remote_task任务函数的执行结果:
# fab -f fab_simple1.py remote_task
[192.168.165.45] Executing task 'remote_task'
[192.168.165.45] run: ls -l
[192.168.165.45] out: total 142448
[192.168.165.45] out: drwxr-xr-x 2 root        root              39 Feb 23 21:00 files
[192.168.165.45] out: -rw-r--r-- 1 root        root            1486 Feb 23 20:27 iperf.sh
[192.168.165.45] out: drwx------ 2 user001     user001           79 Aug 10 16:18 user001
[192.168.165.45] out: [192.168.165.38] Executing task 'remote_task'
[192.168.165.38] run: ls -l
[192.168.165.38] out: total 0
[192.168.165.38] out: drwxr-xr-x 13 mysql mysql 245 Feb 25 15:01 mysql
[192.168.165.38] out: Done.
Disconnecting from 192.168.165.38... done.
Disconnecting from 192.168.165.45... done.

示例2:动态获取远程主机目录列表

# cat fab_simple2.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-from fabric.api import *env.user = "root"
env.hosts = ["192.168.165.45", "192.168.165.38"]
env.password = "NFjd1234"@runs_once
def input_raw():return prompt("Pleace input dir_name:",default="/home")def worktask(dirname):run("ls -l " + dirname)@task
def go():getdirname = input_raw()worktask(getdirname)执行结果:
# fab -f fab_simple2.py go
[192.168.165.45] Executing task 'go'
Pleace input dir_name: [/home] /tmp
[192.168.165.45] run: ls -l /tmp
[192.168.165.45] out: total 65532
[192.168.165.45] out: drwx------  3 root root       16 Aug 10 17:27 systemd-private-07be82ffd072480995e44cf275addead-httpd.service-UnfiFO
[192.168.165.45] out: -r--r--r--. 1 root root 67101758 Dec 20  2016 VMwareTools-9.0.5-1065307.tar.gz
[192.168.165.45] out: drwxr-xr-x. 4 root root       32 Mar 23  2013 vmware-tools-distrib
[192.168.165.45] out: [192.168.165.38] Executing task 'go'
[192.168.165.38] run: ls -l /tmp
[192.168.165.38] out: total 0
[192.168.165.38] out: srwxrwxrwx 1 mysql mysql  0 Jul 24 01:10 mysql.sock
[192.168.165.38] out: drwx------ 3 root  root  17 Jul 24 01:10 systemd-private-d4d53ae723f941588677f00dedf44a0a-vmtoolsd.service-fR3ZqE
[192.168.165.38] out: Done.
Disconnecting from 192.168.165.38... done.
Disconnecting from 192.168.165.45... done.

示例3: 网关模式文件上传与执行
通过Fabric的env对象定义网关模式,结合任务函数实现目标主机文件上传与执行的操作

# cat fab_simple3.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirmenv.user = "root"
env.gateway = "192.168.165.42"   # 定义堡垒机,做文件上传,执行的中转站
env.hosts = ["192.168.165.45", "192.168.165.38"]
env.password = "NFjd1234"lpackpath = "/root/cmatrix-1.2a.tar.gz" # 本地文件路径
rpackpath = "/tmp/test"  #远程文件路径@task
def put_task():run("mkdir -p /tmp/test")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 file!")@task
def run_task():   # 执行远程命令with cd("/tmp/test"):run("tar -zxvf cmatrix-1.2a.tar.gz")run("ls -l")@task
def go():  # 执行函数put_task()run_task()运行结果:
# fab -f fab_simple3.py go
[192.168.165.45] Executing task 'go'
[192.168.165.45] run: mkdir -p /tmp/test
[192.168.165.45] put: /root/cmatrix-1.2a.tar.gz -> /tmp/test/cmatrix-1.2a.tar.gz
[192.168.165.45] run: tar -zxvf cmatrix-1.2a.tar.gz
[192.168.165.45] out: cmatrix-1.2a/
...
[192.168.165.45] out: [192.168.165.45] run: ls -l
[192.168.165.45] out: total 80
[192.168.165.45] out: drwxrwxrwx 2  500  500  4096 Apr  1  2002 cmatrix-1.2a
[192.168.165.45] out: -rw-r--r-- 1 root root 74376 Aug 23 11:34 cmatrix-1.2a.tar.gz
[192.168.165.45] out: [192.168.165.38] Executing task 'go'
[192.168.165.38] run: mkdir -p /tmp/test
[192.168.165.38] put: /root/cmatrix-1.2a.tar.gz -> /tmp/test/cmatrix-1.2a.tar.gz
[192.168.165.38] run: tar -zxvf cmatrix-1.2a.tar.gz
[192.168.165.38] out: cmatrix-1.2a/
...
[192.168.165.38] out: [192.168.165.38] run: ls -l
[192.168.165.38] out: total 80
[192.168.165.38] out: drwxrwxrwx 2  500  500  4096 Apr  1  2002 cmatrix-1.2a
[192.168.165.38] out: -rw-r--r-- 1 root root 74376 Aug 23 11:30 cmatrix-1.2a.tar.gz
[192.168.165.38] out: Done.
Disconnecting from 192.168.165.38... done.
Disconnecting from 192.168.165.45... done.
Disconnecting from 192.168.165.42... done.

参考文档:《python自动化运维 技术与最佳实战》

转载于:https://www.cnblogs.com/xieshengsen/p/7417468.html

系统批量运维管理器Fabric详解相关推荐

  1. python自动化运维——系统批量运维管理器pexpect详解

    pexpect可以理解成Linux下的expect的Python封装,通过pexpect可以实现对ssh.ftp.passwd.telnet等命令进行自动交互,来达到自动化的目的.比如可以模拟FTP登 ...

  2. Java Swing布局管理器(详解版)

    在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...

  3. python运维管理系统_9.python 系统批量运维管理器之Fabric模块

    前面介绍了paramiko,pexpect模块,今天来说比较适合大型应用自动化部署的模块,或者执行系统命令的模块Fabric. Fabric 是一个 Python 的库,同时它也是一个命令行工具.它提 ...

  4. [Linux运维基础]全家桶详解!Linux中RPM包、wget下载、YUM安装、tar包、zip等包管理方式区别与参数详解,附wget下载源码包编译安装方法

    文章目录 一.RPM.tar.gz 1.rpm包格式 2.rpm包管理 3.tar包管理参数 二.wget 1.wget参数 2.wget下载源码包后编译安装 三.YUM 1.YUM工作原理 2. Y ...

  5. 服务器系统2012设置,Windows Server 2012服务器管理器图文详解

    作为技术人员来说,我们对Windows Server的关注始终是在系统本身,包括能不能够更好管理好服务器,或者在功能方面更加强大.操作上更加简单.在Windows Server 2012中服务器管理器 ...

  6. Python运维自动化psutil 模块详解(超级详细)

    psutil 模块 参考官方文档:https://pypi.org/project/psutil/ 一.psutil简介 psutil是一个开源且跨平台(http://code.google.com/ ...

  7. Android之AudioManager(音频管理器)详解

    AudioManager简介: AudioManager类提供了访问音量和振铃器mode控制.使用Context.getSystemService(Context.AUDIO_SERVICE)来得到这 ...

  8. linux重启配置文件,rEFInd启动管理器配置文件详解

    关于refind.conf文件所有选项及参数的详细说明 timeout          设置默认时间20s,时间到后进入默认操作系统. 0表示一直等待选择 screensaver    设置在进入引 ...

  9. GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单 的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能 ...

最新文章

  1. ssm配置多数据库支持
  2. 【Android 文件管理】应用可访问的存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 )
  3. 【LeetCode从零单排】No14.LongestCommonPrefix
  4. 全境封锁UI游戏设计指南
  5. 【IT笔试面试题整理】二叉树中和为某一值的路径--从根到叶子节点
  6. java oracle 分区查询_深入学习Oracle分区表及分区索引
  7. python2和3语法区别_python2和3语法区别
  8. PyQT:第一个Demo,画出鼠标单击位置出图像的列像素折线图
  9. 阿联酋起源人工智能研究院(IIAI)诚邀优秀人才加盟
  10. “熊猫血”产妇诞双胞胎困难 丈夫全城寻找血源
  11. Servlet具体解释
  12. javascript数据结构与算法---队列
  13. ubuntu 14.04 将用户目录下中文目录修改为英文目录
  14. vbs if 不等于_(四)if 判断与逻辑运算符
  15. # 研究杂感 × VOSviewer(第二辑)
  16. 如何将手机号码批量导入手机通讯录
  17. linux 搜狗输入法显示繁体字,搜狗输入法繁体字切换
  18. 深度学习实战 2 YOLOv5 添加CBAM、CA、ShuffleAttention注意力机制
  19. 最全最精准的IE浏览器判断和国内套壳浏览器判断(360,QQ,搜狗,百度等)
  20. 常见的几种网络Hack方式

热门文章

  1. c++类的成员函数作回调函数为啥要声明为static的
  2. 考拉Android统一弹框
  3. su命令\sudo命令\限制root远程登录
  4. 一天一种设计模式之二-----备忘录模式
  5. 十二、添加RD 授权角色
  6. 俺重装系统后一些小配置(给自己备忘)
  7. C++中的XML配置文件编程经验
  8. CSDN在2017年度的若干“升级”
  9. 个人三观的东西(1)
  10. 计算机专业岗位细分及学习必备清单