摘要:当需要同时管理许多服务器时,如果我们一台一台登陆上去操作会显得费时又费力。此时我们可以用fabric这个包提供的API来编写python脚本完成服务器集群的统一管理。

核心原理:fabric为主动ssh至主机执行指定操作,而不是在主机上装agent接收指令。

1、安装

pip install fabric3  ====>可以把fabric看做是一个软件,安装后提供操作系统级命令“fab”,然后这个软件开放一些API,可以通过python去调用

2、fab常用参数(操作系统级命令“fab”的使用参数)

格式:fab 选项参数

常用选项参数:

-l:查看目标fab程序可用的函数。(需要和-f结合使用)

-f:告诉fab程序去读取哪个.py文件

-g:指定网关

-H:指定需要控制的目标主机,多个主机用“,”隔开

-P:以异步并行方式运行多主机任务,默认为串行任务。(可以理解为多线程执行,默认为一个线程)

-u:指定主机用户名

-p:指定主机密码

例:fab -p 密码 -H 主机1,主机2 --'命令'

fab -u root -p 密码 -H '172.20.163.121,172.20.163.126' -- 'ifconfig'   ===>执行此命令后会输出172.20.163.121和172.20.163.126的ifconfig信息

3、fabfile脚本编写

3.1、普通场景示例(适用于所有服务器的用户名、密码、业务类型都一致的情况)(即:一个程序对应一个集群):

from fabric.api import *  ===>导入fabric

# 全局属性的设定()

# env为fabric.api里面的一个对象,可以通过操纵它的各个属性实现对自动化运维程序的全局参数配置,它的属性包括目标主机ip、用户、密码、角色等

# 1、env.host:存放目标主机的列表

env.hosts = ['192.168.1.1', '192.168.1.2']

# 2、env.user:定义用户名

env.user = 'root'

# 3、env.port:定义端口

env.port = 22

# 4、env.password:定义密码

env.password = '123456'

@task    ===> 如果没加@roles、@hosts等装饰器,一旦下面这个函数被执行,则全局env.hosts里面所有的机器都会运行函数内的命令

def show_net():

run('ifconfig')  ===>在远程主机上执行“ifconfig”命令

if __name__ == '__main__':

execute(show_net)   ===>如果不使用execute这个函数去执行show_net,则show_net只能用'root@HK:~# fab -f 文件名.py show_net'的方式执行。用了execute后就可以用'python3 文件名.py'的方式执行了。

===>执行以上代码后程序会ssh到'192.168.1.1', '192.168.1.2'这两台机器上执行'ifconfig'命令并返回结果

3.2、将不同主机进行分组管理场景(适用于被管理服务器密码、业务类型不相同的情况):

from fabric.api import *  ===>导入fabric

env.user = 'root'   ====> 尽管下面针对每台主机有用户名信息了,这里也需要定义一个全局user,不知为啥(碰到需要不同用户名的情况下就歇菜了)

# 5、env.passwords:定义多台主机的用户名、IP地址、端口、密码(适用于:一堆服务器的密码不都一样的情况)

env.passwords = {

'root@172.20.163.121:22': '123456',   ====>测试发现去掉"root@"和":22"后会报错

'root@172.20.163.126:22': '123456',

}

# 6、env.gateway:定义网关  ====>适用于通过跳板机(堡垒机)登陆的方式

# env.gateway = '192.168.1.254'  ===>因没有环境,所以先把它注掉,这里只是说明有这个功能而已

# 7、env.roledefs:定义角色分组(可按业务类型将主机进行分组管理)

env.roledefs = {

'group1': ['172.20.163.121'],

'group2': ['172.20.163.126']

}

@task

@roles('group1', 'group2')    ====>这个函数被执行时会在'group1', 'group2'这两个组成员上生效

def show():

run('uname -a')

@task

@roles('group1')   ====>这个函数被执行时会在'group1'个组成员上生效

def show_net():

run('ifconfig')

@task

@roles('group2')   ====>这个函数被执行时会在'group2'个组成员上生效

def show_mem():

run('free -m')

if __name__ == '__main__':

execute(show)       ===>执行show函数时group1、group2两个分组内的成员都会执行

execute(show_net)   ===>执行show-net函数时只有group1分组内成员执行

execute(show_mem) ===>执行show_mem函数时只有group2分组内成员执行

4、本地与远程运维常用API(本地指运行fabric程序端,远程指被ssh端)

# 1、local:执行本地命令

语法:local('本地命令')

# 2、lcd:切换到本地目录

语法:lcd('本地目录')

例:

def local_cmd():

with lcd(r'C:\Users\Administrator'):   ===>切换到C:\Users\Administrator目录(临时性,执行完with这个整体后仍然处在原来的路径)

local('dir')                       ===>在C:\Users\Administrator路径下执行'dir'命令

local('dir')              ===>执行完with这个整体后再次执行dir发现还处在没有切换目录前的路径

# 3、cd:切换远程目录

语法:cd('远程目录')

# 4、run:执行远程命令

语法:run('远程命令')

例:

def remote_cmd():

with cd(r'/'):                         ===>切换到/目录(临时性,执行完with体仍然处在原来的路径)

run('pwd')    ===>此时执行pwd输出路径为'/'

run('pwd')    ===>此时执行pwd输出路径为'/root'

5、put:上传本地文件到远程主机

语法:put('本地文件', '远程目录')

例:

def upload():

put(r'C:\Users\Administrator\Desktop\django.txt', '/root/111.txt')

