前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python自动化神奇Fabric

Python自动化神奇Fabric

作者头像
Python研究所
发布2022-06-17 09:11:00
3110
发布2022-06-17 09:11:00
举报
文章被收录于专栏:大飞的部落阁

什么是 Fabric

Fabric 是一款可以实现远程执行命令和完成操作的库,相比 PramikoFabric 更加简洁,高效和易用。它提供了很多开箱即用的功能,可以帮助开发者快速实现自动化任务。

常用的方法

什么是 local 方法

local 方法可以实现在本地执行命令,和 Pythonos.system()作用一样。整体感觉功能强大,使用简单。

Demo-1

demo 实现在本地主机上执行命令查看 hostname

代码语言:javascript
复制
from fabric.api import *

env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']

def exec_local():
    local('hostname')

if __name__ == '__main__':
    import os,sys
    cmd='fab -f {} exec_local'.format(sys.argv[0])
    os.system(cmd)

执行结果:

代码语言:javascript
复制
PS C:\> python test.py
[10.x.x.1] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G
[10.x.x.2] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G

Done.

单次执行

以上,我们可以看到 hostname 的命令执行了两次,因为我们的主机有 2 个。那如果我们想要某个命令只在第一台主机上执行,怎么做呢?Fabric 为我们提供了 runs_once 装饰器来帮我们解决这个问题。

Demo-2

代码:

代码语言:javascript
复制
from fabric.api import *

env.user='root'
env.password='Panyun@123'
env.hosts=['10.135.3.3','10.135.3.22']

@runs_once
def exec_local():
    local('hostname')

if __name__ == '__main__':
    import os,sys
    cmd='fab -f {} exec_local'.format(sys.argv[0])
    os.system(cmd)

执行结果:

代码语言:javascript
复制
PS C:\> python test.py
[10.x.x.1] Executing task 'exec_local'
[localhost] local: hostname
Lenovo-PC-I7-64G

Done.

什么是 run 方法

run 方法可以实现在远端主机执行命令,可以和 paramikoexec_command 实现同样的功能。

Demo-1

demo 实现在远端主机执行 hostname 命令。

代码语言:javascript
复制
from fabric.api import *

env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']

def exec_local():
    local('hostname')

if __name__ == '__main__':
    import os,sys
    cmd='fab -f {} exec_local'.format(sys.argv[0])
    os.system(cmd)

执行结果:

代码语言:javascript
复制
PS C:\> python test.py
[10.x.x.1] Executing task 'exec_local'
[10.x.x.1] run: hostname
[10.x.x.1] out: ubuntu
[10.x.x.1] out:

[10.x.x.2] Executing task 'exec_local'
[10.x.x.2] run: hostname
[10.x.x.2] out: centos
[10.x.x.2] out:


Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.

什么是 put 方法

put 方法可以实现将本地文件上传的远端的功能。

Demo-1

demo 实现将本地主机的文件上传到远端主机。

代码语言:javascript
复制
from fabric.api import *

env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']

def put_file():
    put('empty.ok','/home/ok.empty')

if __name__ == '__main__':
    import os,sys
    cmd='fab -f {} put_file'.format(sys.argv[0])
    os.system(cmd)

执行结果:

代码语言:javascript
复制
PS C:\> python test.py
[10.x.x.1] Executing task 'put_file'
[10.x.x.1] put: empty.ok -> /home/ok.empty
[10.x.x.2] Executing task 'put_file'
[10.x.x.2] put: empty.ok -> /home/ok.empty

Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.

查看上传到远端主机的文件:

什么是 prompt 方法

prompt 方法可以获取用户输入,从而实现动态参数注入、交互式输入等功能。

Demo-1

demo 实现在远端主机执行 echo 命令,根据用户输入而输出。

代码语言:javascript
复制
from fabric.api import *

env.user='root'
env.password='pwd@123'
env.hosts=['10.x.x.1','10.x.x.2']

def exec_local():
    local('hostname')

def echo_some():
    msg=prompt('Please input msg:')
    run('hostname && echo {}'.format(msg))

if __name__ == '__main__':
    import os,sys
    cmd='fab -f {} echo_some'.format(sys.argv[0])
    os.system(cmd)

执行结果:

代码语言:javascript
复制
PS C:\> python test.py
[10.x.x.1] Executing task 'echo_some'
Please input msg: phyger
[10.x.x.1] run: hostname && echo phyger
[10.x.x.1] out: ubuntu
[10.x.x.1] out: phyger
[10.x.x.1] out:

[10.x.x.2] Executing task 'echo_some'
Please input msg: niubi
[10.x.x.2] run: hostname && echo niubi
[10.x.x.2] out: centos
[10.x.x.2] out: niubi
[10.x.x.2] out:


Done.
Disconnecting from 10.x.x.1... done.
Disconnecting from 10.x.x.2... done.

更多内容请移步Fabric官网。

https://fabric-chs.readthedocs.io/zh_CN/chs/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是 Fabric
  • 常用的方法
    • 什么是 local 方法
      • Demo-1
      • 单次执行
      • Demo-2
    • 什么是 run 方法
      • Demo-1
    • 什么是 put 方法
      • Demo-1
    • 什么是 prompt 方法
      • Demo-1
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档