设为首页 收藏本站
查看: 909|回复: 0

[经验分享] Python Fabric 模块 介绍及简单应用

[复制链接]

尚未签到

发表于 2018-8-9 08:02:30 | 显示全部楼层 |阅读模式
引用时使用Python修饰符的形式进行,角色修饰符下面的任务函数为其作用域,  
下面来看一个示例:
  

  

  
env.roledefs = {
  
    'webservers': ['192.168.1.21', '192.168.1.22', '192.168.1.23','192.168.1.24'],
  
    'dbservers': ['192.168.1.25', '192.168.1.26']
  
}
  
@roles('webservers')
  
def webtask():
  
    run('/etc/init.d/nginx start')
  

  
@roles('dbservers')
  
def dbtask():
  
    run('/etc/init.d/mysql start')
  

  
@roles ('webservers', 'dbservers')
  
def pubclitask():
  
    run('uptime')
  

  

  
def deploy():
  
    execute(webtask)
  
    execute(dbtask)
  
    execute(pubclitask)
  

  
####################################
  
fab -p  xxx@2016  -f fa0.py -l
  
fab -p  xxx@2016  -f fa0.py webtask
  
fab -p  xxx@2016  -f fa0.py deploy
  

  

  

  
常用API
  

  
Fabric提供了一组简单但功能强大的fabric.api命令集,简单地调用
  
这些API就能完成大部分应用场景需求。Fabric支持常用的方法及说明如下:
  
·local,执行本地命令,如:local('uname-s');
  
·lcd,切换本地目录,如:lcd('/home');
  
·cd,切换远程目录,如:cd('/data/logs');
  

  
·run,执行远程命令,如:run('free-m');
  
·sudo,sudo方式执行远程命令,如:sudo('/etc/init.d/httpd start');
  
·put,上传本地文件到远程主机,如:put('/home/user.info','/data/user.info');
  
·get,从远程主机下载文件到本地,如:get('/data/user.info','/home/root.info');
  
·prompt,获得用户输入信息,如:prompt('please input user password:');
  
·confirm,获得提示信息确认,如:confirm("Tests failed.Continue[Y/N]?");
  
·reboot,重启远程主机,如:reboot();
  
·@task,函数修饰符,标识的函数为fab可调用的,非标记对fab不可见,纯业务逻辑;
  
·@runs_once,函数修饰符,标识的函数只会执行一次,不受多台主机影响。
  

  

  

  
##文件名是fa.py
  
#!/usr/bin/env python
  
from fabric.api import *
  
env.user='root'
  
env.hosts=['192.168.23.140','192.168.23.141']
  
env.password='wdzj@2016'
  

  
@runs_once #查看本地系统信息,当有多台主机时只运行一次
  
def local_task(): #本地任务函数
  
    local("uname -a")
  
def remote_task():
  
    with cd("/tmp"): #"with"的作用是让后面的表达式的语句继承当前状态,实现
  
        run("ls -l") # "cd /data/logs && ls -l"的效果
  

  

  

  
##用法,执行下面命令
  
#fab -p  wdzj@2016  -f fa.py local_task
  
#fab -p  wdzj@2016  -f fa.py remote_task
  

  

  

  

  
动态获取远程目录列表
  
本示例使用“@task”修饰符标志入口函数go()对外部可见,
  
配合“@runs_once”修饰符接收用户输入,最后调用worktask()任务函数
  
实现远程命令执行,详细源码如下:
  
【/home/test/fabric/simple2.py】
  

  
#!/usr/bin/env python
  
from fabric.api import *
  
env.user='root'
  
env.hosts=['192.168.23.140','192.168.23.141']
  
env.password='LKs934jh3'
  
@runs_once #主机遍历过程中,只有第一台触发此函数
  
def input_raw():
  
    return prompt("please input directory name:",default="/home")
  
def worktask(dirname):
  
    run("ls -l "+dirname)
  
@task #限定只有go函数对fab命令可见
  
def go():
  
    getdirname = input_raw()
  
    worktask(getdirname)
  

  

  
[root@localhost fabric]# fab -p  wdzj@2016 -f fa2.py -l
  
Available commands:
  

  
    go
  

  

  
[root@localhost fabric]# fab -p  wdzj@2016 -f fa2.py go
  
。。。
  
。。。
  
。。。
  

  

  

  

  
网关模式文件上传与执行
  
本示例通过Fabric的env对象定义网关模式,即俗称的中转、堡垒机环境。
  
定义格式为“env.gateway='192.168.1.23'”,其中IP“192.168.1.23”为堡垒机IP,
  
再结合任务函数实现目标主机文件上传与
  
执行的操作,详细源码如下:
  

  
【/home/test/fabric/simple3.py】
  
from fabric.api import *
  
from fabric.context_managers import *
  
from fabric.contrib.console import confirm
  

  
env.user = 'root'
  
env.gateway = '192.168.10.11'  # 定义堡垒机IP,作为文件上传、执行的中转设备
  
env.hosts = ['192.168.23.140', '192.168.23.141']
  
# 假如所有主机密码都不一样,可以通过env.passwords字典变量一一指定
  
env.passwords = {
  
    'root@192.168.1.21:22': 'LKs934jh3',
  
    'root@192.168.1.22:22': 'LKs934jh3',
  
    'root@192.168.1.23:22': 'UI7384hg6'  # 堡垒机账号信息
  
}
  
lpackpath = "/home/install/lnmp0.9.tar.gz"  # 本地安装包路径
  
rpackpath = "/tmp/install"  # 远程安装包路径
  

  

  
@task
  
def put_task():
  
    run("mkdir -p /tmp/install")
  
    with settings(warn_only=True):
  
        result = put(lpackpath, rpackpath)  # 上传安装包
  
    if result.failed and not confirm("put file failed,Continue[Y/N]?"):
  
        abort("Aborting file put task!")
  

  

  
@task
  
def run_task():  # 执行远程命令,安装lnmp环境
  
    with cd("/tmp/install"):
  
        run("tar -zxvf lnmp0.9.tar.gz")
  
    with cd("lnmp0.9/"):  # 使用with继续继承/tmp/install目录位置状态
  
        run("./centos.sh")
  

  
@task
  
def go():  # 上传、安装组合
  
    put_task()
  
    run_task()
  

  

  
示例通过简单的配置env.gateway='192.168.1.23'就可以轻松实现堡垒机环境的文件上传及执行,
  
相比paramiko的实现方法简洁了很多,编写的任务函数完全不用考虑堡垒机环境,
  
配置env.gateway即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548873-1-1.html 上篇帖子: 使用Python统计端口TCP连接数 下篇帖子: python高级编程---->深刻理解Python中的元类(metaclass)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表