Python运维自动化开发之Fabric模块
2017-11-29 09:36
771 查看
本章讲解fabric模块,与上一章的paramiko模块功能类似,fabric是在paramiko基础上又做了一层封装,操作起来更方便。主要用于多台服务器批量执行任务。
非内置Python模块,需要手动安装:pip install fabric
如果安装失败,可以尝试yum安装:yum install fabric
Fabric常用API:
当我们写好fabric脚本后,需要用fab命令调用执行任务。
命令格式:fab [options][:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…] …
fab命令有以下常用选项:
示例:
1、本地执行命令
使用fab命令调用,默认寻找当前目录的fabfile.py文件。
2、远程执行命令
如果在多台主机执行,只需要-H后面的IP以逗号分隔即可。
3、给脚本函数传入位置参数
4、主机列表组
env作用是定义fabfile全局设定,类似于变量。还有一些常用的属性:
5、定义角色分组
6、上传目录到远程主机
7、从远程主机下载目录
8、打印颜色,有助于关键地方醒目
经过上面示例,有没有觉得fabric模块很适合批量自动部署呢!没错,通过编写简单的脚本,即可完成复杂的部署操作。
而paramiko模块,更擅长远程执行命令,文件传输,可灵活的嵌入到运维系统中。
阅读原文
使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息
利用Paramiko模块执行批量上传/下载/执行命令/查看服务器列表
DNS处理模块dnspython
非内置Python模块,需要手动安装:pip install fabric
如果安装失败,可以尝试yum安装:yum install fabric
Fabric常用API:
API类 | 描述 | 示例 |
local | 执行本地命令 | local('uname -s') |
lcd | 切换本地目录 | lcd('/opt') |
run | 执行远程命令 | run('uname -s') |
cd | 切换远程目录 | cd('/opt') |
sudo | sudo方式执行远程命令 | sudo('/etc/init.d/httpd start') |
put | 上传本地文件或目录到远程主机 | put(remote_path, local_path) |
get | 从远程主机下载文件或目录到本地 | put(local_path, remote_path) |
open_shell | 打开一个shell,类似于SSH连接到了远程主机 | open_shell("ifconfig eth0") |
prompt | 获得用户输入信息 | prompt('Please input user password: ') |
confirm | 获得提示信息确认 | confirm('Continue[Y/N]?') |
reboot | 重启远程主机 | reboot() |
@task | 函数装饰器,引用说明函数可调用,否则不可见 | |
@runs_once | 函数装饰器,函数只会执行一次 |
命令格式:fab [options][:arg1,arg2=val2,host=foo,hosts=’h1;h2’,…] …
fab命令有以下常用选项:
选项 | 描述 |
-l | 打印可用的命令(函数) |
--set=KEY=VALUE,... | 逗号分隔,设置环境变量 |
--shortlist | 简短打印可用命令 |
-c PATH | 指定本地配置文件 |
-D | 不加载用户known_hosts文件 |
-f PATH | 指定fabfile文件 |
-g HOST | 逗号分隔要操作的主机 |
-i PATH | 指定私钥文件 |
-k | 不加载来自~/.ssh下的私钥文件 |
-p PASSWORD | 使用密码认证and/or sudo |
-P | 默认为并行执行方法 |
--port=PORT | 指定SSH连接端口 |
-R ROLES | 根据角色操作,逗号分隔 |
-s SHELL | 指定新shell,默认是'/bin/bash -l -c' |
--show=LEVELS | 以逗号分隔的输出 |
--ssh-config-path=PATH | SSH配置文件路径 |
-t N | 设置连接超时时间,单位秒 |
-T N | 设置远程命令超时时间,单位秒 |
-u USER | 连接远程主机用户名 |
-x HOSTS | 以逗号分隔排除主机 |
-z INT | 并发进程数 |
1、本地执行命令
from fabric.api import local def command(): local('ls') # fab command [localhost] local: ls fabfile.py fabfile.pyc tab.py tab.pyc Done.
使用fab命令调用,默认寻找当前目录的fabfile.py文件。
2、远程执行命令
from fabric.api import run def command(): run('ls') # fab -H 192.168.1.120 -u user command [192.168.1.120] Executing task 'command'[192.168.1.120] run: ls [192.168.1.120] Login password for 'user': [192.168.1.120] out: access.log a.py [192.168.1.120] out: Done. Disconnecting from 192.168.1.120... done.
如果在多台主机执行,只需要-H后面的IP以逗号分隔即可。
3、给脚本函数传入位置参数
from fabric.api import run def hello(name="world"): print("Hello %s!" % name) # fab -H localhost hello [localhost] Executing task 'hello'Hello world! Done. # fab -H localhost hello:name=Python [localhost] Executing task 'hello'Hello Python! Done.
4、主机列表组
from fabric.api import run, env env.hosts = ['root@192.168.1.120:22', 'root@192.168.1.130:22'] env.password = '123.com'env.exclude_hosts = ['root@192.168.1.120:22'] # 排除主机 def command(): run('ls')
env作用是定义fabfile全局设定,类似于变量。还有一些常用的属性:
env属性 | 描述 | 示例 |
env.hosts | 定义目标主机 | env.hosts = ['192.168.1.120:22'] |
env.exclude_hosts | 排除指定主机 | env.exclude_hosts = '[192.168.1.1]' |
env.user | 定义用户名 | env.user='root' |
env.port | 定义端口 | env.port='22' |
env.password | 定义密码 | env.password='123' |
env.passwords | 定义多个密码,不同主机对应不同密码 | env.passwords = {'root@192.168.1.120:22': '123'} |
env.gateway | 定义网关 | env.gateway='192.168.1.2' |
env.roledefs | 定义角色分组 | env.roledef = {'web':['192.168.1.11'], 'db':['192.168.1.12']} |
env.deploy_release_dir | 自定义全局变量,格式:env.+ '变量名' | env.var |
# vi install.py from fabric.api import run, env env.roledefs = { 'web': ['192.168.1.10', '192.168.1.20'], 'db': ['192.168.1.30', '192.168.1.40'] } env.password = '123'@roles('web') def task1(): run('yum install httpd -y') @roles('db') def task2(): run('yum install mysql-server -y') def deploy(): execute(task1) execute(task2) # fab -f install.py deploy
6、上传目录到远程主机
from fabric.api import * env.hosts = ['192.168.1.120'] env.user = 'user'env.password = '123.com'def task(): put('/root/abc', '/home/user') run('ls -l /home/user') # fab task
7、从远程主机下载目录
from fabric.api import * env.hosts = ['192.168.1.120'] env.user = 'user'env.password = '123.com'def task(): get('/home/user/b', '/opt') local('ls -l /opt') # fab task
8、打印颜色,有助于关键地方醒目
from fabric.colors import * def show(): print green('Successful.') print red('Failure!') print yellow('Warning.') # fab show
经过上面示例,有没有觉得fabric模块很适合批量自动部署呢!没错,通过编写简单的脚本,即可完成复杂的部署操作。
而paramiko模块,更擅长远程执行命令,文件传输,可灵活的嵌入到运维系统中。
阅读原文
使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息
利用Paramiko模块执行批量上传/下载/执行命令/查看服务器列表
DNS处理模块dnspython
相关文章推荐
- Python运维自动化开发之Fabric模块
- CrazyWing:Python自动化运维开发实战 十五、Python模块
- python使用Fabric模块实现自动化运维
- Python运维自动化开发之Paramiko模块
- python使用Fabric模块实现自动化运维
- CrazyWing:Python自动化运维开发实战 四、Python变量
- 老男孩Python运维自动化开发14期视频教程 金角大王Aex老师主讲28周 15-28周部分
- CrazyWing:Python自动化运维开发实战 六、流程控制
- 基础入门_Python-模块和包.运维开发中chartdet编码检测的最佳实践?
- Python自动化运维之模块与包的使用
- Python自动化运维之常用模块—logging
- Python自动化运维笔记(五):使用filecmp模块实现文件以及文件目录差异对比
- CrazyWing:Python自动化运维开发实战 十四、Python函数
- CrazyWing:Python自动化运维开发实战 八、Python数据类型之字符串
- CrazyWing:Python自动化运维开发实战 三、python文件类型
- CrazyWing:Python自动化运维开发实战 五、Python运算符与表达式
- CrazyWing:Python自动化运维开发实战 九、Python数据类型之列表
- python全栈开发devops运维自动化方向初到高级在线课程分享
- python自动化运维学习笔记一 psutil模块
- 基础入门_Python-模块和包.运维开发中日志模块logging的最佳实践?