python模块fabric
fabric在paramiko的基础上做了更高一层的封装 ,支持命令执行和文件上传下载 完整的日志输出等功能
1.安装fabric
我这里是python3版本 需要执行以下命令 python2版本后面不需要跟3
pip install fabric3
2.常用参数
fab[option] [:arg ,arg2=val2,host=foo,hosts=’h1,h2,’……]……
- -l 显示定义好的任务函数名
- -f 指定fab入口文件,默认为fabfile.py
- -g 指定网关,比如堡垒机Ip地址
- -H 执行目标主机,多个主机用,隔开
- -P 以一部并行方式运行多主机任务,默认串行
- -R 执行role 以角色区分不同业务
- -t 设置超时时间s -T 设置远程执行命令超时时间s
- -w 当命令执行失败时 发出警告 默认中止任务 fab -p password(密码)
- -H 192.168.1.1,192.168.2.2 — ’ifconfig’
3.fabfile文件的编写
fab必须已fabfile.py为名 ,其他文件名需要添加-f filename调用
3.1 全局属性设定
evn对象用于定义fabfile的全局设置,支持多个属性,如用户名,密码 目标主机 角色等
evn.host 定义目标主机 可以用IP或者主机名表示,
以列表形式定义 env.hosts = [’192.168.1.1’,’192.168.1.2’]
env.exclude_hosts 要排除的主机 ,以列表形式定义
env.user 定义用户名 env.user= root
env.password 定义密码 env.password=’123456’
env.passwords 定义不同的主机不同密码
env.passwords = { ’root@192.168.1.1:22’ : ’123456’, ’root@192.168.1.2:22’ : ’654321’ }
env.gateway 定义堡垒机IP env.gateway = ‘192.168.1.3’
env.deploy_release_dir 自定义全局变量,
格式为 env.+变量名 如 env_deploy_release_dir env.age env.sex等
env.roledefs 定义角色组
env.roledefs = {
’web’ :[’192.168.1.1’,192.168.1.2],
’db’ :[’192.168.1.3,’’192.168.1.4’]
}
使用时可以采用python装饰器的方法
@roles('web')
def webtask():
run('ifconfig')
@roles('web','db')
def alltask(): 这里的with相关于&& cd /data0/log &&uptime
with cd('/data0/log')
run('uptime')
3.2 常用API
local 执行本地命令 local(’uname -s’)
lcd 切换本地目录 lcd(’/home’)
cd 切换远程目录 cd(’/tmp’)
run 执行远程命令 run(’ifconfig’)
sudo sudo方式执行远程命令 sudo(’mkdir ’/aaa’’)
put 上传本地文件到远程 put(’/tmp/aaa.txt’,’/data0/aaa.txt’)
get 从远程下载文件到本地 get(’/tmp/aaa.txt’,’/data0/aaa.txt’)
prompt 获取用户输入 prompt(’请输入用户名密码’)
confirm 获取提示信息确认 confirm(’确定吗[Y/N]’)
reboot 重启远程主机 reboot()
@task 函数装饰器 表示的函数为fab可调用的,非标记对fab不可见
@runs_once 函数装饰器 该函数只会执行一次,不受多态主机影响**
事例
动态获取远程目录下文件列表
#!/usr/bin/env python3
from fabric.api import *
env.user ='root'
env.hosts = ['192.168.55.128','192.168.55.129']
env.password = '123456'
@runs_once # 执行一次 给用户一个提示
def input_raw():
return prompt(请输入目录名,default=“/home”)
def worktask(dirname)
run ('ls -l dirname')
@task 限定只有go函数对fab命令可见
def go():
getdirname = input_raw()
worktask(getdirname)
python模块fabric
http://www.jcwit.com/article/349/