6、get:从远程主机下载文件到本地

语法:get('远程文件', '本地目录')

例:

def download():

get('/root/get-pip.py', r'C:\Users\Administrator\Desktop\iiii.py')

7、异常处理和文件校验

from fabric.api import *

from fabric.contrib.console import confirm

from fabric.colors import *    ====>文字颜色库,包含white()、yellow()、red()、blue()、green()、cyan()、magenta()等函数,将字符串丢进去即可为字符串上色。例:print(yellow('abc')) ===>此时将输出黄色的'abc'

def abnormal():

    # 异常处理

with settings(warn_only=True):

result = put(r'./222.txt', '/root/abc.txt')

if result.failed and not confirm("put file failed,Continue[Y/N]?"):   ===>如果路径错误result.failed将为真,如果result.failed为真后弹出交互界面问用户是否要继续,如果输入N,则not 0为真,则执行abort("Aborting file put task !")

abort("Aborting file put task !")

    # 文件校验

with settings(warn_only=True):

local_md5 = local(r'md5sum ./222.txt', capture=True).split(" ")[0]   # capture作用:这个开启后输出结果将不再打印至屏幕,而是将结果赋给local_md5

remote_md5 = run('md5sum /root/abc.txt').split(" ")[0]               # run函数不用capture参数,默认既会打印至屏幕,也会赋值给remote_md5

if local_md5 == remote_md5:

print(green('校验通过'))

else:

print(red('校验失败'))

confirm说明:

from fabric.contrib.console import confirm

a = confirm('是否要继续?')   ====>confirm将弹出交互界面:'是否要继续? [Y/n]'    用户可输入Y或N

print(a)    =====>如果用户输入的是Y,则此处打印True。如果用户输入的是N,则此处打印False

5、装饰器说明:

fab调用装饰器:@task

如果函数前面加了这个装饰器就可以用操作系统级别命令fab直接调用这个函数。如果没加则无法用fab直接调用。例:

@task

def remote_cmd():

run('ifconfig')

root@HK:~# fab -f ssh.py remote_cmd   ====>如果加了@task则可以直接这么用,如果没加则不能这么用

并行装饰器:@parallel

角色装饰器:@roles(分组名)

@task

@parallel    ====>当有多个主机要执行下面函数任务时,加上这个装饰器就可以起多个进程并行处理了。

@roles('group1', 'group2')    ====>多个分组需要执行下面函数

def remote_cmd():

run('ifconfig')

主机装饰器:@hosts(主机1,主机2)

@task

@parallel    ====>当有多个主机要执行下面函数任务时,加上这个装饰器就可以起多个进程并行处理了。

@roles('172.20.163.100', '172.20.163.101')    ====>除了分组方法外,也可以手工指定哪台主机要执行下面函数。

def remote_cmd():

run('ifconfig')

自动化运维工具fabric使用教程的更多相关文章

  1. 轻量级自动化运维工具Fabric的安装与实践

    一.背景环境 在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具. 这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事 ...

  2. Python自动化运维工具-Fabric部署及使用总结

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  3. Python自动化运维工具fabric的安装

    使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...

  4. 自动化运维工具Fabric - 密码管理(env.password and ssh key)

    在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式 注:本文主要参考官方文档 P ...

  5. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

  6. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  7. 自动化运维工具之ansible

    自动化运维工具之ansible   一,ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...

  8. 自动化运维工具——ansible详解(一)

    ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...

  9. 企业级自动化运维工具应用实战-ansible

    背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...

随机推荐

  1. hadoop2-HBase的Java API操作

    Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...

  2. c#发送短息验证码

    <add key="WebReference.Service.PostUrl" value="http://106.ihuyi.cn/webservice/sms1 ...

  3. 分享几个有意思的css js工具网站

    一.VOCABS(css html术语) vocabs 适合初学者快速认知各个代码的术语. 二.OverAPI(语言参考手册,几乎包含所有语言) OverAPI 适合快速查阅相关语言api 三.Jav ...

  4. 推荐一些iOS博客

    公司性质的: 公司 地址 美团 http://tech.meituan.com/archives 个人博客: 博主 地址 (斜体的技术文章较少) 王巍(onevcat) https://onevcat ...

  5. node06

    1.数据库: server端:数据存在 client端:管理工具,node mysql内有两个单位: 库:类似文件夹,容纳表 表:存储数据 行:一条数据 列(字段,域):一个数据项 主键:数据的唯一标 ...

  6. Bootstrap 常用属性

    一,关于按钮 btn系列 二.关于div 移动位置 col 系列 col-md 系列 col-lg系列 这些都是让多个div在当前页面等大小 三.居中系列 1.文本居中 text-center 2.图 ...

  7. 刚发现 CSS 还存在一个命名规范 B.E.M

    Block !误区:这个block并非inline-block里的block,而是将所有东西都划分为一个独立的模块,一个header是block,header里嵌套的搜索框是block,甚至一个ico ...

  8. nova boot from volume代码分析

    首先要创建一个bootable volume curl -i http://16.158.166.197:8776/v1/c24c59846a7f44538d958e7548cc74a3/volume ...

  9. 开发自定义ScriptableRenderPipeline,将DrawCall降低180倍

    0x00 前言 大家都知道,Unity在2018版本中正式推出了Scriptable Render Pipeline.我们既可以通过Package Manager下载使用Unity预先创建好的Ligh ...

  10. 1.2 Why need pluggable?

    When Android programmers write new features, bugs, or even crashes will exits in their App. Once a t ...