一 点睛
本实战通过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即可。