Python之——Fabric开发实例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79032776

一、查看本地和远程主机信息

# -*- coding:UTF-8 -*-
'''
查看本地和远程主机信息

本实例调用local()方法执行本地(主控端)命令,添加"@runs_once"修饰符保证该任务函数只执行一次
Created on 2018年1月11日

@author: liuyazhuang
'''
from fabric.api import *

env.user = 'root'
env.hosts = ['192.168.209.121', '192.168.209.122']
env.password = '密码'

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

二、动态获取远程目录列表

# -*- coding:UTF-8 -*-
'''
动态获取远程目录列表

本实例使用@task 修饰符标志入口函数go()对外部可见,配合"@runs_once"修饰符接收用户输入,
最后调用worktask()任务函数实现远程命令执行,
主要实现了一个动态输入远程目录名称,再获取目录列表的功能,由于我们只要求输入一次,再显示所有主机上
该目录的列表信息,调用了一个子函数input_raw()同时配置@runs_once修饰符来达到此目的
Created on 2018年1月11日

@author: liuyazhuang
'''
from fabric.api import *

env.user = "root"
env.hosts = ['192.168.209.121', '192.168.209.122']
env.password = '密码'

#主机遍历过程中,只有第一台触发此函数
@runs_once
def input_raw():
    return prompt("please input dircectory name:" , default="/home")

def worktask(dirname):
    run("ls -l " + dirname)
    
#限定只有go函数对fab命令可见  ,对fab命令可见,执行pip install fabric后,可通过fab go执行任务
@task
def go():
    getdirname = input_raw()
    worktask(getdirname)

三、网关模式文件上传与执行

# -*- coding:UTF-8 -*-
'''
网关模式文件上传与执行

本实例通过Fabric的evn对象定义网关模式,也就是中转、堡垒机环境。定义的格式为:
env.gateway = '192.168.209.121' 其中,IP'192.168.209.121'为堡垒机IP,再结合任务函数实现
目标机文件上传与执行操作。相比paramiko的实现方法简洁了很多,编写的任务函数完全不用考虑堡垒机环境,
配置env.gateway即可。
Created on 2018年1月11日

@author: liuyazhuang
'''
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.user = 'root'
#定义堡垒机IP,作为文件上传、执行的中转设备
env.gateway = '192.168.209.123'
#远程主机列表
env.hosts = ['192.168.209.121', '192.168.209.122']
#假设所有主机的密码都不一样,可以通过env.passwords字典变量一一指定
env.passwords = {
    '[email protected]:22' : '密码1',
    '[email protected]:22' : '密码2',
    '[email protected]:22' : '密码3',
    }

#本地安装包路径
lpackpath = "/home/install/lnmp0.9.tar.gz"
#远程安装包路径
rpackpath = "/tmp/install"

@task      #对fab命令可见,执行pip install fabric后,可通过fab put_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     #对fab命令可见,执行pip install fabric后,可通过fab run_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      #对fab命令可见,执行pip install fabric后,可通过fab go执行任务
def go():   #上传、安装组合
    put_task()
    run_task()

你可能感兴趣的:(Python)