python模块fabric

fabric在paramiko的基础上做了更高一层的封装 ,支持命令执行和文件上传下载 完整的日志输出等功能

1.安装fabric

我这里是python3版本 需要执行以下命令 python2版本后面不需要跟3

pip install fabric3

2.常用参数

fab[option] [:arg ,arg2=val2,host=foo,hosts=’h1,h2,’……]……

  1. -l 显示定义好的任务函数名
  2. -f 指定fab入口文件,默认为fabfile.py
  3. -g 指定网关,比如堡垒机Ip地址
  4. -H 执行目标主机,多个主机用,隔开
  5. -P 以一部并行方式运行多主机任务,默认串行
  6. -R 执行role 以角色区分不同业务
  7. -t 设置超时时间s -T 设置远程执行命令超时时间s
  8. -w 当命令执行失败时 发出警告 默认中止任务 fab -p password(密码)
  9. -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/
作者
Carlos
发布于
2018年12月17日
许可协议