自动化运维工具fabric使用教程
摘要:当需要同时管理许多服务器时,如果我们一台一台登陆上去操作会显得费时又费力。此时我们可以用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使用教程的更多相关文章
- 轻量级自动化运维工具Fabric的安装与实践
一.背景环境 在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具. 这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事 ...
- Python自动化运维工具-Fabric部署及使用总结
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- Python自动化运维工具fabric的安装
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- 自动化运维工具Fabric - 密码管理(env.password and ssh key)
在使用 Fabric 的过程中,如果大批量服务器处理的话,我们就需要针对配置主机的密码,每台主机的密码相同还好,不同的话,就需要针对不同的主机做配置了,以下有两种配置方式 注:本文主要参考官方文档 P ...
- 自动化运维工具Ansible介绍
一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...
- 自动化运维工具Ansible详细部署 (转载)
自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...
- 自动化运维工具之ansible
自动化运维工具之ansible 一,ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...
- 自动化运维工具——ansible详解(一)
ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...
- 企业级自动化运维工具应用实战-ansible
背景 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出多套环境可以共开发和测试人员做测试,运 ...
随机推荐
- vue 源码学习(一) 目录结构和构建过程简介
Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...
- vue项目中的相关插件
所有安装都是cd到该项目目录中安装 -S代表将插件添加到项目中的package.json文件 1.iview 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品 cnp ...
- Ubuntu16.04安装之后连不上无线网?有可能是Realtek rtl8822be的原因
原以为昨天已基本写完在接触到Ubuntu以来遇到的所有问题了... 没想到今天去看有关ROS的资料时,居然无意间又看到了之前遇到的一个巨坑:安装完Ubuntu16.04之后,无线网用不了,根本无法连接 ...
- Python3定时短信获得天气
getWeather 脚本链接:https://github.com/Mrlshadows/getWeather Python环境为 python3 两个API 注册后即可使用免费版本的服务 心知天气 ...
- react-native 常用的一些插件
react-native 常用的一些插件 最近在做react-native的app,用到的一些好用的插件,在这儿记录一下 由于返回的后台内容是富文本编辑器Quill,返回的的是Delta对象,使用了q ...
- 基于js的数据结构与算法-数组
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Dubbo架构设计及原理详解
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...
- 美团App用户界面分析
关于美团 美团网成立于2010年,合并前是中国销售额最大的独立团购 App.美团网2014年全年交易额突破460亿元,较去年增长180%以上,市场份额占比超60%,用户数超2亿~ 美团 App 用户界 ...
- FFmpeg 结构体学习(四): AVFrame 分析
在上文FFmpeg 结构体学习(三): AVPacket 分析我们学习了AVPacket结构体的相关内容.本文,我们将讲述一下AVFrame. AVFrame是包含码流参数较多的结构体.下面我们来分析 ...
- 你必须知道的10个Python第三库
1. BeautifulSoup Beautiful Soup是一个可以从HTML,XML进行提取文件的Python库,日常我们使用爬虫进行数据抓取回来之后,往往需要进行数据解析. 使用它能让你开心愉 ...