Fabric实现网关模式文件上传与执行

一 点睛

本实战通过Fabric的env对象定义网关模式,即俗称的中转、堡垒机环境。

定义格式为“env.gateway='192.168.0.105'”,其中 IP“192.168.0.105”为堡垒机IP,再结合任务函数实现目标主机文件上传与执行的操作。

二 代码

#coding=utf-8
#!/usr/bin/env python
from fabric.api import *
from fabric.context_managers import *
from fabric.contrib.console import confirm

env.user='root'
env.gateway='192.168.0.105'                     # 定义堡垒机IP,作为文件上传、执行的中转设备
env.hosts=['192.168.0.101']                     # 目标业务机
# 通过env.passwords字典变量指定各主机的密码
env.passwords = {
    '[email protected]': '12345678',         # 堡垒机账号信息
    '[email protected]': '12345678'

}

lpackpath="/home/test.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():                                 # 执行远程命令
    with cd("/tmp/install"):
        run("tar -zxvf test.tar.gz")
        with cd("data/"):                       # 使用with继续继承/tmp/install目录位置
            run("date")

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

三 运行结果

[root@localhost pymaintain]# fab -f 7_3_5.py go
[192.168.0.101] Executing task 'go'
[192.168.0.101] run: mkdir -p /tmp/install
[192.168.0.101] Login password for 'root':
[192.168.0.101] put: /home/test.tar.gz -> /tmp/install/test.tar.gz
[192.168.0.101] run: tar -zxvf test.tar.gz
[192.168.0.101] out: data/test.txt
[192.168.0.101] out:

[192.168.0.101] run: date
[192.168.0.101] out: Sat Mar  2 11:52:39 CST 2019
[192.168.0.101] out:


Done.
Disconnecting from 192.168.0.105... done.
Disconnecting from 192.168.0.101... done.

四 说明

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

你可能感兴趣的:(python)